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')
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)
【参考资料】这篇文章