TensorFlow学习

来源:互联网 发布:linux cp强制覆盖文件 编辑:程序博客网 时间:2024/05/16 09:26

TensorFlow一个非常好的网站:

https://www.tensorflow.org/get_started/mnist/pros

(里面从mnist字体库的学习开始)

网站中也包括了tensorflow的方方面面,包括各种API等。

——————————————————————————————————

tensorflow中优化器:https://www.tensorflow.org/api_guides/python/train#optimizers

当然其中最常用的还是梯度下降

关于各种优化算法的一个博客:http://blog.csdn.net/luo123n/article/details/48239963

另一个博客:http://www.cnblogs.com/ranjiewen/p/5938944.html

另一个博客:https://zhuanlan.zhihu.com/p/20447450?columnSlug=dataman

关于分类器的研究进展及各种文章、效果的一个网址(强烈推荐):

http://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html

——————————————————————————————————

tensorflow中conv2d函数中的strides参数的解释:

http://blog.csdn.net/lanchunhui/article/details/61615714

strides参数确定了滑动窗口在各个维度上移动的步数。一种常用的经典设置就是要求,strides[0]=strides[3]=1。

strides[0] = 1,也即在 batch 维度上的移动为 1,也就是不跳过任何一个样本,否则当初也不该把它们作为输入(input)
strides[3] = 1,也即在 channels 维度上的移动为 1,也就是不跳过任何一个颜色通道

——————————————————————————————————

卷积相乘的操作:

W_conv1 = weight_variable([5, 5, 1, 32])     #这里为卷积层的W权重,前两个表示卷积核大小,第三维为输入的通道,第四维为输出通道
b_conv1 = bias_variable([32])     #这里为卷积层的偏置
x_image = tf.reshape(x, [-1, 28, 28, 1])    #这里为输入的图片,这里假设第一维度为1,即只有一张图片,最后一个维度为1,为一个通道
def conv2d(x, W):  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)

这里卷积完的结果的维度为[1,28,28,32],这里经过了padding填充,输入输出大小不变。

结果就是一个28*28的图片最后生成了28*28*32的大小(pooling之前),如果在其后面直接添加全连接层,则W的输入维度为28*28*32。

tf中有线程的dropout函数可以使用:

keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

其中第二个参数表示是否mask(屏蔽):在训练时开启,在预测时屏蔽。

————————————————————————————————————————————

一个以前经常困扰的问题:根据梯度更新参数时,二者的单位统一,这就导致在更新时“强制性随机”,导致算法不稳定。

常用的SGD,Momentum算法都有这个问题,而Adadelta算法则将单位进行了统一,因此算法很稳定,很常用。

更有效得到稀疏模型的算法:SGD->FOBOS->RDA->FTRL算法

(通过结合之前步骤计算得到的梯度,构造关于W的最优化方程,从而尽量得到稀疏解)

RDA算法与FOBOS算法:http://www.cnblogs.com/luctw/p/4757943.html

FTRL算法:http://luowei828.blog.163.com/blog/static/310312042015112114923537/

RDA算法的论文:Dual Averaging Methods for Regularized Stochastic Learning and Online Optimization

论文中的推导部分主要看appendix A。

RDA的思想:当某个维度上累计梯度的平均值的绝对值小于某个设定的值得时候,将该维度上的权值设为0,这就保证了稀疏性质,

相较于fobos算法,它利用了之前所有求出来的梯度,而fobos只是根据上一次的梯度得到。

两者的意思都可表述为:当梯度的变化非常小时,就将权值设为0。

论文中的推导也为L1范数的约束求解带来了新方法(即将所有维度分解成单一维度来求解)

————————————————————————————————————————————

tensorflow中有现成的一些模型可以使用,在tf.contrib.learn中,如现成的DNNClassifier,使用它,可以只需要设定好输入特征的数目、

隐藏层神经元的个数的vector、输出特征的数目、模型存放地址即可进行训练。

DNNClassifier分类花卉的例子:https://www.tensorflow.org/get_started/tflearn

在使用tf.contrib.learn训练过程中,整个过程都是由tensorflow自己控制的,正常情况下,训练过程中的参数无法看到,

只能看到最后的结果。实际上tensorflow在tf.contrib.learn中提供了日志机制,通过在程序头部设置打印日志,即可输出相应日志:

tf.logging.set_verbosity(tf.logging.INFO)
这个配置配置为INFO,而tf默认为WARN。

同样,也可以在训练过程中添加监控,可以设定在训练过程中输出过程中的参数,也可以设置验证集,如训练多长时间验证。

————————————————————————————————————————————

关于tensorflow的版本的更新与安装在https://www.tensorflow.org/versions/上也有详细说明。

由于tensorflow更新过快,旧版本的代码不一定被高版本兼容,因此有时需要更新tensorflow

————————————————————————————————————————————

原创粉丝点击