深度学习之CNN卷积神经网络(一)手写数字识别

代码如下

import tensorflow as tf
import random
from matplotlib import pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data

# 随机种子
tf.set_random_seed(1)

# 数据
mnist = input_data.read_data_sets(r'MNIST_data',one_hot=True)

# 占位符
X = tf.placeholder(tf.float32,shape=[None,784])
Y = tf.placeholder(tf.float32,shape=[None,10])
keep_prob = tf.placeholder(tf.float32)
X_img = tf.reshape(X,shape=[-1,28,28,1])

# 模型
# 卷积盒		三层卷积,每层依次为32个,64个,128个
W1 = tf.Variable(tf.random_normal([3,3,1,32],stddev=0.01),name='W1')
W2 = tf.Variable(tf.random_normal([3,3,32,64],stddev=0.01),name='W2')
W3 = tf.Variable(tf.random_normal([3,3,64,128],stddev=0.01),name='W3')

# 卷积
l1 = tf.nn.conv2d(X_img,W1,strides=[1],padding='SAME')
# 激活
l1 = tf.nn.relu(l1)
# 池化
l1 = tf.nn.max_pool(l1,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
# 为缩减计算量,随机切断一批数据间的连接
l1 = tf.nn.dropout(l1,keep_prob=keep_prob)

l2 = tf.nn.conv2d(l1,W2,strides=[1],padding='SAME')
l2 = tf.nn.relu(l2)
l2 = tf.nn.max_pool(l2,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
l2 = tf.nn.dropout(l2,keep_prob=keep_prob)

l3 = tf.nn.conv2d(l2,W3,strides=[1],padding='SAME')
l3 = tf.nn.relu(l3)
l3 = tf.nn.max_pool(l3,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
l3 = tf.nn.dropout(l3,keep_prob=keep_prob)
l3_flat = tf.reshape(l3,shape=[-1,4*4*128])

# 全连接
# 参数
W4 = tf.get_variable('W4',shape=[4*4*128,50],initializer=tf.contrib.layers.xavier_initializer())
b4 = tf.Variable(tf.random_normal([50]),name='b4')

W5 = tf.get_variable('W5',shape=[50,10],initializer=tf.contrib.layers.xavier_initializer())
b5 = tf.Variable(tf.random_normal([10]),name='b5')

# 第四层全连接
l4 = tf.nn.relu(tf.matmul(l3_flat,W4) + b4)
l4 = tf.nn.dropout(l4,keep_prob=keep_prob)

l5 = tf.nn.softmax(tf.matmul(l4,W5) + b5)

# 代价计算
cost = - tf.reduce_mean(tf.reduce_sum(Y * tf.log(l5),axis=1))

# 优化器
train = tf.train.GradientDescentOptimizer(learning_rate=0.03).minimize(cost)

# 准确率
acc = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(l5,1),tf.argmax(Y,1)),dtype=tf.float32))

# 超参数
max_iter = 15
batch_size = 100

# 开启会话
with tf.Session() as sess:
    # 初始化变量
    sess.run(tf.global_variables_initializer())
    # 开启大循环
    for i in range(max_iter):
        avg_cost = 0
        n_batch = mnist.train.num_examples // batch_size
        for n in range(n_batch):
            x_train,y_train = mnist.train.next_batch(batch_size)
            c,_ = sess.run([cost,train],feed_dict={X:x_train,Y:y_train,keep_prob:0.7})
            avg_cost += c / n_batch
        print('批次',i+1)
        print('代价',avg_cost)
        print('准确率',sess.run(acc,feed_dict={X:mnist.test.images,Y:mnist.test.labels,keep_prob:1}))
    print('结束')

    # 随机预测
    r = random.randint(0,mnist.test.num_examples - 1)
    print('标签',sess.run(tf.argmax(mnist.test.labels[r:r+1],1)))
    print('预测',sess.run(tf.argmax(l5,1),feed_dict={X:mnist.test.images[r:r+1],keep_prob:1}))

    # 画图
    plt.imshow(
        mnist.test.images[r:r+1].reshape(28,28),
        cmap='Greys',
        interpolation='nearest'
    )
    plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值