转自https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-04-CNN2/
这一次我们会说道 CNN 代码中怎么定义 Convolutional 的层和怎样进行 pooling.
基于上一次卷积神经网络的介绍,我们在代码中实现一个基于MNIST数据集的例子
目录
定义卷积层的 weight bias
首先我们导入
import tensorflow as tf
采用的数据集依然是tensorflow
里面的mnist
数据集
我们需要先导入它
python from tensorflow.examples.tutorials.mnist import input_data
本次课程代码用到的数据集就是来自于它
mnist=input_data.read_data_sets('MNIST_data',one_hot=true)
接着呢,我们定义Weight
变量,输入shape
,返回变量的参数。其中我们使用tf.truncated_normal产生随机变量来进行初始化:
def weight_variable(shape):
inital=tf.truncted_normal(shape,stddev=0.1)
return tf.Variable(initial)
同样的定义biase
变量,输入shape
,返回变量的一些参数。其中我们使用tf.constant
常量函数来进行初始化:
def bias_variable(shape):
initial=tf.constant(0.1,shape=shape)
return tf.Variable(initial)
定义卷积,tf.nn.conv2d
函数是tensoflow
里面的二维的卷积函数,x
是图片的所有参数,W
是此卷积层的权重,然后定义步长strides=[1,1,1,1]
值,strides[0]
和strides[3]
的两个1是默认值,中间两个1代表padding时在x方向运动一步,y方向运动一步,padding采用的方式是SAME
。
def conv2d(x,W):
return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')
定义 pooling
接着定义池化pooling
,为了得到更多的图片信息,padding时我们选的是一次一步,也就是strides[1]=strides[2]=1
,这样得到的图片尺寸没有变化,而我们希望压缩一下图片也就是参数能少一些从而减小系统的复杂度,因此我们采用pooling
来稀疏化参数,也就是卷积神经网络中所谓的下采样层。pooling
有两种,一种是最大值池化,一种是平均值池化,本例采用的是最大值池化tf.max_pool()
。池化的核函数大小为2x2,因此ksize=[1,2,2,1]
,步长为2,因此strides=[1,2,2,1]
:
def max_poo_2x2(x):
return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1])
完整代码
# View more python tutorial on my Youtube and Youku channel!!!
# Youtube video tutorial: https://www.youtube.com/channel/UCdyjiB5H8Pu7aDTNVXTTpcg
# Youku video tutorial: http://i.youku.com/pythontutorial
"""
Please note, this code is only for python 3+. If you are using python 2+, please modify the code accordingly.
"""
from __future__ import print_function
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# number 1 to 10 data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
def compute_accuracy(v_xs, v_ys):
global prediction
y_pre = sess.run(prediction, feed_dict={xs: v_xs, keep_prob: 1})
correct_prediction = tf.equal(tf.argmax(y_pre,1), tf.argmax(v_ys,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
result = sess.run(accuracy, feed_dict={xs: v_xs, ys: v_ys, keep_prob: 1})
return result
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)
def conv2d(x, W):
# stride [1, x_movement, y_movement, 1]
# Must have strides[0] = strides[3] = 1
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
def max_pool_2x2(x):
# stride [1, x_movement, y_movement, 1]
return tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')
# define placeholder for inputs to network
xs = tf.placeholder(tf.float32, [None, 784]) # 28x28
ys = tf.placeholder(tf.float32, [None, 10])
keep_prob = tf.placeholder(tf.float32)
## conv1 layer ##
## conv2 layer ##
## func1 layer ##
## func2 layer ##
# the error between prediction and real data
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction),
reduction_indices=[1])) # loss
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
sess = tf.Session()
# important step
# tf.initialize_all_variables() no long valid from
# 2017-03-02 if using tensorflow >= 0.12
if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1:
init = tf.initialize_all_variables()
else:
init = tf.global_variables_initializer()
sess.run(init)
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={xs: batch_xs, ys: batch_ys, keep_prob: 0.5})
if i % 50 == 0:
print(compute_accuracy(
mnist.test.images[:1000], mnist.test.labels[:1000]))
好啦,如果你对本节课内容已经了解,下一次课【深度学习】Tensorflow——CNN 卷积神经网络 2我们将构建卷积神经网络的架构~