当前位置 : 主页 > 编程语言 > java >

Tensorflow实战-卷积神经网络

来源:互联网 收集:自由互联 发布时间:2022-10-15
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梯度。对权重使用截断的正态分布噪声,对偏置增加一些小的正值。

# weight
initail = tf.truncated_nomal(shape, stddev = 0.1)
# bias
initial = tf.constant(0.1, shape=shape)

2.2维卷积函数
卷积核的数量就代表了这个卷积层可以提取多少类的特征。

tf.nn.conv2d(x,W,strides=[1,1,1,1], padding='SAME')
# 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这种没有上界的激活函数会比较有用,因为它会从附近的多个卷积核的响应中挑选比较大的反馈。

tf.nn.lrn(pool1, 4, bias = 1.0, alpha = 0.001/9.0, beta =0.75)

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')
  • 求top1,得分最高的那一类的准确率
  • top_k_op = tf.nn.in_top_k(logits, label_holder,1)

    10.启动线程

    # 做数据增强,需要启动线程来加速
    tf.train.start_queue_runners()

    前面的卷积层主要做特征提取的工作,全连接层才开始对特征进行组合匹配,并进行分类。


    上一篇:Tensorflow实战-经典卷积神经网络
    下一篇:没有了
    网友评论