TensorFlow手写字识别mnist入门篇(代码及详解)

本文介绍了一个基于TensorFlow的手写数字识别模型实现过程。利用MNIST数据集,通过搭建包含权重参数W、偏置值b及softmax函数的神经网络模型,实现了对手写数字的有效识别。文中详细展示了模型训练步骤,包括数据准备、模型搭建、损失函数定义、优化器选择等,并最终达到了91%的准确率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('/2017/python/',one_hot=True)


x = tf.placeholder("float",[None,784])

#先占个位,占个tensor,等着喂图片数据

#X的行可以任意取值,表示图片数量,可以1张1张取,也可100张100张取,很显然,每次取100张效率高一些


W = tf.Variable(tf.zeros([784,10]))#权重参数
#每一列784个像素点,共10列,每一列代表0~9数字,每一列的W1~W784像素点分别用于表示每个像素点对应该数字的权重值Weight,即每个数字都有784个权重值
b = tf.Variable(tf.zeros([10]))#每个数字对应的一个偏置值bias


y = tf.nn.softmax(tf.matmul(x,W)+b)#softmax函数将算出的10个数转换成每个数字的概率值,总和为1,即最后那个概率值高,即为该数字(我理解就是归一化)
#softmax概率化函数


y_ = tf.placeholder("float",[None,10])#占个tensor,等着喂数据,图片的label
#如果是数字1,y_=[0,1,0,0,0,0,0,0,0,0],one-hot vector


#交叉熵,衡量预测的标签y与真是标签y_的关系,描述真相的低效性
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
#因为本次学习,是以100张图片为一个batch,所以这里描述的是每100张图片预测性能的总和




train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
#最核心的一个步骤,这里选取了梯度下降优化器,目标是将交叉熵最小化
#可以选择很多种优化器


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




#argmax函数,argmax(input,axis,name,dimension)
#axis=0按列fetch最大值下标向量(=1按行),dimension功能与其相同,以axis优先


#equal函数,两个矩阵对应值相同,则返回布尔型True,否则返回布尔型False,返回与第一个矩阵维度相同
#这里返回预测数字标签和真实数字标签的对比情况


#cast函数,类型转换,cast(input,dtype,name),将输入数据转换成目标类型数据


#reduce_mean()函数,求平均值,这里相当于求分类的正确率
#每训练50次,对测试数据进行预测一次
for i in range(1000):
    batch_xs,batch_ys = mnist.train.next_batch(100)#每次fetch100张图片
    sess.run(train_step,feed_dict={x : batch_xs,y_ : batch_ys})
    correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float"))
    if i%50==0:
        print(i,sess.run(accuracy,feed_dict={x:mnist.test.images,y_:mnist.test.labels})) 


最后的准确率91%





        
### 使用TensorFlow实现MNIST写数字识别 以下是基于TensorFlow框架的写数字识别示例代码,该代码展示了如何加载MNIST数据集并构建一个简单的卷积神经网络模型来完成分类任务。 ```python import tensorflow as tf from tensorflow.keras import datasets, layers, models # 加载 MNIST 数据集 (train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data() # 对图像进行预处理:调整形状和归一化 train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255 test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255 # 构建卷积神经网络模型 model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) # 添加全连接层 model.add(layers.Flatten()) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(10, activation='softmax')) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 查看模型结构 model.summary() # 训练模型 model.fit(train_images, train_labels, epochs=5, batch_size=64) # 验证模型性能 test_loss, test_acc = model.evaluate(test_images, test_labels) print(f"测试集上的准确率: {test_acc}") ``` #### 关键点解析 - **数据预处理** MNIST数据集由灰度图像组成,其原始形状为 `(60000, 28, 28)` 和 `(10000, 28, 28)`。为了适配卷积神经网络的要求,需将其重塑为四维张量 `(样本数, 图像高度, 图像宽度, 颜色通道)` 并进行归一化操作[^2]。 - **模型架构设计** 卷积神经网络(CNN)被广泛应用于图像分类任务中。此代码定义了一个三层卷积层的模型,每层之后接最大池化层以减少特征图尺寸。最后通过 `Flatten` 将三维特征图展平成一维向量,并接入两层全连接层完成最终预测[^2]。 - **编译与训练配置** 使用Adam优化器以及稀疏交叉熵作为损失函数适合多分类场景下的目标函数设置。此外,在评估阶段引入了准确率指标用于衡量模型表现[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值