from torch import nn, optim
from torch.utils.data import Dataset, DataLoader
import torch
# 数据集类
class MyDataset(Dataset):
def __init__(self, file):
with open(file, 'r', encoding='utf-8') as f:
self.data = f.readlines()
self.data = [line.strip().split(',') for line in self.data]
def __getitem__(self, index):
x = int(self.data[index][0]) # 输入数据
y = int(self.data[index][1]) # 目标数据
return torch.tensor(x, dtype=torch.float32), torch.tensor(y, dtype=torch.float32)
def __len__(self):
return len(self.data)
# 模型
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.net = nn.Sequential(
nn.Linear(10, 10),
)
def forward(self, x):
return self.net(x)
if __name__ == '__main__':
dataset = MyDataset('train_data.txt')
model = MyModel()
print(model)
data = DataLoader(dataset, batch_size=10, shuffle=True)
model = MyModel().to('cuda')
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)
n_epochs = 10
for epoch in range(n_epochs):
model.train() # 训练模式
for x, y in data:
x, y = x.to('cuda'), y.to('cuda')
optimizer.zero_grad() # 设置梯度为零
pred = model(x)
print(f"x:{x}")
print(f"y:{y}")
print(f"pred:{pred}")
loss = criterion(pred, y) # 计算损失
loss.backward() # 计算梯度(反向梯度)
optimizer.step() # 更新模型参数
# print(f'[{epoch + 1}/{n_epochs}], Loss: {loss.item():.4f}')
以上是我的代码x:tensor([40., 10., 45., 15., 35., 50., 55., 20., 25., 30.], device='cuda:0')
y:tensor([ 80., 20., 90., 30., 70., 100., 110., 40., 50., 60.],
device='cuda:0')
pred:tensor([-40.9228, -23.0146, -22.7525, 10.2778, -19.8213, 5.3241, 2.2468,
24.8815, -11.1552, 1.0356], device='cuda:0',
grad_fn=<ViewBackward0>)
x:tensor([15., 30., 25., 45., 55., 40., 20., 50., 10., 35.], device='cuda:0')
y:tensor([ 30., 60., 50., 90., 110., 80., 40., 100., 20., 70.],
device='cuda:0')
pred:tensor([24211.5664, 8633.0283, 22586.9766, 3976.1594, 17981.4492, 18973.1211,
21626.9746, 3057.3142, 12259.4131, 11827.8213], device='cuda:0',
grad_fn=<ViewBackward0>)
x:tensor([25., 45., 50., 55., 30., 10., 20., 35., 40., 15.], device='cuda:0')
y:tensor([ 50., 90., 100., 110., 60., 20., 40., 70., 80., 30.],
device='cuda:0')
pred:tensor([-5092356.5000, -1805359.6250, -4746004.5000, -818315.3125,
-3763448.5000, -3978626.5000, -4545977.0000, -622681.5000,
-2577487.2500, -2476017.2500], device='cuda:0',
grad_fn=<ViewBackward0>)
x:tensor([55., 10., 45., 20., 30., 35., 50., 25., 40., 15.], device='cuda:0')
y:tensor([110., 20., 90., 40., 60., 70., 100., 50., 80., 30.],
device='cuda:0')
pred:tensor([1.0268e+09, 3.6404e+08, 9.5698e+08, 1.6502e+08, 7.5886e+08, 8.0224e+08,
9.1664e+08, 1.2557e+08, 5.1973e+08, 4.9926e+08], device='cuda:0',
grad_fn=<ViewBackward0>)
x:tensor([55., 20., 45., 35., 50., 15., 30., 10., 25., 40.], device='cuda:0')
y:tensor([110., 40., 90., 70., 100., 30., 60., 20., 50., 80.],
device='cuda:0')
pred:tensor([-2.3151e+11, -8.2080e+10, -2.1577e+11, -3.7208e+10, -1.7110e+11,
-1.8088e+11, -2.0667e+11, -2.8312e+10, -1.1718e+11, -1.1257e+11],
device='cuda:0', grad_fn=<ViewBackward0>)
x:tensor([50., 25., 30., 35., 15., 40., 20., 55., 10., 45.], device='cuda:0')
y:tensor([100., 50., 60., 70., 30., 80., 40., 110., 20., 90.],
device='cuda:0')
pred:tensor([4.7832e+13, 1.6958e+13, 4.4579e+13, 7.6873e+12, 3.5350e+13, 3.7371e+13,
4.2700e+13, 5.8494e+12, 2.4211e+13, 2.3257e+13], device='cuda:0',
grad_fn=<ViewBackward0>)
x:tensor([35., 10., 45., 20., 15., 50., 55., 30., 25., 40.], device='cuda:0')
y:tensor([ 70., 20., 90., 40., 30., 100., 110., 60., 50., 80.],
device='cuda:0')
pred:tensor([-1.0547e+16, -3.7394e+15, -9.8300e+15, -1.6951e+15, -7.7949e+15,
-8.2405e+15, -9.4156e+15, -1.2898e+15, -5.3386e+15, -5.1283e+15],
device='cuda:0', grad_fn=<ViewBackward0>)
x:tensor([20., 55., 50., 40., 35., 10., 30., 25., 15., 45.], device='cuda:0')
y:tensor([ 40., 110., 100., 80., 70., 20., 60., 50., 30., 90.],
device='cuda:0')
pred:tensor([2.0787e+18, 7.3698e+17, 1.9374e+18, 3.3408e+17, 1.5363e+18, 1.6241e+18,
1.8557e+18, 2.5421e+17, 1.0522e+18, 1.0107e+18], device='cuda:0',
grad_fn=<ViewBackward0>)
x:tensor([45., 30., 25., 10., 35., 15., 40., 55., 50., 20.], device='cuda:0')
y:tensor([ 90., 60., 50., 20., 70., 30., 80., 110., 100., 40.],
device='cuda:0')
pred:tensor([-4.0529e+20, -1.4369e+20, -3.7773e+20, -6.5136e+19, -2.9953e+20,
-3.1665e+20, -3.6181e+20, -4.9563e+19, -2.0514e+20, -1.9706e+20],
device='cuda:0', grad_fn=<ViewBackward0>)
x:tensor([20., 50., 10., 25., 40., 55., 30., 35., 15., 45.], device='cuda:0')
y:tensor([ 40., 100., 20., 50., 80., 110., 60., 70., 30., 90.],
device='cuda:0')
pred:tensor([7.9816e+22, 2.8298e+22, 7.4388e+22, 1.2828e+22, 5.8988e+22, 6.2360e+22,
7.1252e+22, 9.7607e+21, 4.0400e+22, 3.8808e+22], device='cuda:0',
grad_fn=<ViewBackward0>)这是运行结果,但是训练的效果远不达预期,还越来越远,这是什么情况?