神经网络就像一个小学生,而大模型就是大学生,不过一样可理解深度学习。如果你是小白(懂些编程知识),现在想在本地电脑上实现一个简单的神经网络并训练它,可以按照以下步骤操作试试。
说明:这是一个简单的神经网络,可以识别手写数字,达到约 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 plt
plt.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 np
try:
# 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') / 255
test_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博客