利用Tensorflow实现CNN(卷积神经网络)对mnist手写数据集的识别

import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data
import random
import time
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#使其能显示汉字
# 读取mnist数据,下载后的Mnist并解压后,放在项目的同级目录下,通过下面程序即可读取
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
batchsize=64#每一批次训练64个样本
# 在训练时,None表示从训练集中取得一张图表(x_data),及图表的值(y_data)
# 在测试评估模型时,None表示整个测试集合
x_data = tf.placeholder("float", [None, 784])
y_data = tf.placeholder("float", [None, 10])
x_image = tf.reshape(x_data, [-1, 28, 28, 1]) # 改变x_data的格式转为4维的向量[batch,in_hight,in_width,in_channels]
# 第一层卷积与最大池化
w1 = tf.Variable(tf.truncated_normal([5, 5, 1, 32], stddev=0.1))  # 卷积核大小,5 * 5的卷积核,1表示输入为灰度图,也表示输入是一维的,32个卷积核
b1 = tf.Variable(tf.constant(0.1, shape=[32]))#一个卷积核给一个偏置项,赋值为0.1
j1 = tf.nn.conv2d(x_image, w1, strides=[1, 1, 1, 1], padding="SAME")#卷积层,步长为1,padding补0
h1 = tf.nn.relu(j1 + b1)#激活函数层,经过卷积之后加上偏置项
p1 = tf.nn.max_pool(h1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")#池化层,池化窗口的大小为2 * 2,所以步长也变为2

# 第二层卷积与最大池化
w2 = tf.Variable(tf.truncated_normal([5, 5, 32, 64], stddev=0.1)) #卷积核大小,
b2 = tf.Variable(tf.constant(0.1, shape=[64]))
h2 = tf.nn.relu(tf.nn.conv2d(p1, w2, strides=[1, 1, 1, 1], padding="SAME") + b2)
p2 = tf.nn.max_pool(h2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
# 紧密连接层一
# 将第二层max-pooling的输出连接成为一个一维向量,作为该层的输入。
wf1 = tf.Variable(tf.truncated_normal([7 * 7 * 64, 1024], stddev=0.1))
bf1 = tf.Variable(tf.constant(0.1, shape=[1024]))
fc1 = tf.nn.relu(tf.matmul(tf.reshape(p2, [-1, 7 * 7 * 64]), wf1) + bf1)

keep_prob = tf.placeholder(tf.float32)
fc1_drop = tf.nn.dropout(fc1, keep_prob=keep_prob)

# 紧密连接层二
# Softmax层:输出为10,输出的每一维都是图片y属于该类别的概率。
wf2 = tf.Variable(tf.truncated_normal([1024, 10], stddev=0.1))
bf2 = tf.Variable(tf.constant(0.1, shape=[10]))
y = tf.nn.softmax(tf.matmul(fc1_drop, wf2) + bf2)
# 建立训练模型
cross_entropy = tf.square(y - y_data)#平方差损失函数
loss = tf.reduce_mean(cross_entropy)
train = tf.train.AdamOptimizer(1e-4).minimize(loss)#自适应优化器

# 建立判断正确与统计模型
correct = tf.equal(tf.argmax(y_data, 1), tf.argmax(y, 1))  # 比较训练集中的结果与计算的结果,返回TRUE
accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))  # 因为correct返回为TRUE,转化为float32的1.0,对传入的整个batch求平均值,即为正确率

