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

发布于:2025-07-13 ⋅ 阅读:(17) ⋅ 点赞:(0)

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

说明:这是一个简单的神经网络,可以识别手写数字,达到约 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 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博客


网站公告

今日签到

点亮在社区的每一天
去签到