1.14-机器学习tensorflow框架学习-tensorflow实现CNN

1.定义准确率计算函数

import tensorflow as tf
def compute_accuracy(v_xs,v_ys):
    global prediction
    y_pre = sess.run(prediction,feed_dict={xs:v_xs,keep_prob: 1.0})
    correct_prediction = tf.equal(tf.arg_max(y_pre,1),tf.arg_max(v_ys,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))#tf.cast()函数的作用是执行 tensorflow 中张量数据类型转换
    res = sess.run(accuracy,feed_dict={xs:v_xs,ys:v_ys,keep_prob: 1.0})
    return res
!pip3 list|grep tensor
tensorboard          1.15.0    
tensorflow           1.15.2    
tensorflow-estimator 1.15.1

2.定义变量函数

这里用到了truncated_normal这个函数,该函数产生截断正态分布随机数,取值范围为 [ mean - 2 * stddev, mean + 2 * stddev ]。说明如下:

truncated_normal(
    shape,
    mean=0.0,
    stddev=1.0,
    dtype=tf.float32,
    seed=None,
    name=None
)
参数名 必选 类型 说明
shape 1维整形张量或array 输出张量的维度
mean 0维张量或数值 均值
stddev 0维张量或数值 标准差
dtype dtype 输出类型
seed 数值 随机种子,若 seed 赋值,每次产生相同随机数
name string 运算名称
def weight_variable(shape):
    inital = tf.truncated_normal(shape,stddev=0.1)
    return tf.Variable(inital)

def bias_variable(shape):
    inital = tf.constant(0.1,shape=shape)
    return tf.Variable(inital)

def conv2d(x,W):
    #stride=[1,x_movement,y_movement,1]
    return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')#'VALID PADDING' and 'SAME PADDING'两种方法
    #这里作者用SAME做的padding,这样卷积完激活图像和原图大小一样
def max_pool_2X2(x):
    #stride=[1,x_movement,y_movement,1]
    #pooling这里设置步长为[2,2],然后那个ksize表示池化窗口大小ksize=[1,池化窗口长,池化窗口宽,1]
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

3.处理输入

import tensorflow as tf
import ssl
ssl._create_default_https_context = ssl._create_unverified_context#不加这个会报错的,当你urllib.urlopen一个 https 的时候会验证一次 SSL 证书 ,当目标使用的是自签名的证书时就会爆出该错误消息。
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)#这个数据集每一张图片都有784个像素点28*28
xs = tf.placeholder(tf.float32,[None,784])#28*28
ys = tf.placeholder(tf.float32,[None,10])#每一个图片对应十个标签的输出
x_image = tf.reshape(xs,[-1,28,28,1])#【第一个维度不管,长为28,宽为28,深度为1】
keep_prob=tf.placeholder(tf.float32)
#print(x_image.shape)
Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz

4.定义各个层

#conv1 layer
W_conv1 = weight_variable([5,5,1,32])#过滤器长宽为5*5,insize=1就是输入深度(滤波器深度为1)。outsize=32也就是输出深度为32,也就是滤波器的个数为32
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1) #输出大小为28*28*32
h_pool1 = max_pool_2X2(h_conv1) #输出大小为14*14*32
#conv1 layer

#conv2 layer
W_conv2 = weight_variable([5,5,32,64])#过滤器长宽为5*5,insize=32就是输入深度(滤波器深度为32)。outsize=32也就是输出深度为64,也就是滤波器的个数为64
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2) #输出大小为14*14*64
h_pool2 = max_pool_2X2(h_conv2) #输出大小为7*7*64
#conv2 layer

#function layer1
h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64])#展开成一维[n_simple,7,7,64]->[n_simple,7*7*64]
W_func1 = weight_variable([7*7*64,1024])
b_func1 = weight_variable([1024])
h_func1 = tf.nn.relu(tf.matmul(h_pool2_flat,W_func1)+b_func1)
h_fc1_drop = tf.nn.dropout(h_func1,keep_prob) #防止过拟合
#function layer1

#function layer2
W_func2 = weight_variable([1024,10])
b_func2 = weight_variable([10])
prediction = tf.nn.softmax(tf.matmul(h_fc1_drop,W_func2)+b_func2)
#function layer2

cross_entropy=tf.reduce_mean(-tf.reduce_sum(ys*tf.log(prediction),reduction_indices=[1]))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

for i in range(500):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={xs: batch_xs, ys: batch_ys,keep_prob:1.0})
    if i%50==0:
        print(compute_accuracy(mnist.test.images,mnist.test.labels))
0.0501
0.8089
0.8967
0.9206
.......