最简单的深度学习网络模型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的值

第二次运行:

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

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

相关推荐
山居秋暝LS38 分钟前
目标跟踪之sort算法(3)
python·算法·目标跟踪·sort
XianxinMao42 分钟前
AI视频生成技术:Sora的突破与挑战
人工智能
衫水1 小时前
在Windows系统中本地部署属于自己的大语言模型(Ollama + open-webui + deepseek-r1)
人工智能·windows·语言模型
西猫雷婶2 小时前
神经网络|(一)加权平均法,感知机和神经元
人工智能·深度学习·神经网络
{⌐■_■}2 小时前
【Validator】自定义字段、结构体补充及自定义验证,go案例讲解ReportError和errors.As在其中的使用
开发语言·golang·xcode
智识世界Intelligence2 小时前
探索与创新:DeepSeek R1与Ollama在深度研究中的应用
经验分享·深度学习·神经网络·自然语言处理·学习方法
python算法(魔法师版)4 小时前
C++游戏开发深度解析
开发语言·c++·c
浅淡云间.mzl5 小时前
1.1第1章DC/DC变换器的动态建模-1.1状态平均的概念--电力电子系统建模及控制 (徐德鸿)--读书笔记
笔记
siy23335 小时前
[c语言日寄]assert函数功能详解
c语言·开发语言·笔记·学习·算法
不停留5 小时前
贪心算法-跳跃游戏
前端·javascript·数据结构·算法·贪心算法