TensorFlow一个非常好的网站:
https://www.tensorflow.org/get_started/mnist/pros
(里面从mnist字体库的学习开始)
网站中也包括了tensorflow的方方面面,包括各种API等。
——————————————————————————————————
tensorflow中优化器:https://www.tensorflow.org/api_guides/python/train#optimizers
当然其中最常用的还是梯度下降
关于各种优化算法的一个博客:http://blog.youkuaiyun.com/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.youkuaiyun.com/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
————————————————————————————————————————————