因为反向传播和前面差不多,这里只说一下需要改的地方(毕竟反向传播是依赖于已经构建好的前向传播计算图,设计比较简单)
第一个地方是输入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})
方法和步骤其实并没有改变多少,就是把以前喂给全参数网络的数据现在改为了喂给卷积神经网络。