关于CIFAR10程序的一些经验总结
在卷积层和全连接层中,设置权重和偏置时,推荐使用tf.get_variable()
函数,好处是参数可重复使用,减小内存的占用,而且如果是导入别人的参数进行训练时,必须使用tf.get_variable()
。
为了用tensorboard
画出图来,在给每一层命名时,通常采用with tf.variable_scope('名字') as scope
,
tf.name_scope,区别在于:tf.variable_scope
在每个参数前加一个前缀,使得参数独一无二,故与tf.get_variable()
搭配使用,取得很好地效果;tf.name_scope
没有在参数前加前缀,一般用于节点处的命名。
在对权重初始化时,使用初始化函数tf.contrib.layers.xavier_initialize()
比较好,默认采用均值初始化,还有可选参数,可根据需要进行设置。常用的还有tf.truncated_normal_initializer(有参数)
;对偏置初始化一般采用tf.constant_initializer(有参数)
。
批量输入图片时,要对图片进行归一化tf.nn.batch_normalization()
,原理为:
γ ( x − μ ) σ + β
归一化输入向量在机器学习中是一个通用的方法,如果不归一化将导致结果会严重被具有大方差的特征和不同的尺度影响。归一化输入能够帮助数值最优方法(例如,梯度下降法)更快,更准确地收敛。
卷积核的大小使用3x3会比较好,但是得视电脑性能而定,batch_size同样也是。
计算loss时,若使用tf.nn.softmax_ceoss_entrocy_with_logits()
,则必须进行one_hot,(但是使用这种方法时,在我的电脑上导致tf.nn.in_top_k()
函数使用出错);另一种方法是使用tf.nn.sparse_softmax_cross_entropy_with_logits()
,方便,效果也不错。