1.防止dead neuron 因为ReLU的原因,所以要避免dead neuron和0梯度。对权重使用截断的正态分布噪声,对偏置增加一些小的正值。 # weight initail = tf.truncated_nomal(shape, stddev = 0.1) # bias initial = t
1.防止dead neuron
因为ReLU的原因,所以要避免dead neuron和0梯度。对权重使用截断的正态分布噪声,对偏置增加一些小的正值。
initail = tf.truncated_nomal(shape, stddev = 0.1)
# bias
initial = tf.constant(0.1, shape=shape)
2.2维卷积函数
卷积核的数量就代表了这个卷积层可以提取多少类的特征。
# W是卷积的参数,如[5,5,1,32].大小5*5,chanel是1,个数32
3.最大池化函数
tf.nn.max_pool(x, ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')# 2*2最大pooling,strides这里是横竖两个方向以2为步长
4.变形函数
tf.reshape(x, [-1,28,28,1])# 由于卷积神经网络会利用到空间结构信息,需要将1D的输入向量转为2D的图片结构,-1代表样本数量不固定# 尺寸是7*7*64,转化成为1D向量
tf.reshape(h_pool2, [-1,7*7*64])
在使用FC层之前,需要将卷积层的输出结果全部flatten,使用tf.reshape函数将每个样本都变成一维向量。
reshape = tf.reshape(pool2, [batch_size, -1])# 然后,用get_shape函数获取数据扁平化后的长度
dim = reshape.get_shape()[1].value
因为希望全连接层不要过拟合,因此设置了一个非0的weight loss(在FC层之前,这个值为0),让这一层所有的参数都被L2正则化所约束
weight3 = variable_with_weight_loss(shape=[dim,384], stddev = 0.04, w1 = 0.004)5.dropout层
tf.nn.dropout(h_fc1, keep_prob)6.对weight进行L2正则化
def variable_with_weight_loss(shape, stddev, w1):var = tf.Variable(tf.truncated_normal(shape, stddev = stddev))
if w1 is not None:
# 把weight loss统一存到名为“losses”的collection中,在计算神经网络的总体loss时被用上
weight_loss = tf.multiply(tf.nn.l2_loss(var),w1,name="weight_loss")
tf.add_to_collection('losses',weight_loss)
return
7.Alex LRN
LRN对ReLU这种没有上界的激活函数会比较有用,因为它会从附近的多个卷积核的响应中挑选比较大的反馈。
8.将softmax的计算和cross entropy loss的计算合起来
logits = tf.add(tf.matmul(local4, weight5), bias5)cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits = logits, labels = labels, name = 'cross_entropy_per_example')
cross_entropy_mean = tf.reduce_mean(cross_entropy, name = 'cross_entropy')
tf.add_to_collection('losses', cross_entropy_mean)
# 将整体losses的collection中的全部loss求和,得到最终的loss,其中包括cross entropy loss,还有weight的L2 loss
loss = tf.add_n(tf.get_collection('losses'), name = 'total_loss')
10.启动线程
# 做数据增强,需要启动线程来加速tf.train.start_queue_runners()
前面的卷积层主要做特征提取的工作,全连接层才开始对特征进行组合匹配,并进行分类。