初始化权重
创建模型前需要创建大量的权重和偏置项
模型的权重在初始化时应该加入少量的噪音来打破对称性以及避免0梯度
定义两个函数用于初始化
1
2
3
4
5
6def weight_variable(shape):
inital=tf.truncated_noraml(shape,stddev=0.1)
return tf.Variable(inital)
def bias_variable(shape):
inital=tf.constant(0.1,shape=shape)
return tf.Variable(inital)
卷积和池化
把其抽象为两个函数
1
2
3def conv2d(x,w):return tf.nn.conv2d(x,w,stride=[1,1,1,1],padding='SAME')
def max_pool(x):return tf.nn.max_pool(x,ksize=[1,2,2,1],
strides=[1,2,2,1],padding='SAME')
实现第一层(卷积+池化)
若一个卷积权重的形状为[5,5,1,32],前两个代表patch的大小,接着是输入的通道数,后接着输出的通道数,而对应每一个输出通道都有一个偏置量
为了用到这一层我们需要改变X的形状(变为4D向量)
x_image=tf.reshape(x,[-1,28,28,1])把x_image和权重向量进行卷积,加上偏置项,然后用relu激活后池化
1
2h_conv1=tf.nn.relu(conv2d(x_image,w_conv1)+b_conv1)
h_pool1=tf.max_pool(h_conv1)
第二卷积
- 第二层每个patch会得到64个特征 [5,5,32,64]
- 然后如第一层一样进行第三步操作
密集连接层
- 图片尺寸减小到7*7(计算得到的),在加入一个1024神经元的全连接层,
- 在这个时候我们需要把池化层输出的张量reshape成一些向量,以后操作类似
输出层
输出层之前加入dropOut防止过拟合


