深度学习之卷积神经网络

释放双眼,带上耳机,听听看~!

深度学习之卷积神经网络

文章目录

  • 深度学习之卷积神经网络

    1. 传统神经网络存在的问题
    1. 卷积神经网络构成
    • 2.1 输入层

    • 2.2 隐藏层

      • 2.2.1 卷积层
      • 2.2.2 池化层
      • padding
      • 2.2.3 全连接层(可无)
    • 2.3 输出层

    1. CNN用于MNIST数据及分类

1. 传统神经网络存在的问题

  • 权值太多,计算量太大
  • 权值太多,需要大量样本进行训练

深度学习之卷积神经网络
假设一个传统的神经网络有一个输入层,一个隐藏层层,一个输出层。用该网络处理一个图片分类问题:
训练集图片的大小为100*100px,那么一个图片就是1W个像素的大小,所以输入层要定义1W个神经元,假设隐藏层也定义1W个神经元,那么就有1W x 1W = 1亿个参数需要确定。对于大图片而言,计算量就更大了。
由于权值太多,若数据量又不够大,就会造成过拟合的现象,所以此时又要需要大量的样本进行训练。(网络越复杂,需要的数据就越多,训练集数据量的大小最好为权值w的5-30倍)

2. 卷积神经网络构成

2.1 输入层

在将学习数据输入卷积神经网络前,需在通道或时间/频率维对输入数据进行归一化。

2.2 隐藏层

2.2.1 卷积层

  • 用卷积核提取特征,卷积核可以看作一个矩阵。
  • 卷积层参数包括卷积核大小、步长和填充,三者共同决定了卷积层输出特征图的尺寸。
  • 卷积神经网络通常使用relu激活函数,激活函数函数操作通常在卷积核之后。

假如设置一个卷积核为33的矩阵,而图片的分辨率为55,那么从左上角开始,卷积核就对应着数据的3*3的矩阵范围,然后相乘再相加得出一个值。按照这种顺序,每隔一个像素就操作一次,就可以得出9个值。这九个值形成的矩阵被称作激活映射。
深度学习之卷积神经网络

2.2.2 池化层

通过卷积操作,完成了对输入图像的降维和特征抽取,但特征图像的维数还是很高。维数高不仅计算耗时,而且容易导致过拟合。所以引入了池化(pooling)操作。卷积层操作后输出的特征图会被传递至池化层进行特征选择和信息过滤。
池化的做法是对图像的某一个区域用一个值代替,如最大值或平均值。如果采用最大值,叫做 max 池化;如果采用均值,叫做均值池化。
深度学习之卷积神经网络

padding

padding参数的作用是决定在进行卷积或池化操作时,是否对输入的图像矩阵边缘补零。
same padding:给平面补零,窗口采样后得到一个跟原来平面大小相同或比原平面大的平面。
valid padding:不补零,窗口样后得到一个跟原来平面大小相同或比原平面小的平面。
深度学习之卷积神经网络

2.2.3 全连接层(可无)

从卷积网络谈起,卷积网络在形式上有一点点像咱们正在召开的“人民代表大会制度”。卷积核的个数相当于候选人,图像中不同的特征会激活不同的“候选人”(卷积核)。
池化层(仅指最大池化)起着类似于“合票”的作用,不同特征在对不同的“候选人”有着各自的喜好。
全连接相当于是“代表普选”。所有被各个区域选出的代表,对最终结果进行“投票”,全连接保证了receiptive field 是整个图像,既图像中各个部分(所谓所有代表),都有对最终结果影响的权利。
全连接层之前的作用是提取特征,全连接层的作用是分类。全连接层的坏处就在于其会破坏图像的空间结构。

2.3 输出层

卷积神经网络中输出层的上游通常是全连接层,因此其结构和工作原理与传统神经网络中的输出层相同。对于图像分类问题,输出层使用逻辑函数或归一化指数函数(softmax function)输出分类标签 。在物体识别问题中,输出层可设计为输出物体的中心坐标、大小和分类 。在图像语义分割中,输出层直接输出每个像素的分类结果 。

3. CNN用于MNIST数据及分类

补充:

  1. 卷积神经网络通常使用relu激活函数,激活函数函数操作通常在卷积核之后

1
2
3
4
5
6
7
8
9
10
1truncated_normal(
2   shape,  #输出张量的维度
3   mean=0.0,   #均值
4   stddev=1.0, #标准差
5   dtype=tf.float32,   #输出类型
6   seed=None,  #随机种子,若 seed 赋值,每次产生相同随机数
7   name=None   #运算名称
8)
9
10
  1. 偏置值推荐的初始值不为0,一般设为0.1
  2. tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

