tensorflow实现简单的卷积网络

实现原理

卷积神经网络
图一在这里插入图片描述
图二
图一是卷积网络cnn的核心过程,
图二是上篇多层感知机的过程
其实二者本质是类似的,都是对图像的像素乘以一个参数加偏置来提取特征。
而卷积网络只是每次提取的特征是一小块,例如图一的33小块,当然这9个像素每个都需要一个w来进行提取特征,这时候右边的33卷积核就是了,它就是对应每个像素的参数,然后卷积操作(实际上就是对应相乘在相加)。
而于全连接不同的是其他空白出的像素就不管了,等待下一次滑动来扫下一个33,还是用上一个卷积核的参数(参数共享),原数据是55,滑动步长为1,卷积核大小为3*3,所以得到下一层的数据大小为(5-3)/1+1 = 3。这样完成了一个卷积核,我们可以多使用几个卷积核(卷积核里参数不同)这样能提取不同的信息。
在这里插入图片描述
其中在这里插入图片描述
在这里插入图片描述
最后就可以实现多个卷积核的隐含层,提取出高阶特征。
我们从代码里理解理解。

实现过程

首先老规矩导入数据和包

from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets
mnist = read_data_sets('./MNIST_data/', False, one_hot = True)
import tensorflow as tf
sess = tf.InteractiveSession()

接下来该是卷积神经网络的权重和偏置的设置,由于cnn将会有很多的权重和偏置要设置,干脆我们定义一个函数来搞吧。我们需要将权重制造一些噪声来打破完全对称,我们利用tf.truncated_normal来设置截断的正态分布,标准差设置为。0.1。因为我们用ReLU所以给偏置也增加一些小的正值(例如0.1)来避免死亡节点(dead neurons)。

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, shap = shape)
	return tf.Variable(initial)

卷积和池化也用很多次,干脆整成函数,tf.nn.conv2d是2维卷积函数,参数x是输入,W是卷积的参数,比如[5,5,1,32]:前面两个数字代表卷积核的尺寸,5*5;第三个数字代表有多少个channel,1表示灰度图,如果是彩色的RGB图,这里应该是3;最后一个代表卷积核的数量,也就是这个卷积层会提取多少类特征。strides代表模板的步长(1,1,1,1)其中第一个和最后一个固定为1,中间两个代表步长大小。padding代表边界处理的方式,有SAME和VALID,SAME表示给边界加padding让卷积的输入输出保持same,例如输入为5 * 5,卷积核大小为3 * 3,步长为1,SAME,则输出也为5 * 5(不变),但是步长为2 时候,输出为3 * 3,若为VALID,步长为1时候,输出为3 * 3,步长为2时,输出为2 * 2.
tf.nn.max_pool是最大值池化,我们使用2 * 2的最大值池化,ksize = [1,2,2,1]即将一个2 * 2的像素块将为1 * 1,希望的是缩小图片尺寸因此池化的strides设置为横竖两个方向以2为步长,如果步长为1,那么我们得到的是一个尺寸不变的图片。

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],srtides = [1, 2, 2, 1], padding = "SAME"
	

接下来定义输入的x和y——,因为卷积神经网络会利用到空间结构信息,所以要将x从1d转化到2d,就是从1x784转为28x28的结构,同时因为一个颜色通道,所以最终尺寸为[1, 28, 28, 1]其中前面的-1代表样本数量保持不变,最后的1代表颜色通道数。

x = placeholder(tf.float32,[None, 784]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值