深度学习笔记(三)

来源:互联网 发布:凯文史派西出柜 知乎 编辑:程序博客网 时间: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)
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 公司合同没给我怎么办 给客户报错价格怎么办 给客户报价低了怎么办 报价失误报低了怎么办 期望薪资说低了怎么办 期望薪资说高了怎么办 面试工资说低了怎么办 期望薪资谈低了怎么办 请年假公司不批怎么办 期望工资填低了怎么办 面试工资要高了怎么办 找工作期望薪资写低了怎么办 期望工资写少了怎么办 不给工人发工资怎么办 天亮了怎么办我好想你 亲爱的我想你我怎么办 人在澳大利亚悉尼找不到了怎么办 红米手机忘记手势密码怎么办 捡到苹果手机怎么办才能自己用 日语会读不会写怎么办 手术后nbp过低怎么办 我的手破了怎么办英文 平板手机屏坏了怎么办 他很优秀我该怎么办 洗澡的花洒漏水怎么办 高三了文科成绩很差怎么办 骑缝章最后一页没盖全怎么办 机票取早了没有登机口怎么办 机票早订比晚订贵怎么办? 孩子考差了父母怎么办 保险公司不给业务员办退司怎么办 我不习惯没有你我怎么办 锁坏了打不开了怎么办 要上班老人生病无人照顾怎么办 苹果手机一直说英文怎么办 公司很抠门怎么办英文怎么说 过了截港时间怎么办 截关日期是假日怎么办 恒温阀冷水进水堵塞怎么办 缺氧液泵管道堵塞怎么办 货物包装大集装箱装不下怎么办