# 开始训练
init=tf.initialize_all_variables()
Testaccuracy=[]
testaccuracysum=0
Loss = []
with tf.Session() as sess:
    sess.run(init)
    start_time = time.clock()
    for i in range(1,2501):  # 训练次数
        batch = mnist.train.next_batch(batchsize)
        # 简单说一下keep_prob设置不同,在做判断与统计时,我们不做dropout,所以设1.0,但在训练时我们需要进行dropout,所以设为0.5
        sess.run(train, feed_dict={x_data: batch[0], y_data: batch[1], keep_prob: 0.5})
        Loss.append(sess.run(loss, feed_dict={x_data: batch[0], y_data: batch[1], keep_prob: 0.5}))
        # 对测试集进行测试
        if i % 500 == 0:
            end_time = time.clock()
            testaccuracy = sess.run(accuracy,feed_dict={x_data: mnist.test.images, y_data: mnist.test.labels, keep_prob: 1})
            print("第" + str(i) + "次运算的测试集识别率为" + str(testaccuracy) + '用时:' + str(end_time - start_time) + 's')
X = []
for i in range(len(Loss)):
    X.append(i)
plt.plot(X, Loss, color = 'r')
plt.title('损失函数图像')
plt.xlabel('轮数')
plt.ylabel('损失函数值')
plt.show()

最终画出的损失函数图像为:
在这里插入图片描述

利用tensorflow实现卷积神经网络来进行MNIST手写数字图像的分类。 #导入numpy模块 import numpy as np #导入tensorflow模块,程序使用tensorflow实现卷积神经网络 import tensorflow as tf #下载mnist数据集,并从mnist_data目录中读取数据 from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('mnist_data',one_hot=True) #(1)这里的“mnist_data” 是和当前文件相同目录下的一个文件夹。自己先手工建立这个文件夹,然后从https://yann.lecun.com/exdb/mnist/ 下载所需的4个文件(即该网址中第三段“Four files are available on this site:”后面的四个文件),并放到目录MNIST_data下即可。 #(2)MNIST数据集手写数字字符的数据集。每个样本都是一张28*28像素的灰度手写数字图片。 #(3)one_hot表示独热编码,其值被设为true。在分类问题的数据集标注时,如何不采用独热编码的方式, 类别通常就是一个符号而已,比如说是9。但如果采用独热编码的方式,则每个类表示为一个列表list,共计有10个数值,但只有一个为1,其余均为0。例如,“9”的独热编码可以为[00000 00001]. #定义输入数据x和输出y的形状。函数tf.placeholder的目的是定义输入,可以理解为采用占位符进行占位。 #None这个位置的参数在这里被用于表示样本的个数,而由于样本个数此时具体是多少还无法确定,所以这设为None。而每个输入样本的特征数目是确定的,即为28*28。 input_x = tf.placeholder(tf.float32,[None,28*28])/255 #因为每个像素的取值范围是 0~255 output_y = tf.placeholder(tf.int32,[None,10]) #10表示10个类别 #输入层的输入数据input_x被reshape成四维数据,其中第一维的数据代表了图片数量 input_x_images = tf.reshape(input_x,[-1,28,28,1]) test_x = mnist.test.images[:3000] #读取测试集图片的特征,读取3000个图片 test_y = mnist.test.labels[:3000] #读取测试集图片的标签。就是这3000个图片所对应的标签
是的,TensorFlow可以使用卷积神经网络CNN)来实现MNIST手写数字识别CNN是一种在图像处理和计算机视觉领域非常流行的神经网络结构,可以有效地提取图像中的特征并进行分类。 在TensorFlow中,可以使用tf.keras API构建CNN模型。以下是一个简单的CNN模型示例,用于识别MNIST手写数字: ``` python import tensorflow as tf # 加载MNIST数据集 mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() # 对数据进行预处理 x_train, x_test = x_train / 255.0, x_test / 255.0 # 构建CNN模型 model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Conv2D(64, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Conv2D(64, (3, 3), activation='relu'), tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ]) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(x_train.reshape(-1, 28, 28, 1), y_train, epochs=5, validation_data=(x_test.reshape(-1, 28, 28, 1), y_test)) # 评估模型 model.evaluate(x_test.reshape(-1, 28, 28, 1), y_test) ``` 该模型包括三个卷积层和两个全连接层,其中每个卷积层后面跟随一个最大池化层。该模型可以在MNIST测试集上达到约99%的准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值