会话提供了估算张量和执行操作的运行环境,它是发送计算任务的客户端,所有计算任务都由它连接的执行引擎完成 一个典型的会话流程分成三步:
1 创建会话 sess = tf.Session(target=...,graph=...,config=...) target 会话连接执行的引擎 graph 会话加载的数据流图 config 会话启动时的配置项
2 估算张量或者执行会话 sess.run(...)
3 关闭会话 sess.close()
#创建数据流图
x = tf.placeholder(tf.float32,name='x')
y = tf.placeholder(tf.float32,name='y')
z = tf.multiply(x,y,name='z')
#创建会话
sess = tf.Session()
#执行操作
print(sess.run(z,feed_dict={x:3.0,y:2.0}))
6.0
x = tf.placeholder(tf.float32)
w = tf.Variable(1.0)
b = tf.Variable(2.0)
y = w*x + b
with tf.Session() as sess:
tf.global_variables_initializer().run() #operation.run 执行操作
fetch = y.eval(feed_dict={x:3.0})#Tensor.eval 估算张量
print(fetch)
5.0
Tensorflow 会话执行原理
当我们调用sess.run(train_op)语句执行训练操作是:
首先,程序内部提取操作依赖所有前置操作,这些操作的节点共同组成一副子图,
然后,程序会将子图中的计算节点,存储节点和数据节点按照各自的执行设备分类,相同设备上的节点组成局部的图,
最后,每个设备上的局部图在实际执行时,根据节点间的依赖关系将各个节点有序的加载到设备上执行。
Tensorflow 会话本地执行
对于单机程序来说,相同机器上的不同编号的CPU或者GPU就是不同的设备,我们可以在创建节点时指定执行该节点的设备
with tf.device("/cpu:0"):
v = tf.Variable(...)
with tf.device("/gpu:0"):
z = tf.matmul(x,y)
损失函数:评估特定模型参数和特定输入时,表达模型输出的推理值与真实值之间的不一致程度的函数。
使用损失函数对所有训练样本求损失值,再累加求平均可得到模型经验风险。
如果过度的追求训练数据上的低损失值,就会遇到拟合问题。训练集通常并不能完全代表真是场景的数据分布。
当两者的分布不一致的时,如果过分依赖训练集数据,面对新数据时就会无所适从,这时模型的泛化能力就会变差。
训练模型的目标是不断最小化经验风险,随着训练步数的增加,经验风险将逐渐降低,模型复杂度也逐渐上升。
为了降低过度训练造成的过拟合风险,可以引入专门用来度量模型复杂度的正则化项或者惩罚项。
常用的正则化项有L0,L1,L2范数,因此我们将模型最优化的目标替换为鲁棒性更好的结构风险最小化。
在模型训练过程中,结构风险不断地下降,当小于我们设置的损失值阈值时,则认为此时的模型已经满足需求。
因此,模型训练的本质就是在最小化结构风险的同时取得最优的模型参数。
优化算法;典型的机器学习和深度学习问题通常都需要转换为最优化问题求解。
求解最优化问题的算法称为优化算法,它们通常采用迭代方式实现,
首先设定一个初始化的可行解,然后基于特定的函数反复重新计算可行解,直到找到了一个最优解
或者达到了预设的收敛条件,有的使用目标函数为一阶导数,如梯度下降法(下山最陡的方向)
二阶导数,如牛顿法,前几轮迭代的信息,如Adam
Tensorflow的训练机制
典型的深度学习和机器学习问题,包含三个部分:
1.模型:y=f(x)=wx+b;x是输入数据,y是模型输出的推理值,w和b是模型参数,就是用户训练的对象
2.损失函数:loss=L(y,y_),y_是对应x的真实值(标签),loss为损失函数输出的损失值。
3.优化算法:w<-w+a*grad(w),b<-b+a*grad(b),其中grad(w)和grad(d)分别是w和d的各自梯度值,a为学习率
Tensorflow优化器
优化器是实现优化算法的载体
一次典型的迭代优化分为以下三步:
1.计算梯度:调用computer_gradients;
2.处理梯度:用户按照自己的需求处理梯度值,如梯度裁剪和梯度加权
3.应用梯度:调用apply_gradients方法,将处理后的梯度值应用到模型参数