当前位置: 首页 > ai >正文

小白入门:通过手搓神经网络理解深度学习

神经网络就像一个小学生,而大模型就是大学生,不过一样可理解深度学习。如果你是小白(懂些编程知识),现在想在本地电脑上实现一个简单的神经网络并训练它,可以按照以下步骤操作试试。

说明:这是一个简单的神经网络,可以识别手写数字,达到约 98% 的准确率。

首先请自行安装python环境。

然后安装所需的 Python 库:

pip install numpy matplotlib tensorflow

加载 MNIST 手写数字数据集: 

import tensorflow as tf
from tensorflow.keras.datasets import mnist# 加载MNIST数据集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()# 数据预处理
train_images = train_images.reshape((60000, 28 * 28)).astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28)).astype('float32') / 255# 打印数据形状
print(f"训练数据形状: {train_images.shape}")
print(f"测试数据形状: {test_images.shape}")

说明:MNIST(Modified National Institute of Standards and Technology)是一个广泛用于机器学习和计算机视觉的基准数据集,主要用于手写数字识别任务。它由美国国家标准与技术研究所(NIST)收集整理,后经修改和扩展,成为深度学习领域的 "Hello World" 级数据集。

这种数据集的结构包含:

  • 训练集:60,000 张手写数字图像(0-9)
  • 测试集:10,000 张图像
每张图像的规格:28×28 像素的灰度图(单通道),每个图像对应一个 0-9 的数字标签。

例如,数字 "5" 的图像可能长这样(简化示意图):

...............
...............
...............
......###......
......#.#......
......#.#......
......###......
......#........
......#........
......###......
...............
...............
...............

建一个简单的全连接神经网络:

