069. 编写一个函数,实现简单的神经网络模型

在 Python 中,可以使用 TensorFlowPyTorch 这样的深度学习框架来实现简单的神经网络模型。以下我们将分别使用这两个框架来实现一个简单的神经网络模型,用于分类任务。

安装依赖库

在开始之前,请确保你已经安装了 TensorFlowPyTorch。如果没有安装,可以通过以下命令安装:

pip install tensorflow torch torchvision

示例代码:使用 TensorFlow 实现简单的神经网络

以下代码使用 TensorFlow 和 Keras(TensorFlow 的高级 API)实现一个简单的神经网络模型,用于分类任务。

import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical

def simple_neural_network_tensorflow():
    # 加载 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

    train_labels = to_categorical(train_labels)
    test_labels = to_categorical(test_labels)

    # 构建简单的神经网络模型
    model = models.Sequential()
    model.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
    model.add(layers.Dense(10, activation='softmax'))

    # 编译模型
    model.compile(optimizer='rmsprop',
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])

    # 训练模型
    model.fit(train_images, train_labels, epochs=5, batch_size=128)

    # 评估模型
    test_loss, test_acc = model.evaluate(test_images, test_labels)
    print(f"测试集准确率: {test_acc:.4f}")

# 示例用法
if __name__ == "__main__":
    simple_neural_network_tensorflow()

示例代码:使用 PyTorch 实现简单的神经网络

以下代码使用 PyTorch 实现一个简单的神经网络模型,用于分类任务。

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

class SimpleNeuralNetwork(nn.Module):
    def __init__(self):
        super(SimpleNeuralNetwork, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 512)
        self.fc2 = nn.Linear(512, 10)

    def forward(self, x):
        x = x.view(-1, 28 * 28)  # 将图像展平
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

def simple_neural_network_pytorch():
    # 数据预处理
    transform = transforms.Compose([transforms.ToTensor(),
                                    transforms.Normalize((0.5,), (0.5,))])

    # 加载 MNIST 数据集
    train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
    test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)

    train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True)
    test_loader = DataLoader(test_dataset, batch_size=1000, shuffle=False)

    # 初始化模型、损失函数和优化器
    model = SimpleNeuralNetwork()
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.RMSprop(model.parameters(), lr=0.001)

    # 训练模型
    num_epochs = 5
    for epoch in range(num_epochs):
        model.train()
        for images, labels in train_loader:
            optimizer.zero_grad()
            outputs = model(images)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()

        print(f"Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}")

    # 评估模型
    model.eval()
    correct = 0
    total = 0
    with torch.no_grad():
        for images, labels in test_loader:
            outputs = model(images)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()

    print(f"测试集准确率: {100 * correct / total:.2f}%")

# 示例用法
if __name__ == "__main__":
    simple_neural_network_pytorch()

代码说明

TensorFlow 示例

数据加载与预处理

  • 使用 mnist.load_data() 加载 MNIST 数据集。

  • 将图像数据展平并归一化。

  • 将标签转换为 one-hot 编码。

模型构建

  • 使用 Sequential 构建模型。

  • 添加全连接层(Dense)和激活函数(relusoftmax)。

模型编译:使用 rmsprop 优化器和 categorical_crossentropy 损失函数。

模型训练与评估

  • 使用 fit 方法训练模型。

  • 使用 evaluate 方法评估模型性能。

PyTorch 示例

数据加载与预处理

  • 使用 torchvision.datasets.MNIST 加载 MNIST 数据集。

  • 使用 DataLoader 创建数据加载器。

模型定义:定义一个简单的神经网络模型,包含两个全连接层。

模型训练

  • 使用 CrossEntropyLoss 作为损失函数。

  • 使用 RMSprop 作为优化器。

  • 在训练过程中,对每个批次的数据进行前向传播、计算损失、反向传播和优化。

模型评估:在测试集上评估模型性能,计算准确率。

示例输出

假设运行上述代码,输出可能如下:

TensorFlow 输出

Epoch 1/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.2538 - accuracy: 0.9248
Epoch 2/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.1041 - accuracy: 0.9667
Epoch 3/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0712 - accuracy: 0.9768
Epoch 4/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0533 - accuracy: 0.9824
Epoch 5/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0412 - accuracy: 0.9867
313/313 [==============================] - 1s 2ms/step - loss: 0.0789 - accuracy: 0.9824
测试集准确率: 0.9824

PyTorch 输出

Epoch [1/5], Loss: 0.2538
Epoch [2/5], Loss: 0.1041
Epoch [3/5], Loss: 0.0712
Epoch [4/5], Loss: 0.0533
Epoch [5/5], Loss: 0.0412
测试集准确率: 98.24%

注意事项

  1. 数据预处理:在实际应用中,通常需要对数据进行更复杂的预处理,例如归一化、标准化、数据增强等。
  2. 模型复杂度:根据任务需求,可以构建更复杂的模型,例如添加更多层、使用卷积层(CNN)等。
  3. 超参数调整:调整学习率、批次大小、优化器等超参数,以提高模型性能。
  4. 设备选择:如果有 GPU,可以在 TensorFlow 和 PyTorch 中设置设备,加速训练过程。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)