初始化权重

  1. 创建模型前需要创建大量的权重和偏置项

  2. 模型的权重在初始化时应该加入少量的噪音来打破对称性以及避免0梯度

  3. 定义两个函数用于初始化

    1
    2
    3
    4
    5
    6
    def 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. 把其抽象为两个函数

    1
    2
    3
    def 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')

实现第一层(卷积+池化)

  1. 若一个卷积权重的形状为[5,5,1,32],前两个代表patch的大小,接着是输入的通道数,后接着输出的通道数,而对应每一个输出通道都有一个偏置量

  2. 为了用到这一层我们需要改变X的形状(变为4D向量)x_image=tf.reshape(x,[-1,28,28,1])

  3. 把x_image和权重向量进行卷积,加上偏置项,然后用relu激活后池化

    1
    2
    h_conv1=tf.nn.relu(conv2d(x_image,w_conv1)+b_conv1)
    h_pool1=tf.max_pool(h_conv1)

第二卷积

  1. 第二层每个patch会得到64个特征 [5,5,32,64]
  2. 然后如第一层一样进行第三步操作

密集连接层

  1. 图片尺寸减小到7*7(计算得到的),在加入一个1024神经元的全连接层,
  2. 在这个时候我们需要把池化层输出的张量reshape成一些向量,以后操作类似

输出层

输出层之前加入dropOut防止过拟合