两层CNN神经网络实现MNIST的分类
version 1:和之前的神经网络训练MNIST数据集实现分类,整体过程差不多,只不过将计算换成卷积
version 2 :相比 version 1多了 权重和卷积结果的图像可视化
整个网络框架:image —>conv1(32 kernels) —>max pool1 —>conv2 (64 kernels) —>max pool2
—>fc1 —>fc2 —>classifier
Version 1
version 1和之前的神经网络训练MNIST数据集实现分类,整体过程差不多,只不过将计算换成卷积
1. 训练
可以看到loss的值是有震荡的,所以超参数的选取需要改,我估计还是学习率
2. 测试
3. 代码解读
1) conv2d
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
input的shape:[batch, in_height, in_width, in_channels]
filter的shape:[filter_height, filter_width, in_channels, out_channels]
strides=[1,x,y,1] strides[0]和strides[3]默认值是1,中间两个表示在x方向移动的步数,y方向移动的步数
2) max_pool
tf.nn.max_pool(value, ksize, strides, padding, name=None)
value的shape:[batch, in_height, in_width, in_channels]
ksize的shape:池化窗口的大小,[1, height, width, 1],因为不想在batch和channels上做池化,所以这两个维度设为了1
strides=[1,x,y,1] strides[0]和strides[3]默认值是1,中间两个表示在x方向移动的步数,y方向移动的步数
(一般strides=[1,2,2,1])
3)dropout
dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
x:输入用于训练的数据
keep_prob:神经元保留概率
(需要对随机失活做scaling 缩放: l /= keep_prob 这一步很重要 )
关于 keep_prob 需要注意
只有训练的时候 keep_prob <1 才进行 dropout
1 | sess.run(train,feed_dict ={x_input:x_train_batch, y_input:y_train_batch, keep_prob:0.8}, options = run_options,run_metadata = run_metadata) |
1 | sess.run(loss_cross_entropy,feed_dict = {x_input:x_train_batch, y_input:y_train_batch, keep_prob:1.0},options=run_options,run_metadata=run_metadata) |
4. tensorboard
1) 计算图
2)scalar
可以看出震荡还是蛮大的,是超参数没设置好
PS:相比version 1多了 权重和卷积结果的图像可视化
想做卷积层输出结果的图像输出,查了很多资料,总算找到了一个合适的,在此基础上做了些修改
感觉是个很低调的大神分享的代码,GitHub :https://github.com/grishasergei/conviz
权值可视化那部分改了很久,一直都报错,差点放弃了,还好坚持print了几个变量的shape,果然我还是对各数据的结构掌握不全,最后做出来的那一刻,真的开心到尖叫,旋转,跳跃,也很感谢大神的分享
1. 训练
和version 1 一样,losss值震荡,等把几个经典网络学完,就得开始试着自己调参,分析结果,调参……
2. 测试
与大神分享的代码相比,在权值可视化那部分改动很大,主要是conv_weight[] 这个量在原代码里那样用会在shape上出现错误,所以就改成下面这种
3. 修改
x_ = tf.reshape(x_, tf.pack([-1, n]))
改为x_ = tf.reshape(x_, tf.stack([-1, n]))
while step * batch_size < training_iters
改为for step in range(1,1001)
- 增加了保存模型的那部分Saver
- session部分的权值可视化
4. 权值可视化
1) conv1
输入数据的厚度为1,32个滤波器
2) conv2
输入数据的厚度为32,64个滤波器
PS:写博客的时候我看这个图是有点晕的,有点一下子转不过弯,这里说明一下图
每个滤波器的大小5*5
conv1:总共有32个滤波器,滤波器的通道数为1,所以所有滤波器(32)放在一张图上
conv2:总共有64个滤波器,滤波器的通道数为32,所以每张小图是所有滤波器(64)对应的一个通道
5. 卷积结果可视化
1) conv1
卷积后的厚度为32
2) conv2
卷积后的厚度为64
写在最后:
三次练习坐下来TensorFlow总算是入门了,下面开启CNN的经典网络的学习 ~