线性回归和逻辑回归
之前已经在cs231n的笔记中介绍过基本的线性回归和逻辑回归模型,现在需要用tensorflow实现。
线性回归
代码
如何判断一个模型是正确的?
使用相关系数R的平方
在测试集上运行
用虚拟数据测试模型
部分代码分析
|
|
有两个疑问?
1、为什么train_op在tf.Session.run()的提取列表中?
2、Tensorflow怎么知道要更新哪些变量?
实际上,我们可以将任何Tensorflow的操作作为tf.Session.run()的提取变量。Tensorflow会执行计算图中这些操作所依赖的部分。在以上例子中,train_op的目的是使loss最小,而loss依赖于w和b的值。
从图中可以看出,节点GrandientDescentOptimizer依赖于节点weights,bias和gradients。
优化
GradientDescentOptimizer意味着我们的更新策略是梯度下降。Tensorflow已经为我们做了自动微分,然后更新w和b的值使得loss最小。默认情况下,optimizer训练目标函数所依赖的变量中的所有可训练变量,如果这里面有一些你不想训练的变量,可以将在定义参数时其参数trainable设置为False。一个具体的例子是变量global_step,这个变量是用来记录你运行模型多少次数的变量,其不应该为可训练的。
tf.Variable的完整定义是:
我们甚至可以让optimizer计算特定变量的梯度,也可以修改由optimizer计算出的梯度。
如下所示是一些例子:
更多关于梯度计算
优化器类会自动计算graph的梯度,但创建新的优化器或专家用户可以调用下面的低级函数。
当只训练一个模型的一个部分时,这种方法很有用。例如我们可以使用tf.gradient()计算中间层loss的梯度G,然后我们使用优化器来最小化中间层输出M和M + G之间的差异,
只更新网络的下半部分。
优化器种类
各种优化器的比较
cs231n的笔记中有介绍。也可参考:
Optimizing Gradient Descent
逻辑回归
用逻辑回归解决MNIST字符识别的一个例子