【NLP复习】Pytorch现场手敲模型训练代码的模版

Pytorch现场手敲模型训练代码四大步骤:

  • 数据定义
  • 模型定义
  • loss和optim定义
  • 循环开训

一、数据定义

from torch.utils.data import Dataset
from torch.utils.data import DataLoader
import torch


class trainDataset(Dataset):
    def __init__(self):
        # 读入全部数据
        self.data = torch.Tensor([[[1.0], [0]], [[2.0], [0]], [[3.0], [1]], [[4.0], [2]], [[5.0], [3]]])
        print('执行了init方法', '\n')

    def __getitem__(self, index):
        # 给定index 返回其数据
        # print("执行了getitem方法, 返回数据 ", self.data[index], '\n')
        return self.data[index]

    def __len__(self):
        print('执行了len方法, 返回', self.data.shape[0], '\n')
        return self.data.shape[0]


dataset = trainDataset()  # 用咱自己的数据集加载类
dataLoader = DataLoader(dataset, shuffle=True, batch_size=2, drop_last=True) # drop_last=True解决数据集不能整除batchsize
for i, data in enumerate(dataLoader, start=0):
    # 后面构建训练过程会用到这两行
    x, y = data  # 获取一个batch的数据和标签
print('========== 数据加载已完成 ==========\n\n')

二、模型定义

from torch import nn


class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        print('调用了MyModel的init方法', '\n')
        self.linear = nn.Linear(1, 1)

    def forward(self, x):
        # 前向传播
        print('Feed forward !', '\n')
        y_pred = torch.sigmoid(self.linear(x))
        return y_pred


model = MyModel()
print(model)
print('========== 模型加载已完成 ==========\n\n')

三、loss和optim定义

from torch import optim

criterion = nn.BCELoss(reduction='sum')
optimizer = optim.Adam(model.parameters(),
                       lr=0.0001,
                       betas=(0.9, 0.999),
                       eps=1e-8,
                       weight_decay=0,
                       amsgrad=False)

四、循环开训

loss_list = []
def train(epoch):
    print('第%d个epoch训练开始' % epoch)
    # 一个epoch 遍历完所有数据
    for i, data in enumerate(dataLoader, start=0):
        x, y = data  # 获取一个batch的数据和标签
        print('当前batch中的x:', x)
        print('当前batch中的y:', y)
        y_pred = model(x)  # 前向传播
        loss = criterion(y_pred, y)  # 计算这个batch的loss
        loss_list.append(loss.item())
        print('当前batch的loss为', loss.item())
        optimizer.zero_grad()  # 本batch清零梯度(loss关于weight的导数变成0)
        loss.backward()  # 反向传播
        optimizer.step()  # 更新训练参数


for epoch in range(100):  # 训10个epoch
    print('第%d个epoch' % epoch)
    train(epoch)

print('========== 模型训练已完成 ==========\n\n')
print(loss_list)

附:完整代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 数据处理 - 模型构建 - 定义代价函数和优化器 - 构建训练过程

# 1.数据处理
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
import torch
from torch import nn
from torch import optim


class trainDataset(Dataset):
    def __init__(self):
        # 读入全部数据
        self.data = torch.Tensor([[[1.0], [0]], [[2.0], [0]], [[3.0], [1]], [[4.0], [2]], [[5.0], [3]]])
        print('执行了init方法', '\n')

    def __getitem__(self, index):
        # 给定index 返回其数据
        # print("执行了getitem方法, 返回数据 ", self.data[index], '\n')
        return self.data[index]

    def __len__(self):
        print('执行了len方法, 返回', self.data.shape[0], '\n')
        return self.data.shape[0]


dataset = trainDataset()  # 用咱自己的数据集加载类
dataLoader = DataLoader(dataset, shuffle=True, batch_size=2, drop_last=True) # drop_last=True解决数据集不能整除batchsize
print('========== 数据加载已完成 ==========\n\n')

# 2.模型构建
class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        print('调用了MyModel的init方法', '\n')
        self.linear = nn.Linear(1, 1)

    def forward(self, x):
        # 前向传播
        print('Feed forward !', '\n')
        y_pred = torch.sigmoid(self.linear(x))
        return y_pred


model = MyModel()
print(model)
print('========== 模型加载已完成 ==========\n\n')

# 3.定义代价函数和优化器
criterion = nn.BCELoss(reduction='sum')
optimizer = optim.Adam(model.parameters(),
                       lr=0.0001,
                       betas=(0.9, 0.999),
                       eps=1e-8,
                       weight_decay=0,
                       amsgrad=False)


# 4.构建训练过程
loss_list = []
def train(epoch):
    print('第%d个epoch训练开始' % epoch)
    # 一个epoch 遍历完所有数据
    for i, data in enumerate(dataLoader, start=0):
        x, y = data  # 获取一个batch的数据和标签
        print('当前batch中的x:', x)
        print('当前batch中的y:', y)
        y_pred = model(x)  # 前向传播
        loss = criterion(y_pred, y)  # 计算这个batch的loss
        loss_list.append(loss.item())
        print('当前batch的loss为', loss.item())
        optimizer.zero_grad()  # 本batch清零梯度(loss关于weight的导数变成0)
        loss.backward()  # 反向传播
        optimizer.step()  # 更新训练参数


for epoch in range(100):  # 训100个epoch
    print('第%d个epoch' % epoch)
    train(epoch)

print('========== 模型训练已完成 ==========\n\n')
print(loss_list)

【参考资料】这篇文章

你可能感兴趣的:(NLP校招总复习)