由于全连接神经网络处理图像中的需要训练参数过多的问题。而卷积神经网络中,卷积层的神经元只与前一层的部分
神经元节点相连,既它的神经元的连接是非全连接的。且同一层某些神经元之间的连接的权重w和偏移b是共享的,这样大量减少了训练参数的数量。
(图1)
卷积神经网络的结构一般包含几个层:
输入层:用于数据的输入
卷积层:使用卷积核进行特征提取和特征映射
激励层:由于卷积也是一种线性运算,因此需要增加非线性映射
池化层:进行下采样,对特征图做稀疏处理,减少数据运算量。
全连接层:通常在Cnn的尾部进行重新拟合,减少特征信息的损失。
输出层:用于输出结果
还有一些其他的层次比如归一化层:在Cnn中对特征的归一化,切分层:对某些数据的进行分区域的单独学习,融合层:对分区域进行特征学习的分支进行融合
卷积神经网络中,隐藏层中的神经元的感受视野比较小,只能看到上一次的部分特征,上一层的其他特征可以通过平移感受视野来得到同一层的其他神经元,由同一层其他神经元来看。
动态模型
(图2)
(数学模型3*3)
(图3)
模型是一个立体模型 长宽会减小,高度会增加
一个感受视野带有一个卷积核,我们将感受视野中的权重w矩阵称为卷积核:将感受视野对输入的扫描间隔成为步长;如果步长过大会出界这个时候需要对边界扩充pad,边界扩充可以设为0或者其他值。
如图(1)所示其特征映射图的权重和偏置都是共同的
卷积核不要设置太大卷积核长宽自定一般3*3左右吧
参数设置:
self.x=tf.placeholder(tf.float32,[None,28,28,1])
# 输入y(标签)
self.y=tf.placeholder(tf.float32,[None,10])
# ----------------------------卷积初始化--------------------------------
#卷积第一层
self.conv1_w=tf.Variable(tf.random_normal([3,3,1,16],dtype=tf.float32,stddev=0.1))
# 卷积第一层偏移
self.convb1=tf.Variable(tf.zeros([16]))
# 卷积第二层
self.conv2_w = tf.Variable(tf.random_normal([3,3,16,32],dtype=tf.float32,stddev=0.1))
# 卷积第二层偏移
self.convb2=tf.Variable(tf.zeros([32]))
#--------------------------------全连接初始化---------------------------------------
# 第一层全连接w
self.W = tf.Variable(tf.random_normal([7*7*32,128],dtype=tf.float32,stddev=0.1))
# 第一层全连接b
self.B = tf.Variable(tf.zeros([128]))
# 第二层全连接w
self.W1 = tf.Variable(tf.random_normal([128,10],dtype=tf.float32,stddev=0.1))
# 第二层全连接b
self.B1 = tf.Variable(tf.zeros([10]))
前项计算:
# ------------------------------卷积层-----------------------------------
# 卷积第一层实现
self.conv1=tf.nn.relu(tf.nn.conv2d(self.x,self.conv1_w,strides=[1,1,1,1],padding="SAME")+self.convb1)
# 第一层池化
self.pool1=tf.nn.max_pool(self.conv1,ksize=[1,2,2,1],strides=[1,2,2,1],padding="SAME")
# 卷积第二层实现
self.conv2=tf.nn.relu(tf.nn.conv2d(self.pool1,self.conv2_w,strides=[1,1,1,1],padding="SAME")+self.convb2)
# 卷积第二层池化
self.pool2=tf.nn.max_pool(self.conv2,ksize=[1,2,2,1],strides=[1,2,2,1],padding="SAME")
# 均值tf.nn.avg_pool
# 归一化层tf.nn.batch_normalization
# 形状处理
self.flat = tf.reshape(self.pool2,[-1,7*7*32])
# ---------------------------------全链接层-------------------------------------------
self.y0 = tf.nn.relu(tf.matmul(self.flat,self.W)+self.B)
self.yo = tf.nn.softmax(tf.matmul(self.y0,self.W1)+self.B1)
后项计算:
self.cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=self.yo, labels=self.y))
self.optimizer = tf.train.AdamOptimizer(0.003).minimize(self.cross_entropy)
训练
if __name__ == '__main__':
net = Net()
net.forward()
net.backword()
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for i in range(100000):
xs,ys = mnist.train.next_batch(128)
cg=xs.reshape([128,28,28,1])
rs,loss,_=sess.run([net.acc,net.cross_entropy,net.optimizer],feed_dict={net.x:cg,net.y:ys})
if i % 100==0:
# print(loss)