深度学习笔记(三)
来源:互联网 发布:凯文史派西出柜 知乎 编辑:程序博客网 时间:2024/05/16 15:18
卷积神经网络
一.为什么要引入卷积神经网络?
由于随机梯度算法在MNIST上只有91%正确率,用卷积神经网络可以达到大概99.2%的准确率。
二.什么是卷积神经网络
我觉得这个博主写的非常好,可以参考http://blog.csdn.net/taigw/article/details/50534376
三.Tensor Flow构建一个卷积神经网络
1.权重初始化
由于卷积网络是把对于图像所有的像素,全部都连接上一个权值,分很多层,然后最后进行分类,所以我们需要创建大量的权重和偏置项。这个模型中的权重在初始化时应该加入少量的噪声来打破对称性以及避免0梯度。由于我们使用的是ReLU神经元,因此比较好的做法是用一个较小的正数来初始化偏置项,以避免神经元节点输出恒为0的问题。为了减少反复做初始化操作,定义两个函数用于初始化。
def weight_variable(shape): initial = tf.truncated_normal(shape, stddev=0.1) return tf.Variable(initial)def bias_variable(shape): initial = tf.constant(0.1, shape=shape) return tf.Variable(initial)
注:
(1)tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
从截断的正态分布输出随机值。产生的值遵循具有指定平均值和标准偏差的正态分布,除了其幅度大于2个与平均值的标准偏差的值被丢弃并重新选择。
ARGS:
shape:1-D整数Tensor或Python数组。输出张量的形状。
mean:类型为0-D Tensor或Python值dtype。截断正态分布的平均值。
stddev:类型为0-D Tensor或Python值dtype。截断正态分布的标准偏差。
dtype:输出的类型。
seed:一个Python整数。用于为分配创建一个随机种子。看到 set_random_seed 行为。
name:操作的名称(可选)。
返回:指定形状的张量被随机截断的正常值填充。
(2)tf.constant(value, dtype=None, shape=None, name=’Const’)
创建一个常数张量。生成的张量dtype由参数value和(可选)指定的类型值填充shape。
参数value可以是常量值,也可以是类型值的列表 dtype。如果value是列表,则列表的长度必须小于或等于shape参数隐含的元素数(如果指定的话)。在列表长度小于指定的元素数量的情况下,列表中shape的最后一个元素将用于填充剩余的条目。
参数shape是可选的。如果存在,它指定所得张量的尺寸。如果不存在,则张量是标量(0-D),如果value是标量,否则为1-D。
如果未指定参数dtype,则从类型推断该类型value是列表还是常量。
例如:
# Constant 1-D Tensor populated with value list.
#识别该变量为列表类型,值为[1 2 3 4 5 6 7]
tensor = tf.constant([1, 2, 3, 4, 5, 6, 7]) => [1 2 3 4 5 6 7]
# Constant 2-D tensor populated with scalar value -1.
#识别该变量为一个2*3的矩阵,矩阵中的每个元素为-1
tensor = tf.constant(-1.0, shape=[2, 3]) => [[-1. -1. -1.]
[-1. -1. -1.]]
ARGS:
value:输出类型的常量值(或列表)dtype。
dtype:所得张量的元素的类型。
shape:所得张量的可选尺寸。
name:张量的可选名称。
返回:恒定张量。
2.卷积和池化
对于一张图片来说,像素点太多,权重和偏移量太多了。对于一张图片来说分成一些小窗口,每个小窗口近似一个相同的特征,即池化,而卷积操作对于图片来说可以很好的提取到特征。
在这个实例里,我们的卷积使用1步长,0边距的模板,保证输出和输入是同一个大小。我们的池化用简单传统的2x2大小的模板做max pooling。为了代码更简洁,我们把这部分抽象成一个函数。
def conv2d(x, W): return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1],padding='SAME')def max_pool_2x2(x): return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')
注:
1.tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
计算给定4-D input和filter张量的2-D卷积。给定形状的输入张量和形状[batch, in_height, in_width, in_channels] 的滤波器/内核张量 [filter_height, filter_width, in_channels, out_channels],(为什么要定义这样的张量)该操作执行以下操作:
将过滤器过滤到具有形状的2-D矩阵 [filter_height * filter_width * in_channels, output_channels]。
从输入张量中提取图像补丁,形成一个虚拟的 张量[batch, out_height, out_width, filter_height * filter_width * in_channels]。
对于每个补丁,右乘乘滤波器矩阵和图像块向量。
详细,
output[b, i, j, k] =
sum_{di, dj, q} input[b, strides[1] * i + di, strides[2] * j + dj, q] *
filter[di, dj, q, k]
必须有strides[0] = strides[3] = 1。(不太懂这个式子表达的含义!!!!)对于最常见的相同水平和顶点步骤的情况,strides = [1, stride, stride, 1]。
(batch 批处理/批处理的量
channel 通道)
ARGS:
input:A Tensor。必须是以下类型之一:float32,float64。
filter:A Tensor。必须有相同的类型input。
strides:列表ints。1-D长度4.每个尺寸的滑动窗口的步幅input。
paddingA string来自:”SAME”, “VALID”。使用的填充算法的类型。
use_cudnn_on_gpu:可选bool。默认为True。
name:操作的名称(可选)。
返回:
一Tensor。具有相同的类型input。
2.1 第一层卷积
它由一个卷积接一个max pooling完成。卷积在每个5x5的patch(补丁:图片的局部量)中算出32个特征(第一层卷积操作,输入为1,输出为32,不同操作得到不同的关于图片的特征。如关于图片边缘线的特征,关于图片高亮的特征,关于图片模糊化的特征,等等,共卷积得到原图的32种特征。)。卷积的权重张量形状是[5, 5, 1, 32],前两个维度是patch的大小,接着是输入的通道数目,最后是输出的通道数目。 而对于每一个输出通道都有一个对应的偏置量。
W_conv1 = weight_variable([5, 5, 1, 32])b_conv1 = bias_variable([32])
为了用这一层,我们把x变成一个4d向量,其第2、第3维对应图片的宽、高,最后一维代表图片的颜色通道数(因为是灰度图所以这里的通道数为1,如果是rgb彩色图,则为3)。
x_image = tf.reshape(x, [-1,28,28,1])
我们把x_image和权值向量进行卷积,加上偏置项,然后应用ReLU激活函数,最后进行max pooling。
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)h_pool1 = max_pool_2x2(h_conv1)
2.2 第二层卷积
为了构建一个更深的网络,我们会把几个类似的层堆叠起来。第二层中,每个5x5的patch会得到64个特征(第二层卷积操作,是在第一层操作的结果上面。例如将些特征组成简单的形状,共得到64个输出结果。)。
W_conv2 = weight_variable([5, 5, 32, 64])b_conv2 = bias_variable([64])h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)h_pool2 = max_pool_2x2(h_conv2)
2.3 全连接层
图片尺寸减小到7x7,我们加入一个有1024个神经元的全连接层,用于处理整个图片。我们把池化层输出的张量reshape成一些向量,乘上权重矩阵,加上偏置,然后对其使用ReLU。
(padding的时候使用了SAME,即输入和输出是同一尺寸的。patch不会影响图片大小,patch 过程中会超出图片范围,相当于在32*32的图片进行卷积,超出部分用0代替,保证图片大小仍然为28*28,然后池化操作。所以第一层池化为14*14,第二层池化以后是7*7)
W_fc1 = weight_variable([7 * 7 * 64, 1024])b_fc1 = bias_variable([1024])h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
为了减少过拟合,我们在输出层之前加入dropout。我们用一个placeholder来代表一个神经元的输出在dropout中保持不变的概率。这样我们可以在训练过程中启用dropout,在测试过程中关闭dropout。 TensorFlow的tf.nn.dropout操作除了可以屏蔽神经元的输出外,还会自动处理神经元输出值的scale。所以用dropout的时候可以不用考虑scale。
keep_prob = tf.placeholder("float")h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
最后,我们添加一个softmax层,就像前面的单层softmax regression一样。
W_fc2 = weight_variable([1024, 10])b_fc2 = bias_variable([10])y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
- 深度学习笔记(三)
- 深度学习笔记(三)
- Deep Learning(深度学习) 学习笔记(三)
- Deep Learning(深度学习) 学习笔记(三)
- 《深度学习原理与TensorFlow实践》学习笔记(三)
- 吴恩达【深度学习工程师】学习笔记(三)
- 深度学习与神经网络学习笔记(三)
- 吴恩达深度学习笔记(三)week1机器学习策略
- 吴恩达深度学习笔记(三)week2机器学习策略
- android深度搜索学习笔记三( 蜂鸣器驱动)
- 深度学习笔记(三)---梯度检验与高级优化
- 深度学习笔记(三)第三章 概率论和信息论
- 深度学习笔记三:反向传播(backpropagation)算法
- Theano深度学习笔记(三)多层感知器
- 深度学习笔记三-CNN(卷积神经网络)是什么?(续)
- 【深度学习笔记】(三)Tensorflow on Android
- 深度学习笔记——深度学习框架TensorFlow(三)
- 深度学习笔记三:Softmax Regression
- 原生javascript实现ajax异步请求
- Combination Sum
- 如何通过SNMP协议保存思科路由器配置文件
- 查看部门里工资大于平均水平的员工信息,并按部门分组
- c印记(十三):表驱动编程——优美的逻辑优化者
- 深度学习笔记(三)
- java集合lis,set,map
- yuv数据格式介绍与rgb的转换,图像文件的封装
- 双向bfs——洛谷P1032 字串变换
- Python学习之matplotlib 绘制折线图详解
- node入门(三)-- mysql
- [Easyui Treegrid ]单行选中编辑
- 内存管理
- Linux-优势