深度学习神经网络 卷积神经网络 第三节,构建反向传播函数

因为反向传播和前面差不多,这里只说一下需要改的地方(毕竟反向传播是依赖于已经构建好的前向传播计算图,设计比较简单)

第一个地方是输入x的维度,这里的占位需要用卷积输入的格式:

    # x, y_是定义的占位符,需要指定参数的类型,维度(要和网络的输入与输出维度一致),类似于函数的形参,运行时必须传入值
    x = tf.placeholder(tf.float32, [
        BATCH_SIZE,
        mnist_lenet5_forward.IMAGE_SIZE,
        mnist_lenet5_forward.IMAGE_SIZE,
        mnist_lenet5_forward.NUM_CHANNELS])

如果对上面的几行代码感觉印象有些模糊,我们回到之前定义卷积函数的代码:

# 定义卷积计算函数
def conv2d(x, w):
    #x: 一个输入 batch [batch , 分辨率 , 分辨率 , 通道数]
    return tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME')

这样就明白了:x是一个输入参数格式。

然后我们还要在每一轮的训练中把输入x改变一下,使用如下函数:

xs, ys = mnist.train.next_batch(BATCH_SIZE)  # 读取一个 batch 的数据
reshaped_xs = np.reshape(xs, (  # 将输入数据 xs 转换成与网络输入相同形状的矩阵
            BATCH_SIZE,
            mnist_lenet5_forward.IMAGE_SIZE,
            mnist_lenet5_forward.IMAGE_SIZE,
            mnist_lenet5_forward.NUM_CHANNELS))

把输入数据改变一下维度,变成输入的形式。

然后喂入神经网络:

            # 喂入训练图像和标签,开始训练
            _, loss_value, step = sess.run([train_op, loss, global_step], feed_dict={x: reshaped_xs,
                                                                 y_: ys})

方法和步骤其实并没有改变多少,就是把以前喂给全参数网络的数据现在改为了喂给卷积神经网络。

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

猜你喜欢

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