input : 输入的要做卷积的图片,要求为一个张量,shape为 [ batch, in_height, in_weight, in_channel ],其中batch为图片的数量,in_height 为图片高度,in_weight 为图片宽度,in_channel 为图片的通道数,灰度图该值为1,彩色图为3。
filter: 卷积核,要求也是一个张量,shape为 [ filter_height, filter_weight, in_channel, out_channels ],其中 filter_height 为卷积核高度,filter_weight 为卷积核宽度,in_channel 是图像通道数 ,和 input 的 in_channel 要保持一致,out_channel 是卷积核数量。
strides: 卷积时在图像每一维的步长,这是一个一维的向量,[ 1, strides, strides, 1],第一位和最后一位固定必须是1
padding: string类型,值为“SAME” 和 “VALID”,表示的是卷积的形式,是否考虑边界。"SAME"是考虑边界,不足的时候用0去填充周围,"VALID"则不考虑
use_cudnn_on_gpu: bool类型,是否使用cudnn加速,默认为true

  1. tf.nn.max_pool(value, ksize, strides, padding, name=None)

value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch, height, width, channels]这样的shape
ksize:池化窗口的大小,取一个四维向量,一般是[1, height, width, 1]
strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]
padding:和卷积类似,可以取’VALID’ 或者’SAME’


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
1#encoding: utf-8
2import tensorflow as tf
3from tensorflow.examples.tutorials.mnist import input_data
4
5mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
6
7# 每个批次的大小
8batch_size = 100
9# 计算一共有多少个批次
10n_batch = mnist.train.num_examples // batch_size
11
12# 初始化权值
13def weight_variable(shape):
14    initial = tf.truncated_normal(shape,stddev=0.1)#生成一个标准差为0.1的截断的正态分布
15    return tf.Variable(initial)
16
17# 初始化偏置
18def bias_variable(shape):
19    initial = tf.constant(0.1,shape=shape)#创建一个值为0.1的常量,为shape形状
20    return tf.Variable(initial)
21
22# 卷积层
23def conv2d(x,W):
24    return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')
25
26# 池化层
27def max_pool_2x2(x):
28    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
29
30# 定义两个placeholder
31x = tf.placeholder(tf.float32,[None,784])#28*28
32y = tf.placeholder(tf.float32,[None,10])
33
34# 这里是将一组图像矩阵x重建为新的矩阵,该新矩阵的维数为(a,28,28,1),其中-1表示a由实际情况来定。
35x_image = tf.reshape(x,[-1,28,28,1])
36
37# 初始化第一个卷积层的权值和偏置
38W_conv1 = weight_variable([5,5,1,32])#5*5的采样窗口,32个卷积核从1个平面抽取特征
39b_conv1 = bias_variable([32])#每一个卷积核一个偏置值
40
41# 把x_image和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数
42h_conv1 = tf.nn.relu(conv2d(x_image,W_conv1) + b_conv1)
43h_pool1 = max_pool_2x2(h_conv1)#进行,max-pooling
44
45# 初始化第二个卷积层的权重和偏置
46W_conv2 = weight_variable([5,5,32,64])#5*5的采样窗口,64个卷积核聪慧32个平面抽取特征
47b_conv2 = bias_variable([64])#每一个卷积核一个偏置值
48
49# 把h_pool1和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数
50h_conv2 = tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2)
51h_pool2 = max_pool_2x2(h_conv2)#进行max-pooling
52
53#28*28的图片第一次卷积后还是28*28,第一次池化后变为14*14
54#第二次卷积后为14*14,第二次池化后变为7*7
55#通过上面操作后得到64张7*7的平面
56
57# 初始化第一个全连接的权值
58W_fc1 = weight_variable([7*7*64,1024])#上一层有7*7*64个神经元,全连接层有1024个神经元
59b_fc1 = bias_variable([1024])#1024个节点
60
61# 把池化层2的输出扁平化为1维
62h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64])
63# 求第一个全连接层的输出
64h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)
65
66# keep_prob用来表示神经元的输出概率
67keep_prob = tf.placeholder(tf.float32)
68h_fc1_drop = tf.nn.dropout(h_fc1,keep_prob)
69
70# 初始化第二个全连接层
71W_fc2 = weight_variable([1024,10])
72b_fc2 = bias_variable([10])
73
74# 计算输出
75prediction = tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2)
76
77# loss:交叉熵代价函数
78cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))
79# 使用AdamOptimizer进行优化,大多数情况下,使用Adam都能又快又好地达到目标,迅速收敛。
80train_step = tf.train.AdadeltaOptimizer(1e-4).minimize(cross_entropy)
81# 结果存放在一个布尔列表中
82correct_prediction = tf.equal(tf.argmax(prediction,1),tf.argmax(y,1))#argmac返回一维张量中最大的值所在的位置
83#求准确率
84accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
85
86with tf.Session() as sess:
87    sess.run(tf.global_variables_initializer())
88    for epoch in range(21):
89        for batch in range(n_batch):
90            batch_xs,batch_ys = mnist.train.next_batch(batch_size)
91            sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.7})
92        acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})
93        print('Iter ' + str(epoch) + ', Testing Accuracy=' + str(acc))
94
95
96

运行结果:
深度学习之卷积神经网络

给TA打赏
共{{data.count}}人
人已打赏
安全运维

MySQL到MongoDB的数据同步方法!

2021-12-11 11:36:11

安全运维

Ubuntu上NFS的安装配置

2021-12-19 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索