Tensorflow1.x 系列为个人入门Tensorflow1的简要笔记,最近学习的论文涉及到了bilevel program和hypergradient的求解,对应的代码基于Tensorflow1实现,因此根据视频教程学习了解一下Tensorflow。
- 视频课程链接:https://www.bilibili.com/video/BV1wJ411T77b?p=15
- 跟着视频课自己写的代码,使用Colab(https://colab.research.google.com/)
- tips:不同版本的Tensorflow的一些函数用法不一样
包括内容:
# 使用1.x版本的tensorflow
%tensorflow_version 1.x # 这是colab中设置tensorflow版本的方法
import tensorflow as tf
# 定义常量
m1 = tf.constant([[3,3]]) # 1行2列的矩阵
m2 = tf.constant([[2],[3]]) # 2行1列的矩阵
product = tf.matmul(m1, m2) # 定义矩阵的乘法
print(product)
| 这里的product:Tensor(“MatMul:0”, shape=(1, 1), dtype=int32)
# 定义会话,启动默认的图
sess = tf.Session()
result = sess.run(product) # 触发调用product-->调用矩阵乘法-->生成m1和m2
print(result)
sess.close() # 关闭会话,释放资源
| 在会话中通过run()方法的调用会触发矩阵乘法,计算输出:[[15]]
# 使用with..as定启动图,这种方法比较常用
with tf.Session() as sess:
result = sess.run(product) # 触发调用product-->调用矩阵乘法-->生成m1和m2
print(result)
# 整理,关于tensorflow中定义常量的函数
"""tf.constant(value, dtype=None, shape=None, name='Const', verify_shape=False)
value可以是常数或者列表
"""
ten1 = tf.constant([1, 2, 3, 4, 5]) # 定义1-D Tensor
# 当给定的value尺寸小于shape定义的尺寸时,使用value最后一个元素填充
ten2 = tf.constant([1, 2], shape=[2,3]) # [[1 2 2], [2 2 2]]
with tf.Session() as sess:
result = sess.run(ten2)
print(result)
| 输出:
[[1 2 3]
[3 3 3]]
内容:
# 使用1.x版本的tensorflow
%tensorflow_version 1.x
import tensorflow as tf
x = tf.Variable([1,2])
a = tf.constant([3,3])
sub = tf.subtract(x, a) # 减法 sub=x-a
add = tf.add(x, sub) # 加法 x+sub
# 全局变量初始化的operation
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init) # 首先对变量初始化
print(sess.run(sub))
print(sess.run(add))
| 在会话中调用减法和加法的operation,触发相应的计算并输出结果:
[-2 -1]
[-1 1]
# 实现变量自增
state = tf.Variable(0, name='counter')
new_value = tf.add(state, 1) # 加法运算,使得变量加1
update = tf.assign(state, new_value) # 赋值运算,第二个参数的值赋值给第一个参数
init = tf.global_variables_initializer() # 定义全局变量的初始化opeartion
with tf.Session() as sess:
sess.run(init) # 变量初始化
print(sess.run(state))
for _ in range(5):
sess.run(update) # 调用赋值运算
print(sess.run(state))
| 输出结果:
0
1
2
3
4
5
# feed
# 使用tf.placeholder为张量创建一个占位符,其值必须使用feed_dict传入
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1, input2) # 与上个例子不同,这里的input1和2不是确定的
with tf.Session() as sess:
# input1和input2的值通过feed_dict以字典的形式传入
# 传入不同的参数,将返回不同的output的值
print(sess.run(output, feed_dict={input1:7, input2:2}))
| 输出结果:
14.0
# 使用1.x版本的tensorflow
%tensorflow_version 1.x
import tensorflow as tf
# Fetch:在会话中同时执行多个operation
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
add = tf.add(input2, input3)
mul = tf.multiply(input1, add) # element-wise
with tf.Session() as sess:
result = sess.run([mul, add]) # 同时执行乘法和加法运算
print(result)
| 输出结果:
[21.0, 7.0]
# 使用1.x版本的tensorflow
%tensorflow_version 1.x
import tensorflow as tf
import numpy as np
# 定义一条直线,y=0.1x+0.2
x_data = np.random.rand(100) # 生成100个随机点
y_data = x_data * 0.1 + 0.2
# 定义线性模型,y=kx+b
k = tf.Variable(0.) # 定义变量k,初始值为0
b = tf.Variable(0.)
y = k * x_data + b
# 优化k和b使得线性模型接近直线
loss = tf.reduce_mean(tf.square(y_data - y)) # 定义loss=(y_data-y)^2
optimizer = tf.train.GradientDescentOptimizer(0.2) # 定义优化器为梯度下降,学习率为0.2
train = optimizer.minimize(loss) # 梯度下降减小损失函数:计算一次梯度、更新一次参数
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for step in range(201):
sess.run(train)
if step % 20 == 0: # 每20次迭代打印k和b
print(step, sess.run([k, b]))