原文:https://mengwoods.github.io/post/dl/009-dl-fundamental-2/
基本规则:如果不知道使用哪种激活函数,可以简单地使用ReLU。对于输出层,二分类使用Sigmoid函数,多分类使用Softmax。
CNN专为处理结构化网格数据(如图像)而设计。它学习特征的空间层次,因此在图像分类、目标检测和语义分割等任务中效果显著。
CNN中的卷积层如何工作?
CNN的主要组成部分是什么?
介绍一些著名的CNN网络:
用PyTorch编写一个简单的神经网络,包括训练步骤和通过新输入数据进行验证。
这个脚本用于创建、训练和评估一个简单的神经网络模型。首先,您可以通过设置mode='train'在main函数中运行脚本来训练模型。在训练过程中,脚本将生成合成数据,定义网络结构,进行训练,并将训练后的模型保存到文件model.pth。如果您希望评估已训练的模型,则可以将mode设置为'eval',脚本将加载保存的模型并对新生成的输入数据进行预测,输出每个输入的特征和及其预测类别。通过调整mode参数,您可以在训练和评估模式之间切换。
# 引言 # 此脚本演示了使用PyTorch创建、训练和评估一个简单的神经网络。 # 生成的合成数据根据其特征和的特定规则,网络经过训练来分类这些数据。 # 脚本是模块化的,包括生成数据、定义模型、训练和评估的函数。 # main函数控制脚本运行在训练模式还是评估模式。 # 导入必要的库 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset # 生成具有某些底层规则的合成数据的函数 def generate_synthetic_data(num_samples, input_dim, num_classes): inputs = torch.randn(num_samples, input_dim) targets = torch.empty(num_samples, dtype=torch.long) for i in range(num_samples): feature_sum = inputs[i].sum().item() # 根据特征和的范围分配目标标签 if feature_sum < -10: targets[i] = 0 elif feature_sum < -5: targets[i] = 1 elif feature_sum < 0: targets[i] = 2 elif feature_sum < 5: targets[i] = 3 elif feature_sum < 10: targets[i] = 4 elif feature_sum < 15: targets[i] = 5 elif feature_sum < 20: targets[i] = 6 elif feature_sum < 25: targets[i] = 7 elif feature_sum < 30: targets[i] = 8 else: targets[i] = 9 return inputs, targets # 定义神经网络模型类 class SimpleNN(nn.Module): def __init__(self): super(SimpleNN, self).__init__() self.fc1 = nn.Linear(784, 128) # 全连接层,从784个神经元到128个神经元 self.fc2 = nn.Linear(128, 10) # 全连接层,从128个神经元到10个神经元 def forward(self, x): x = torch.relu(self.fc1(x)) # 在第一层之后应用ReLU激活函数 x = self.fc2(x) # 输出层,不使用激活函数 return x # 训练模型的函数 def train_model(model, dataloader, criterion, optimizer, num_epochs): for epoch in range(num_epochs): running_loss = 0.0 for batch_inputs, batch_targets in dataloader: optimizer.zero_grad() # 在反向传播之前清零梯度 outputs = model(batch_inputs) # 前向传播:计算输出 loss = criterion(outputs, batch_targets) # 计算损失 loss.backward() # 反向传播:计算梯度 optimizer.step() # 更新权重 running_loss += loss.item() * batch_inputs.size(0) # 累计损失以供监控 epoch_loss = running_loss / len(dataloader.dataset) # 计算平均损失 print(f'第 {epoch+1}/{num_epochs} 轮,损失: {epoch_loss:.4f}') print('训练完成。') # 评估模型的函数 def evaluate_model(model, inputs): model.eval() # 设置模型为评估模式 with torch.no_grad(): # 在推理过程中不需要计算梯度 predictions = model(inputs) for i in range(len(inputs)): print(f"输入 {i+1} 的和: {inputs[i].sum().item()}") print(f"预测 {i+1}: {predictions[i].argmax().item()}") print("-" * 50) # 主函数 def main(mode='train'): # 超参数 num_samples = 1000 input_dim = 784 num_classes = 10 batch_size = 64 learning_rate = 0.001 num_epochs = 100 # 生成合成数据 inputs, targets = generate_synthetic_data(num_samples, input_dim, num_classes) # 创建一个DataLoader以进行批处理 dataset = TensorDataset(inputs, targets) dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True) # 实例化模型 model = SimpleNN() # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() # 适用于具有多个类别的分类任务 optimizer = optim.Adam(model.parameters(), lr=learning_rate) # 学习率为0.001的Adam优化器 if mode == 'train': # 训练模型 train_model(model, dataloader, criterion, optimizer, num_epochs) # 保存模型状态字典 torch.save(model.state_dict(), 'model.pth') print("模型已保存到 'model.pth'") elif mode == 'eval': # 加载模型 model.load_state_dict(torch.load('model.pth')) print("模型已从 'model.pth' 加载") # 示例新输入数据 new_inputs = torch.randn(10, 784) # 10个新样本的批次,每个样本有784个特征 # 评估模型 evaluate_model(model, new_inputs) if __name__ == '__main__': main(mode='eval') # 根据需要设置为 'train' 或 'eval' 训练过程:
$ python pytorch.py Epoch 1/10, Loss: 2.2189 Epoch 2/10, Loss: 1.6003 Epoch 3/10, Loss: 1.2118 Epoch 4/10, Loss: 0.8805 Epoch 5/10, Loss: 0.5897 Epoch 6/10, Loss: 0.3645 Epoch 7/10, Loss: 0.2167 Epoch 8/10, Loss: 0.1331 Epoch 9/10, Loss: 0.0879 Epoch 10/10, Loss: 0.0624 Training complete. Model saved to 'model.pth' 使用过程:
$ python pytorch.py Model loaded from 'model.pth' Input 1 Sum: 39.23176193237305 Prediction 1: 4 -------------------------------------------------- Input 2 Sum: -3.4055228233337402 Prediction 2: 2 -------------------------------------------------- Input 3 Sum: 32.59678649902344 Prediction 3: 9 -------------------------------------------------- Input 4 Sum: 32.965431213378906 Prediction 4: 3 -------------------------------------------------- Input 5 Sum: -11.920291900634766 Prediction 5: 0 -------------------------------------------------- Input 6 Sum: -6.332043647766113 Prediction 6: 4 -------------------------------------------------- Input 7 Sum: -1.9515066146850586 Prediction 7: 0 -------------------------------------------------- Input 8 Sum: 7.156068801879883 Prediction 8: 5 -------------------------------------------------- Input 9 Sum: 2.85219669342041 Prediction 9: 0 -------------------------------------------------- Input 10 Sum: -20.769487380981445 Prediction 10: 3 --------------------------------------------------