深度学习神经网络 卷积神经网络 第二节,构建前向传播函数(二)

先写一个函数名:

# 定义前向传播的过程
def forward(x, train, regularizer):

在这个大函数里我们要把前向传播的网络结构搭建好。

x是输入数据,train表示是否是训练还是测试,因为我们训练和测试都在使用同样的前向传播结构。

train如果是TRUE,就是训练,如果是FALSE,就说明是用来测试。

我们定义第一层网络结构,这是一个卷积层,卷积的结构由前面定义的函数的变量来生成。这里是定义了5*5的卷积核,共32个这样的卷积核,图像的通道数为1 (黑白图像)。在卷积层定义一个偏置,然后卷积加入计算图。之后把偏置加入到卷积结果中,并用relu函数激活,然后进行2*2的最大值池化。

    # 实现第一层卷积层的前向传播过程
    conv1_w = get_weight([CONV1_SIZE, CONV1_SIZE, NUM_CHANNELS, CONV1_KERNEL_NUM],
                         regularizer)  # 初始化卷积核
    conv1_b = get_bias([CONV1_KERNEL_NUM])  # 初始化偏置项
    conv1 = conv2d(x, conv1_w)  # 实现卷积运算
    relu1 = tf.nn.relu(tf.nn.bias_add(conv1, conv1_b))  # 对卷积后的输出添加偏置,并过 relu 非线性激活函数
    pool1 = max_pool_2x2(relu1)  # 将激活后的输出进行最大池化

第二个神经网络就是把第一层的网络输出结果输入到第二层上,然后输出激活池化:

    # 实现第二层卷积层的前向传播过程,并初始化卷积层的对应变量
    conv2_w = get_weight([CONV2_SIZE, CONV2_SIZE, CONV1_KERNEL_NUM,
                      CONV2_KERNEL_NUM], regularizer)  # 该层每个卷积核的通道数要与上一层卷积核的个数一致
    conv2_b = get_bias([CONV2_KERNEL_NUM])
    conv2 = conv2d(pool1, conv2_w)  # 该层的输入就是上一层的输出 pool1
    relu2 = tf.nn.relu(tf.nn.bias_add(conv2, conv2_b))
    pool2 = max_pool_2x2(relu2)

现在我们的数据是三维的,因为除了batch以外还有长宽,深度:第一个卷积后的结果有32个(卷积核数),第二个卷积后的结果有64个(第二层卷积核数),然后深度表示每层的图像卷积后的像素数。

通过reshape函数把这些量根据每个BATCH大小进行拉伸,拉成一个矩阵。

    # 将上一池化层的输出 pool2(矩阵)转化为下一层全连接层的输入格式(向量)
    pool_shape = pool2.get_shape().as_list()  # 得到pool2输出矩阵的维度,并存入list中,注意pool_shape[0]是一个batch的值
    nodes = pool_shape[1] * pool_shape[2] * pool_shape[3]  # 从 list 中依次取出矩阵的长宽及深度,并求三者的乘积就得到矩阵被拉长后的长度
    reshaped = tf.reshape(pool2, [pool_shape[0], nodes])  # 将 pool2 转换为一个 batch 的向量再传入后续的全连接

然后构建全连接层第一层的网络模型:输入节点数为上面算的nodes,输出为第二层网络节点数

    # 实现第三层全连接层的前向传播过程
    fc1_w = get_weight([nodes, FC_SIZE], regularizer)  # 初始化全连接层的权重,并加入正则化
    fc1_b = get_bias([FC_SIZE])  # 初始化全连接层的偏置项
    fc1 = tf.nn.relu(tf.matmul(reshaped, fc1_w) + fc1_b)

如果是训练的话就采用dropout函数:

    # 如果是训练阶段,则对该层输出使用 dropout,也就是随机的将该层输出中的一半神经元置为无效,是为了避免过拟合而设置的,一般只在全连接层中使用
    if train: fc1 = tf.nn.dropout(fc1, 0.5)

然后就是实现最后一层,并输出:

    # 实现第四层全连接层的前向传播过程,并初始化全连接层对应的变量
    fc2_w = get_weight([FC_SIZE, OUTPUT_NODE], regularizer)
    fc2_b = get_bias([OUTPUT_NODE])
    y = tf.matmul(fc1, fc2_w) + fc2_b
    return y

至此,前向传播的网络结构就搭建完毕了。

接下来写后向传播的网络结构。

发布了132 篇原创文章 · 获赞 167 · 访问量 7111

猜你喜欢

转载自blog.csdn.net/tiao_god/article/details/104650742