准备数据集
用卷积来做手写数字数据集分类问题,我们用 tensorflow 提供的方法来下载数据集。推荐自己写数据集下载方法。
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("../MNIST_data/",one_hot=True)
tf.InteractiveSession()
是一种交互式的 session 方式,让自己成为了默认的 session,也就是说用户在不需要指明在哪个 session 下运行,就可以运行起来,这就是默认的好处。这样的话就是 run()
和 eval()
函数可以不指明 session,就可以调用。
sess = tf.InteractiveSession()
权重和偏移值
def weight_variable(shape):
initial = tf.truncated_normal(shape)
return tf.Variable(initial)
def bias_variable(shape):
initial = tf.constant(0.1,shape=shape)
return tf.Variable(initial)
从截断的正态分布中输出随机值。 shape表示生成张量的维度,mean是均值,stddev是标准差。这个函数产生正太分布,均值和标准差自己设定。
卷积层和池化层
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')
卷积层和池化层是卷积神经网的特性,目的在于减少神经网的参数。
tf.nn.conv2d
是 tensoflow 中的 2 维卷积函数
- x 是输入
- W 是卷积核的参数例如 [5,5,1,32] 前两个参数表示卷积核的大小,1表示颜色通道,如果是彩色 RGB 则是 3,最后表示卷积核的数量。
- strides 表示移动步数
- Padding 表示当卷积核移动边缘时候输入矩阵不够时候。
池化层有两种一种是均值池化层另一种是最大值池化层,这里采用的是最大值池化层,将 2 x 2 矩阵化简为 1 x 1 的矩阵。
x = tf.placeholder(tf.float32,[None,784])
y_ = tf.placeholder(tf.float32,[None,10])
# 这里 -1 表示通道不限,28x28 表示图片大小,1 表示一个通道
x_image = tf.reshape(x,[-1,28,28,1])
输入是样本数量个,每一个图片用 784 维矩阵表示,因为样本数量不确定所有用 None 来表示。
输入是一个 1 x 10 向量,是一个随机概率分布,取最大值表示推测数字位置。
第一层卷积层
W_conv1 = weight_variable([5,5,1,32])
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu( conv2d(x_image,W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
第一层卷积为 28x28 大小矩阵经过 5x5 大小 32 层的卷积后因为 padding 给的值是 SAME 所以大小没有变化,经过池化层后为大小减半为 14x14
第二层卷积层
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)
经过一个隐藏卷积层后变为 7x7
网友评论