最简单的深度学习网络模型python实现-识别手写数字

Foreword写在前面的话:

大家好,我是一名刚开始学习AI以及其算法的新手。这篇文章是我在学AI过程中的一些笔记和心得,希望能和同样在学习AI的朋友们分享。由于我的知识有限,文章中可能存在错误或不准确的地方,欢迎大家在评论区提出建议和指正。我非常期待大家的反馈,以便我能不断学习和进步。同时,我也会在文章中注明参考的资料,以示对原作者的尊重。

PS:本帖以记录学习心得和笔记为主,没有其他大博主那么专业,但是简单易懂^-^

本贴的其他相关学习笔记资料可以通过订阅专栏获取,喜欢的小伙伴可以多多点赞+关注呀!后续会 持续更新相关资源的~

本帖旨在分析该代码以及其背后的原理架构,代码并非手搓而成

该代码年代久远(目前尚未找到原作者),如有侵权请联系删除~

代码以及解析注释一并给到代码面板中了,如下图所示:

第一次运行(神经网络模型代码需要多次运行以达到训练的目的,从而提高其判别准确率):

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.models import Sequential

#Readme
#本代码运用多层感知机(MLP, Multi-Layer Perceptron):代码中构建了一个包含两个全连接层的神经网络模型。
# 第一层是 Flatten 层,将输入的 28×28 图像展平为 784 维的向量。
# 第二层是 Dense 层,包含 128 个神经元,激活函数为 ReLU(Rectified Linear Unit)。ReLU 是一种常用的非线性激活函数,能够加速网络的训练并避免梯度消失问题。
# 第三层是输出层,包含 10 个神经元(对应 10 个数字类别),没有显式指定激活函数。
# 2. adam优化算法


(x_train, y_train), (x_test, y_test) = mnist.load_data() #!!!加载MNIST数据集,源于tensorflow服务器
# 对每个像素值进行归一化(将图像数据归一至0~1之间,
x_train = x_train / 255.
x_test = x_test / 255.

# 将标签进行one-hot编码-输出层有10个神经元,因此depth=10
y_train = tf.one_hot(y_train, depth=10)
y_test = tf.one_hot(y_test, depth=10)

# 构建模型
model = Sequential([
    Flatten(input_shape=(28, 28)),
    Dense(128, activation='relu'),
    Dense(10)
])

# 编译模型
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

#损失函数
# 分类交叉熵损失(Categorical Cross-Entropy):由于这是一个多分类问题(10 个数字类别),代码中使用了分类交叉熵损失函数。它用于衡量模型输出的概率分布与真实标签的概率分布之间的差异。

#训练过程
# 前向传播(Forward Propagation):输入数据通过网络逐层传播,最终得到输出。
# 反向传播(Backpropagation):通过计算损失函数的梯度,更新网络的权重,以最小化损失函数。
# 随机梯度下降(SGD)变体:Adam 优化器本质上是一种改进的随机梯度下降方法,用于优化权重更新。

# 训练模型
model.fit(x_train, y_train, epochs=10, batch_size=32)

# 评估模型
acc_val = model.evaluate(x_test, y_test)[1]
print("Test Accuracy: {0}".format(acc_val))

# 预测第一个测试图像的类别
predictions = model.predict(x_test[0].reshape(1, 28, 28))
predicted_class = np.argmax(predictions, axis=1)
print("Predicted class:", predicted_class)

# 显示第一个测试图像
plt.imshow(x_test[0])
plt.show()

在powershell中运行的结果:

实际图片中的数字:

很明显答案错误,说明还需要再次训练降低loss function的值

第二次运行:

可见答案正确,训练完成。

最后,感谢每一位阅读这篇文章的朋友,你们的反馈对我来说非常宝贵。如果有任何问题或建议,请随时告诉我。让我们一起学习和进步吧!如果您喜欢我的内容,别忘了点赞和关注哦,我会定期分享更多有价值的信息。

相关推荐
Raas1001 小时前
MAI Gateway(魔芋企业级AI网关)技术揭秘:AI网关支持哪些模型?从原理到落地
大数据·人工智能·网关·gateway·mai gateway·企业级产品
qq5918406853 小时前
uiautomator2自动化安卓手机操作
python
豪气的程序猿3 小时前
电商图片工作流怎么选?Lingko AI 对比折叠键盘主图与详情页
人工智能
80s7773 小时前
动态代理和静态代理的区别,动态代理怎么提高网络安全性
python
小刘快学习3 小时前
把 AI 账单拆到部门:企业 AI 网关的精准分账思路
人工智能
浪子明X4 小时前
十六位账本怎样发现传输差错:Internet Checksum 生活类比
开发语言
米小虾4 小时前
你让监控模型读的思维链,可能是攻击者写好的剧本
人工智能
deepseek234 小时前
Iris 开源搜索智能体拆解:35B 与 397B 中文仅差 0.3 分,上下文管理胜过堆参数
人工智能·ai agent·开源模型
ai小陈4 小时前
CUDA Stream实战:让数据传输与GPU计算真正重叠
人工智能·深度学习·ai·pdf·云计算·gpu算力
v_34836087624 小时前
Android native端 堆栈打印
android·算法