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

第二次运行:

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

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

相关推荐
旖旎夜光3 小时前
C++(17)
c++·学习
上进小菜猪4 小时前
基于 YOLOv8 的智能车牌定位检测系统设计与实现—从模型训练到 PyQt 可视化落地的完整实战方案
人工智能
Larry_Yanan4 小时前
Qt多进程(三)QLocalSocket
开发语言·c++·qt·ui
AI浩4 小时前
UNIV:红外与可见光模态的统一基础模型
人工智能·深度学习
GitCode官方4 小时前
SGLang AI 金融 π 对(杭州站)回顾:大模型推理的工程实践全景
人工智能·金融·sglang
醒过来摸鱼4 小时前
Java classloader
java·开发语言·python
superman超哥4 小时前
仓颉语言中元组的使用:深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
专注于大数据技术栈4 小时前
java学习--StringBuilder
java·学习
锦瑟弦音5 小时前
微信小游戏分包(cocos自带分包)
笔记·游戏
小鸡吃米…5 小时前
Python - 继承
开发语言·python