ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

04卷积神经网络

2020-03-16 16:54:24  阅读:263  来源: 互联网

标签:None 04 卷积 SAME strides 神经网络 64 tf


一. 卷积神经网络定义与比较

1.     全连接神经网络的缺点

  • 参数太多,在cifar-10的数据集中,只有32*32*3,就会有这么多权重,如果说更大的图片,比如200*200*3就需要120000多个,这完全是浪费
  • 没有利用像素之间位置信息,对于图像识别任务来说,每个像素与周围的像素都是联系比较紧密的。
  • 层数限制

2.     卷积神经网络

神经网络的基本组成包括输入层、隐藏层、输出层。而卷积神经网络的特点在于隐藏层分为卷积层和池化层(pooling layer,又叫下采样层)。

l  卷积层:通过在原始图像上平移来提取特征,每一个特征就是一个特征映射

l  池化层:通过特征后稀疏参数来减少学习的参数,降低网络的复杂度(最大池化和平均池化)

二. 卷积神经网络的结构(面试重点)

1.     卷积层过滤器

 

 

 

2.     激活函数Re-lu

    f(x) = max(0,x)

 

 

 

第一,采用sigmoid等函数,反向传播求误差梯度时,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多

第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(求不出权重和偏置)

3.     池化层

Pooling层主要的作用是特征提取,通过去掉Feature Map中不重要的样本,进一步减少参数数量。Pooling的方法很多,最常用的是Max Pooling。

4.     全连接层

前面的卷积和池化相当于做特征工程,后面的全连接相当于做特征加权。最后的全连接层在整个卷积神经网络中起到“分类器”的作用

三. 卷积层的零填充

卷积核在提取特征映射时的动作称之为padding(零填充),由于移动步长不一定能整出整张图的像素宽度。其中有两种方式,SAME和VALID

l  SAME:越过边缘取样,取样的面积和输入图像的像素宽度一致。

l  VALID:不越过边缘取样,取样的面积小于输入人的图像的像素宽度

四. 相关API

1.     卷积网络

tf.nn.conv2d(input, filter, strides=, padding=, name=None)

计算给定4-D input和filter张量的2维卷积

l  input:给定的输入张量,具有[batch,heigth,width,channel],类型为float32,64

l  filter:指定过滤器的大小,[filter_height, filter_width, in_channels, out_channels]

l  strides:strides = [1, stride, stride, 1],步长

l  padding:“SAME”, “VALID”,使用的填充算法的类型,使用“SAME”。其中”VALID”表示滑动超出部分舍弃,“SAME”表示填充,使得变化后height,width一样大

2.     激活函数

tf.nn.relu(features, name=None)  features:卷积后加上偏置的结果return:结果

3.     池化层

tf.nn.max_pool(value, ksize=, strides=, padding=,name=None) 输入上执行最大池数

  • value:4-D Tensor形状[batch, height, width, channels]
  • ksize:池化窗口大小,[1, ksize, ksize, 1]
  • strides:步长大小,[1,strides,strides,1]
  • padding:“SAME”, “VALID”,使用的填充算法的类型,使用“SAME”

附:案例代码

 1 # 初始化权重和偏置
 2 def init_weight(shape):
 3     weight = tf.Variable(tf.random_normal(shape, mean=0.0, stddev=1.0), name="w")
 4     return weight
 5 
 6 
 7 def init_bias(shape):
 8     bias = tf.Variable(tf.constant(0.0, shape=shape))
 9     return bias
10 
11 
12 def model():
13     """
14     自定义得卷积模型
15     :return: 
16     """
17     # 1.建立占位符
18     with tf.variable_scope("data"):
19         x = tf.placeholder(tf.float32, [None, 784])
20         y_true = tf.placeholder(tf.int64, [None, 10])
21 
22     # 2.卷积层1
23     with tf.variable_scope("conv1"):
24         w_conv1 = init_weight([5, 5, 1, 32])
25         b_conv1 = init_bias([32])
26         x_reshape = tf.reshape(x, [-1, 28, 28, 1])
27         # [None,28,28,1]->[None,28,28,32]
28         x_relu1 = tf.nn.relu(tf.nn.conv2d(x_reshape, w_conv1, strides=[1, 1, 1, 1], padding="SAME") + b_conv1)
29         # 池化2*2 [None,28,28,32]->[None,14,14,32]
30         x_pool1 = tf.nn.max_pool(x_relu1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
31 
32     # 3.卷积层2
33     with tf.variable_scope("conv2"):
34         w_conv2 = init_weight([5, 5, 32, 64])
35         b_conv2 = init_bias([64])
36 
37         # [None,14,14,32]->[None,14,14,64]
38         x_relu2 = tf.nn.relu(tf.nn.conv2d(x_pool1, w_conv2, strides=[1, 1, 1, 1], padding="SAME") + b_conv2)
39         # 池化2*2 [None,14,14,64]->[None,7,7,64]
40         x_pool2 = tf.nn.max_pool(x_relu2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
41 
42     # 4.全连接层 [None,7,7,64]->[None,7*7*64]*[7*7*64,10]->[None,10]
43     with tf.variable_scope("allconv"):
44         w_conv = init_weight([7*7*64, 10])
45         b_conv = init_bias([10])
46 
47         x_pool_reshape = tf.reshape(x_pool2, [-1, 7 * 7 * 64])
48         y_predict = tf.matmul(x_pool_reshape, w_conv) + b_conv
49 
50     return x, y_true, y_predict
51 
52 
53 def conv_fc():
54     # 获取数据
55     mnist = input_data.read_data_sets("./tmp/input_data", one_hot=True)
56 
57     # 定义模型,得出输出
58     x, y_true, y_predict = model()
59 
60     # 求损失平均值
61     with tf.variable_scope("soft_cross"):
62         # 求平均交叉熵损失
63         loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))
64 
65     # 梯度下降求出损失
66     with tf.variable_scope("optimizer"):
67         train_op = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
68 
69     # 计算准确率
70     with tf.variable_scope("acc"):
71         equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))
72         # 计算张量平均值
73         accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
74 
75     init_op = tf.global_variables_initializer()
76     with tf.Session() as sess:
77         sess.run(init_op)
78 
79         for i in range(1000):
80             # 取出目标值,特征值
81             m_x, m_y = mnist.train.next_batch(50)
82             sess.run(train_op, feed_dict={x: m_x, y_true: m_y})
83             print("第%d步,准确率:%f" % (i, sess.run(accuracy, feed_dict={x: m_x, y_true: m_y})))

 

标签:None,04,卷积,SAME,strides,神经网络,64,tf
来源: https://www.cnblogs.com/yaopeiyun/p/12504903.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有