# define model
class LinearNet(nn.Module):
def __init__(self, n_feature, n_output):
super(LinearNet, self).__init__()
self.linear = nn.Linear(n_feature, n_output)
def forward(self, x):
y = self.linear(x)
return y
net = LinearNet(input_num, output_num)
定义训练参数
lr = 0.03
loss = nn.MSELoss()
optimizer = torch.optim.SGD(net.parameters(), lr=lr)
num_epochs = 100
通过matplotlib可视化
在训练过程中保存中间结果,然后用matplotlib画出损失曲线
# define draw
def plotCurve(x_vals, y_vals,
x_label, y_label,
x2_vals=None, y2_vals=None,
legend=None,
figsize=(3.5, 2.5)):
# set figsize
plt.xlabel(x_label)
plt.ylabel(y_label)
plt.semilogy(x_vals, y_vals)
if x2_vals and y2_vals:
plt.semilogy(x2_vals, y2_vals, linestyle=':')
if legend:
plt.legend(legend)
# train and visualize
def train1(net, num_epochs, batch_size,
train_features, train_labels,
test_features, test_labels,
loss, optimizer):
print ("=== train begin ===")
# data process
train_dataset = Data.TensorDataset(train_features, train_labels)
test_dataset = Data.TensorDataset(test_features, test_labels)
train_iter = Data.DataLoader(train_dataset, batch_size, shuffle=True)
test_iter = Data.DataLoader(test_dataset, batch_size, shuffle=True)
# train by step
train_ls, test_ls = [], []
for epoch in range(num_epochs):
for x, y in train_iter:
ls = loss(net(x).view(-1, 1), y.view(-1, 1))
optimizer.zero_grad()
ls.backward()
optimizer.step()
# save loss for each step
train_ls.append(loss(net(train_features).view(-1, 1), train_labels.view(-1, 1)).item())
test_ls.append(loss(net(test_features).view(-1, 1), test_labels.view(-1, 1)).item())
if (epoch % 10 == 0):
print ("epoch %d: train loss %f, test loss %f" % (epoch, train_ls[-1], test_ls[-1]))
print ("final epoch: train loss %f, test loss %f" % (train_ls[-1], test_ls[-1]))
print ("plot curves")
plotCurve(range(1, num_epochs + 1), train_ls,
"epoch", "loss",
range(1, num_epochs + 1), test_ls,
["train", "test"]
)
print ("=== train end ===")
train1(net, num_epochs, batch_size, train_features, train_labels, test_features, test_labels, loss, optimizer)
结果如下
=== train begin ===
epoch 0: train loss 1.163743, test loss 1.123318
epoch 10: train loss 0.002227, test loss 0.001833
epoch 20: train loss 0.000107, test loss 0.000106
epoch 30: train loss 0.000101, test loss 0.000106
epoch 40: train loss 0.000100, test loss 0.000104
epoch 50: train loss 0.000101, test loss 0.000104
epoch 60: train loss 0.000100, test loss 0.000103
epoch 70: train loss 0.000101, test loss 0.000102
epoch 80: train loss 0.000100, test loss 0.000103
epoch 90: train loss 0.000103, test loss 0.000103
final epoch: train loss 0.000100, test loss 0.000102
plot curves
=== train end ===
# trian and record scalar
def train2(net, num_epochs, batch_size,
train_features, train_labels,
test_features, test_labels,
loss, optimizer):
print ("=== train begin ===")
# data process
train_dataset = Data.TensorDataset(train_features, train_labels)
test_dataset = Data.TensorDataset(test_features, test_labels)
train_iter = Data.DataLoader(train_dataset, batch_size, shuffle=True)
test_iter = Data.DataLoader(test_dataset, batch_size, shuffle=True)
# train by step
for epoch in range(num_epochs):
for x, y in train_iter:
ls = loss(net(x).view(-1, 1), y.view(-1, 1))
optimizer.zero_grad()
ls.backward()
optimizer.step()
# save loss for each step
train_loss = loss(net(train_features).view(-1, 1), train_labels.view(-1, 1)).item()
test_loss = loss(net(test_features).view(-1, 1), test_labels.view(-1, 1)).item()
# write to tensorboard
writer.add_scalar("train_loss", train_loss, epoch)
writer.add_scalar("test_loss", test_loss, epoch)
if (epoch % 10 == 0):
print ("epoch %d: train loss %f, test loss %f" % (epoch, train_loss, test_loss))
print ("final epoch: train loss %f, test loss %f" % (train_loss, test_loss))
print ("=== train end ===")
train2(net, num_epochs, batch_size, train_features, train_labels, test_features, test_labels, loss, optimizer)
结果如下
=== train begin ===
epoch 0: train loss 0.928869, test loss 0.978139
epoch 10: train loss 0.000948, test loss 0.000902
epoch 20: train loss 0.000102, test loss 0.000104
epoch 30: train loss 0.000101, test loss 0.000105
epoch 40: train loss 0.000101, test loss 0.000102
epoch 50: train loss 0.000100, test loss 0.000103
epoch 60: train loss 0.000101, test loss 0.000105
epoch 70: train loss 0.000102, test loss 0.000103
epoch 80: train loss 0.000104, test loss 0.000110
epoch 90: train loss 0.000100, test loss 0.000103
final epoch: train loss 0.000101, test loss 0.000104
=== train end ===