小白入门:通过手搓神经网络理解深度学习
神经网络就像一个小学生,而大模型就是大学生,不过一样可理解深度学习。如果你是小白(懂些编程知识),现在想在本地电脑上实现一个简单的神经网络并训练它,可以按照以下步骤操作试试。
说明:这是一个简单的神经网络,可以识别手写数字,达到约 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" 级数据集。
这种数据集的结构包含:
每张图像的规格:28×28 像素的灰度图(单通道),每个图像对应一个 0-9 的数字标签。
- 训练集:60,000 张手写数字图像(0-9)
- 测试集:10,000 张图像
例如,数字 "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博客