使用图(graphs)表示计算任务,图(graphs)中节点称为op(operation),一个op获得0个或者多个tensor执行计算,产生0个或者多个tensor计算结果,图(graphs)在会话(Session)中执行。使用tensor表示数据,tensor是一个n维数组或列表,使用变量(Variable维护状态),使用feed和fetch为任意操作赋值和从中读取数据。
1.创建图,启动图
import tensorflow as tf
#创建图,启动图
m1=tf.constant([[3,3]]) #创建一个常量op
m2=tf.constant([[2],[3]])
product=tf.matmul(m1,m2) #创建一个矩阵乘法op,传入m1,m2
#print(product)
#输出: Tensor("MatMul:0", shape=(1, 1), dtype=int32) 一个1*1的张量
#sess=tf.Session() #定义一个会话,启动默认图
#result=sess.run(product) #调用sess的run方法执行矩阵乘法op,run(product)触发图中3个op
#print(result)
#sess.close() #关闭会话
with tf.Session() as sess: #【简洁方法】定义一个会话,启动默认图
result=sess.run(product) #调用sess的run方法执行矩阵乘法op,run(product)触发图中3个op
print(result) #做完自动sess.close() #关闭会话
2.变量的使用
x=tf.Variable([1,2]) #定义变量,变量要先初始化才能run
a=tf.constant([3,3]) #定义常量
sub=tf.subtract(x,a) #定义减法op
add=tf.add(x,sub) #定义加法op
init=tf.global_variables_initializer() #初始化全局的变量,注意init的位置在所有变量最后面
with tf.Session() as sess:
sess.run(init) #变量初始化
print(sess.run(sub))
print(sess.run(add))
3.赋值操作
state=tf.Variable(0,name='counter') # 创建一个变量初始化为0,起名字'counter'
new_value=tf.add(state,1) #创建一个变量,给state加1
update=tf.assign(state,new_value) #赋值op,new_value赋值给state
init=tf.global_variables_initializer() #初始化全局的变量,注意init的位置在所有变量最后面
with tf.Session() as sess:
sess.run(init) #变量初始化
print(sess.run(state))
for _ in range(5):
sess.run(update)
print(sess.run(state))
4.Fetch 运行多个op
input1=tf.constant(3.0)
input2=tf.constant(2.0)
input3=tf.constant(5.0)
add=tf.add(input2,input3)
mul=tf.multiply(add,input1)
with tf.Session() as sess:
result=sess.run([mul,add]) #运行多个op
print(result)
5.Feed 以字典形式传入数据
input11=tf.placeholder(tf.float32) #创建占位符
input22=tf.placeholder(tf.float32) #创建占位符
output=tf.multiply(input11,input22)
with tf.Session() as sess:
#feed的数据以字典形式传入(feed_dict)
print(sess.run(output,feed_dict={input11:[7.0],input22:[2.0]})) #给input11和input22赋值
6.案例:逼近线性模型
import tensorflow as tf
import numpy as np
#使用numpy生成100随机点样本
x_data=np.random.rand(100)
y_data=x_data*0.1+0.2
#构造一个线性模型,逼近y_data模型
b=tf.Variable(0.)
k=tf.Variable(0.)
y=k*x_data+b #y预测值,优化k和b
#二次代价函数
loss=tf.reduce_mean(tf.square(y_data-y)) #求(y_data-y)*(y_data-y)的平均值
#定义一个梯度下降来进行训练优化
optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.2)
#训练目标:最小化代价函数
train=optimizer.minimize(loss) #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次迭代打印一次step,k,b
print(step,sess.run([k,b]))
运行结果:k逼近了0.1,b逼近了0.2
0 [0.051297005, 0.099384934]
20 [0.10157491, 0.19918564]
40 [0.10094823, 0.19950975]
60 [0.10057089, 0.19970484]
80 [0.10034371, 0.19982231]
100 [0.10020693, 0.19989301]
120 [0.10012457, 0.1999356]
140 [0.100075, 0.19996123]
160 [0.10004514, 0.19997665]
180 [0.10002718, 0.19998595]
200 [0.10001637, 0.19999154]