神经网络搭建(Pytorch)——train()

神经网络训练的主要步骤如下:

  1. 梯度清零:optimizer.zero_grad()
  2. 将数据喂入设备:inputs, labels = inputs.to(device), labels.to(device)
  3. 前向传播:outputs = model(inputs)
  4. 计算损失函数:loss = criterion(outputs, labels)
  5. 计算梯度:loss.backward()
  6. 更新可训练权重:optimizer.step()

定义 train() 函数:

import torch
import torch.nn as nn
import torch.optim as optim
from tqdm import tqdm

def train(tr_loader, val_loader, model, config, device):
	''' Model training '''
	# Define a loss function
	criterion = nn.CrossEntropyLoss()
	# Define an optimizer
	optimizer = getattr(torch.optim, config['optimizer'])(model.parameters(), **config['optim_hparas'])
	
	n_epochs = config['n_epochs']    # Mininum number of epochs
	loss_record = []
	val_acc_record = []
	val_acc = 0.0
	max_val_acc = 0.0
	early_stop_cnt = 0
	
	for epoch in range(n_epochs):
		model.train()
		tr_bar = tpdm(tr_loader)
		for step, data in enumerate(tr_bar):
			inputs, labels = data
			inputs, labels = inputs.to(device), labels.to(device)
			outputs = model(inputs)
			loss = criterion(outputs, labels)
			loss.backward()
			optimier.step()
			
			loss_record.append(loss.item())    # Record train_loss
			
			# Update train_bar
			tr_bar.desc = '[Train|{epoch+1:03d}/{n_epochs:03d} loss={loss:.3f}'

		val_acc = valid(val_loader, model, device)
		if val_acc > max_val_acc:
			max_val_acc = val_acc
			# save model if model improved
			torch.save(model.state_dict(), config['save_path'])
			early_stop_cnt = 0
		else:
			early_stop_cnt += 1    # 记录 acc 没有升高的 epoch 数

		val_acc_record.append(val_acc)
		if early_stop_cnt > config['early_stop']:
			# Stop train if acc difficultly improve
			break

	print('Finish training.')
	return loss_record, val_acc_record


def valid(val_loader, model, device):
	model.eval()    # Set model to evaluation mode
	acc = 0.0
	with torch.no_grad():
		val_bar = tqdm(val_loader)
		for data in val_bar:
			inputs, labels = data
			inputs, labels = inputs.to(device), labels.to(device)
			outputs = model(inputs)
			pred = torch.max(outputs, dim=1)[1]
			acc += (pred.argmax(dim=-1) == label).float().mean()
	return acc
### 使用 PyTorch 构建第一个神经网络 #### 安装必要的库 为了开始构建神经网络,首先需要确保已安装所需的 Python 库。可以通过以下命令来完成这些依赖项的安装: ```bash pip install torch torchvision torchaudio ``` 这将安装 PyTorch 及其配套工具集 `torchvision` 和 `torchaudio`。 #### 导入所需模块并设置设备配置 在编写任何代码之前,先导入必需的Python包,并设定运行环境(CPU 或 GPU),以便稍后能够高效地执行计算任务。 ```python import torch from torch import nn, optim from torch.utils.data import DataLoader, TensorDataset device = 'cuda' if torch.cuda.is_available() else 'cpu' print(f"Using {device} device") ``` #### 创建自定义的数据集和数据加载器 准备用于训练的数据非常重要。这里假设有一个简单的二元分类问题作为例子——预测明天是否会下雨。创建一个小型合成数据集,并将其封装到TensorDataset对象中,再利用DataLoader来进行批量处理。 ```python # 假设这是我们的特征矩阵X (n_samples, n_features) features = [[0.1], [0.2], ... , [0.9]] labels = [0, 1,..., 0] # 对应于每一天是否下雨(0=否; 1=是) dataset = TensorDataset(torch.tensor(features), torch.tensor(labels)) dataloader = DataLoader(dataset, batch_size=8, shuffle=True) ``` #### 设计模型架构 接下来设计一个具有单个隐藏层的小型前馈神经网络。该网络接收一维向量作为输入,并输出两个概率值表示两种可能的结果之一发生的可能性大小。 ```python class SimpleNN(nn.Module): def __init__(self): super(SimpleNN, self).__init__() self.hidden_layer = nn.Linear(in_features=1, out_features=5) # 输入维度为1,隐含单元数为5 self.output_layer = nn.Linear(in_features=5, out_features=2) # 输出类别数量为2 def forward(self, x): h_relu = self.hidden_layer(x).clamp(min=0) y_pred = self.output_layer(h_relu) return y_pred model = SimpleNN().to(device=device) ``` #### 配置优化算法与损失函数 选择合适的优化方法对于提高收敛速度至关重要;而交叉熵则常被用来衡量多类别的预测误差程度。在这里采用随机梯度下降法SGD及其变体Adam进行参数更新操作。 ```python loss_fn = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=1e-3) ``` #### 训练循环逻辑实现 最后一步就是反复迭代整个数据集,在每次遍历过程中调整权重使得总代价最小化直至满足特定条件为止。 ```python def train(dataloader, model, loss_fn, optimizer): size = len(dataloader.dataset) for batch, (X, y) in enumerate(dataloader): X, y = X.to(device), y.to(device) pred = model(X.float()) loss = loss_fn(pred, y.long()) optimizer.zero_grad() loss.backward() optimizer.step() if batch % 100 == 0: current_loss = loss.item() print(f"Batch [{batch:>5d}/{size//len(X):>5d}] Loss: {current_loss:.4f}") epochs = 5 for t in range(epochs): print(f"\nEpoch {t+1}\n-------------------------------") train(dataloader, model, loss_fn, optimizer) print("Training complete.") ``` 以上即为使用PyTorch框架搭建基础版全连接人工神经网络的主要流程概述[^1][^2][^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值