from tensorflow.keras import models
from tensorflow.keras import layers# 定义模型架构
network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))  # 输入层+隐藏层
network.add(layers.Dense(10, activation='softmax')) # 输出层# 编译模型
network.compile(optimizer='rmsprop',    # 配置优化器loss='sparse_categorical_crossentropy', # 损失函数metrics=['accuracy'])   # 评估指标# 打印模型摘要
network.summary()

说明:上方代码里的 Sequential() 是用于构建神经网络的一种简单方式,它代表顺序模型(Sequential Model)。

顺序模型即线性堆叠结构:就像搭积木一样,你可以按顺序一层一层地添加神经网络层(如全连接层、卷积层、池化层等)。适用于大多数简单任务,每个层只有一个输入和一个输出。简单直观,易于使用。

上面的代码构建的神经网络:
输入层:接收 784 维向量(对应 28×28 像素的图像)
输出层:10 个神经元(对应 0-9 数字),使用 softmax 输出概率分布

使用准备好的数据训练网络:

# 训练模型
history = network.fit(train_images, train_labels, epochs=5, batch_size=128)# 绘制训练历史
import matplotlib.pyplot as pltplt.figure(figsize=(12, 4))   #创建一个新的图表窗口,大小为宽 12 英寸,高 4 英寸#共1行2列,选择第1个子图(左侧):准确率曲线
plt.subplot(1, 2, 1)          
#根据训练历史中数据,绘制训练准确率随训练轮次的变化曲线
plt.plot(history.history['accuracy'], label='Training Accuracy') #label即曲线图例的标签
plt.legend() #显示图例
plt.title('Training Accuracy')  #图例标题#同上,绘制右侧子图:损失率曲线
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Training Loss')
plt.legend()
plt.title('Training Loss')
#全部画好了 显示出来
plt.show()

测试数据评估模型性能:

# 评估模型
test_loss, test_acc = network.evaluate(test_images, test_labels)
print(f"测试集准确率: {test_acc:.4f}")# 预测示例
predictions = network.predict(test_images[:5])
for i in range(5):plt.figure()plt.imshow(test_images[i].reshape(28, 28), cmap='gray')plt.title(f"预测结果: {predictions[i].argmax()}")plt.axis('off')plt.show()

 最后 为了方便学习,全部代码汇总如下:

# 引用第三方库
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras import models
from tensorflow.keras import layers
import matplotlib.pyplot as plt
import numpy as nptry:# 1. 加载MNIST数据集(train_images, train_labels), (test_images, test_labels) = mnist.load_data()# 数据验证# 说明:train_images训练集,这里获取集合的样本数量(shape[0]第一维表示样本数)#      test_images则为测试集if train_images.shape[0] != 60000 or test_images.shape[0] != 10000:raise ValueError("数据集加载不正确,请检查TensorFlow版本或网络连接")# 2. 数据预处理train_images = train_images.reshape((60000, 28 * 28)).astype('float32') / 255test_images = test_images.reshape((10000, 28 * 28)).astype('float32') / 255# 3. 定义模型架构network = models.Sequential()network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))network.add(layers.Dense(10, activation='softmax'))# 4. 编译模型network.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 5. 训练模型history = network.fit(train_images, train_labels, epochs=5, batch_size=128)# 6. 评估模型test_loss, test_acc = network.evaluate(test_images, test_labels, verbose=0)print(f"测试集准确率: {test_acc:.4f}")# 7. 绘制训练历史plt.figure(figsize=(12, 4))plt.subplot(1, 2, 1)plt.plot(history.history['accuracy'], label='训练准确率')plt.xlabel('轮次')plt.ylabel('准确率')plt.legend()plt.subplot(1, 2, 2)plt.plot(history.history['loss'], label='训练损失')plt.xlabel('轮次')plt.ylabel('损失')plt.legend()plt.tight_layout()plt.savefig('training_history.png')plt.close()# 8. 预测示例predictions = network.predict(test_images[:5], verbose=0)for i in range(5):plt.figure()plt.imshow(test_images[i].reshape(28, 28), cmap='gray')plt.title(f"预测结果: {np.argmax(predictions[i])}")plt.axis('off')plt.tight_layout()plt.savefig(f'prediction_{i}.png')plt.close()print("训练和预测完成,结果已保存为图像文件")except tf.errors.NotFoundError:print("错误: TensorFlow库未找到,请确保已正确安装")
except ValueError as ve:print(f"数据错误: {ve}")
except Exception as e:print(f"发生未知错误: {e}")

运行说明

将上述代码保存为neural_network.py文件,然后在命令行中运行:python neural_network.py
程序会自动下载 MNIST 数据集并开始训练,训练完成后会显示准确率和预测示例图像。

你可以通过调整网络结构、增加训练轮数或使用更复杂的模型来进一步提高性能。如果你想更深度的学习,想继续手搓一个大模型,可以看下这个从零手搓中文大模型|Day01_litgpt llama-CSDN博客

http://www.xdnf.cn/news/15173.html

相关文章:

  • 6. JVM直接内存
  • 机器学习(ML)、深度学习(DL)、强化学习(RL)关系和区别
  • Linux之如何用contOs 7 发送邮件
  • LeetCode 3169.无需开会的工作日:排序+一次遍历——不需要正难则反,因为正着根本不难
  • 【Modern C++ Part9】Prefer-alias-declarations-to-typedefs
  • 【PTA数据结构 | C语言版】出栈序列的合法性
  • 使用FastAdmin框架开发二
  • Python 实战:构建 Git 自动化助手
  • 昇腾FAQ-A06-行业应用MindX相关
  • hiredis: 一个轻量级、高性能的 C 语言 Redis 客户端库
  • 【世纪龙科技】新能源汽车结构原理体感教学软件-比亚迪E5
  • 代码训练LeetCode(45)旋转图像
  • 知识蒸馏中的教师模型置信度校准:提升知识传递质量的关键路径
  • git版本发布
  • 企业选择大带宽服务器租用的原因有哪些?
  • 电商广告市场惊现“合规黑洞”,企业如何避免亿元罚单
  • Python后端项目之:我为什么使用pdm+uv
  • Java文件传输要点
  • QT跨平台应用程序开发框架(6)—— 常用显示类控件
  • 关于wpf的自适应
  • Elasticsearch 线程池
  • 【八股消消乐】Kafka集群 full GC 解决方案
  • 数据湖和数据库对比
  • Linux->基础IO
  • DVWA靶场通关笔记-反射型XSS(Reflected High级别)
  • 亚矩阵云手机:重构物流供应链,让跨境包裹“飞”得更快更准
  • (C++)STL标准库(vector动态数组)(list列表)(set集合)(map键值对)相关对比,基础教程
  • Linux中Gitee的使用
  • 杭州乐湾科技有限公司的背景、产品体系与技术能力的全方位深度分析
  • 三维点云Transformer局部感受野构建:理论、方法与挑战