given the low level of Intelligence of brain , l have to spend nearly one week on this stupid code understanding, why should they code as like this ? how could i know the different kind of shapes and parameters? everyboday has the same problem with me l think, since I’m just a newbie for deep leanring, Please let me show how stupid l’m when I was on this topic, if you are a expert, just fuck away, becasue i will be the one you think stupid.

## the shape parameter,as show in the following pic :

409863066680204697

 

1.输入图像数据28×28,因为是灰阶图像,channel只有一个, 卷积1 W的shape中[5 5 1 32] 1就是指的channel.为了shape统一,图像原来的shape是[None,784]  处理前需要reshape[-1,28 28 1], 就是28×28一个channel.

2. 卷积参数c1:32@5×5  这里32是指map feature输出32个feature,5×5是指filter, 就是那个slide window, 其中做卷积时的w shape参数[5 5 1 32], 意思是用一个渠道的5×5的矩阵做卷积输出32个feature, 计算原理就是对于W*x+b做卷积 然后进行relu函数激励。

3. 上述输出32@28×28, 因为padding使用了SAME,所以不足的数据会补齐(0或者平均数)仍然是28×28,如果是valid, 输出的应该是32@24×24,  (28-5+1),

4 做完卷积后,我们得到32@38×28的map feature, 下一步就是对这个数据进行pooling, 其中方式有max_pool 或者mean_pool, 还有开方根等,一般选用max_pool, 不要问我为什么卷积后要做pooling,其实就是为了降低数据的量,pooling的时候,我们是打对折,就是用2×2 每四个点取一个点,最大 平均等。(一会儿讲下strides 和ksize)

5 做完pooling后 我们还要做一次卷积,为什么是这个样子  我也不知道,这样我们做第二次卷积,现在我们有32@14×14,我们这次做卷积希望输出64@14×14个map feature , 其中参数shape[5 5 32 64], 记得每次做卷积后都有个激励函数,tensorflow用的是relu() 截断函数,

6. 继续做pooling ,我们就得到64@7×7个feature map,

7. 做完pooling后, 我们使用1024个神经元做全连接, 就是64个feature全连接到1024个神经元,记得加上relu激励函数, 这样子我们得到的数据shape就是1024个神经数值,

8.计算完毕后,我们目前将1024个神经元的值全连接到softmax() 对应到[ 0 1 2 3 4  5 6 7 8 9],当然其输出是如3[0  0 0 1 0 0 0 0 0 0], 到此为止我们走完了cnn的forward feedback, 后面bp直接使用tensoflow的梯度下降自动训练,无需再写代码。

9. 想说一点,为什么是这个架构,我也不知道,我后续做了两次调整,第一次增加了第三个卷积层, 64@7×7,–>128@4×4, 然后做全连接,得到的准确率直邮80%-90%之间 第二次把第一次卷积的输出改为128–>64–>32然后全连接,得到的99.07%

10 ksize和Strides 我理解其表达的意思 但是真的不清楚他们得shape为啥分别是[1 1 1 1],[1 2 2 1], ksize就是指的sliding window移动的方式,但是怎么移动的我不懂,strides指的是做pooling的过滤框, 2×2就是那个过滤框,可是第一个和第四个 1 不明白怎么回事!

 

 

 

 
#亲自手打一遍code


import tensorflow as tf 
import numpy as np

#为了方便,定制W参数的函数,当然你可以可以每次多写点代码
def weight_variable(shape):
    initial=tf.truncated_normal(tf.float32,stddev=0.1)
    renturn tf.Varibale(initial)

#为了方便,定制b参数的函数,当然你可以可以每次多写点代码
def bias_variable(shape):
    initial=tf.constant(0.1,shape=shape)
    return tf.Variable(initial)

#二维卷积操作,方便操作,x为输入图片项,W是随机权重,strides是卷积的移动窗尺寸,你可以理解为一个格子一个格子的
#移动,而在做pooling的时候是两个格子两个格子的移动,padding控制是否边缘溢出
def conv2d(x,W):
     return  tf.nn.conv2d(x,W,strides=[1 1 1 1],padding='SAME';)

#这里是进行池化,其实就是把原数据尺寸降低,kisze:输入向量维度的窗大小,就是pooling的时候2x2的格子  strides:
#输入向量维度的移动窗的步子,就是移动时每次移动2x2格子,直至全部扫描整个图片 .
def max_pool_2x2(x):
    return tf.nn.max_pool(x,ksize=[1 2 2 1 ],strides=[1 2 2 1],padding='SAME';)

#我们首先需要将图片reshape,虽然知道有用,但是官方不说,鬼才知道这么做
x_image=tf.reshape(x,[-1 28 28 1])

#第一次做卷积,5x5filter,输出32,一个渠道
W_conv1=weight_variable([5 5 1 32])
b_conv1=weight_variable([32])

h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1)
h_pool1=max_pool_2x2(h_conv1)

#第二次做卷积,5x5filter,输出64,输入32
W_conv2=weight_variable([5 5 32 64])
b_conv2=weight_variable([64])

h_conv2=tf.nn.relu(conv2d(x_image,W_conv2)+b_conv2)
h_pool2=max_pool_2x2(h_conv2)

#然后我们要做1024神经元的全连接
W_fc1=weight_variable([7*7*64,1024])
b_fc1=bias_variable([1024])

H_pool_flat=tf.reshape(h_pool2,[-1 7*7*64])

H_pool_fc1=tf.nn.relu(tf.nn.matmul(H_pool_flat,W_fc1)+b_fc1)   


#tensorflow drop out 不合乎的全部舍弃
prob=tf.placeholder(tf.float32)
H_pool_fc1_drop=tf.nn.dropout(H_pool_fc1,prob)
 

#然后计算完神经元后 我们还需要用softmax将其映射到10个output
w_fc2=weight_variable([1024 10])
b_fc2=bias_variable([1024])

#预测结果
y_conv=tf.softmax(tf.nn.relu(tf.matmul(H_pool_fc1_drop,W_fc2)+b_fc2))

#和label对比 得到true orfalse的值
coorect_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_conv,1))

利用reduce_mean求其准确率
accuracy=tf.reduce.mean(tf.cast(coorect_prediction))

##loss function defination
cross_entropy=-tf.reduce_mean(-y*tf.log(y_conv));

#训练函数,采用Adam,最小化交叉熵 ,训练步骤是0.5
trainstep=tf.train.AdamOptimizer(0.5).minimize(cross_entropy)

#启动session
sess=tf.Seesion()

#初始化所有参数
sess.run(tf.initialize_all_variables())

for i in range(20000):
    batch=mnist.trian.next_batch(50)#随机读取50个训练样本
    if i % 100==0:
       trian_accuracy=accuracy.eval(feed_dict={x:batch[0],y_:batch[1],keep_prob:1.0})
       print('step %d accuracy %g'%(i,trian_accuracy))

#测试样本    
print("test accuracy%d"%(accuracy.eval(feed_dict={x:mnist.test.images,y_:mnist.test.labels,keep_prob:1.0})))