练习题目:将模型重新定义为 w2*t_u**2 + w1*t_u + b 评估改进后的效果。
###创建模型
def model(t_u, w1, w2, b):
return w2*t_u**2 + w1*t_u + b
###定义损失函数
def loss_fn(t_p, t_c):
squared_diffs = (t_p - t_c)**2
return squared_diffs.mean()
##训练、验证与过拟合
#分割数据集获取索引张量
n_samples = t_u.shape[0]
n_val = int(0.2 * n_samples)
shuffled_indices = torch.randperm(n_samples)##randperm()函数将张量元素打乱进行重排列
train_indices = shuffled_indices[:-n_val]
val_indices = shuffled_indices[-n_val:]
print(train_indices,val_indices)
#使用索引张量构建训练集与验证集
train_t_u = t_u[train_indices]
train_t_c = t_c[train_indices]
val_t_u = t_u[val_indices]
val_t_c = t_c[val_indices]
train_t_un = 0.1 * train_t_u
val_t_un = 0.1 * val_t_u
train_loss_list = []
val_loss_list = []
epoch_list = []
def training_loop(n_epochs, optimizer, params, train_t_u, train_t_c, val_t_u, val_t_c):
for epoch in range(1, n_epochs + 1):
train_t_p = model(train_t_u ,*params)
train_loss = loss_fn(train_t_p, train_t_c)
val_t_p = model(val_t_u, *params)
val_loss = loss_fn(train_t_p, train_t_c)
val_loss_list.append(val_loss.item())
optimizer.zero_grad()
train_loss.backward() #仅在训练集上训练模型
optimizer.step()
train_loss_list.append(train_loss.item())
if epoch < 3 or epoch % 500 == 0:
epoch_list.append(epoch)
print(f"Epoch {epoch},Training loss {train_loss.item():.4f},"f"Validation loss {val_loss.item():.4f}")
plt.plot(train_loss_list)
plt.xlabel('epoch')
plt.ylabel('train loss')
plt.title("Training loss")
plt.show()
plt.plot(val_loss_list)
plt.xlabel('epoch')
plt.ylabel('val loss')
plt.title("Validation loss")
plt.show()
return params
params = torch.tensor([1.0,1.0,0.0],requires_grad=True)
learning_rate = 1e-2
optimizer = optim.Adam([params], lr = learning_rate)
training_loop(
n_epochs=3000,
optimizer = optimizer,
params = params,
train_t_u = train_t_un,
train_t_c = train_t_c,
val_t_u = val_t_un,
val_t_c = val_t_c)
注:注意修改模型后,初始化参数需要输入三个值,这里输入的是:[1.0,1.0,0.0]
输出:
再次可视化数据看看效果:
###再次可视化数据
%matplotlib inline
from matplotlib import pyplot as plt
t_p = model(t_un, *params)
fig = plt.figure(dpi=500)
plt.xlabel("Temperature (°Fahrenheit)")
plt.ylabel("Temperature (°Celsius)")
plt.plot(t_u.numpy(), t_p.detach().numpy())##.detach()
plt.plot(t_u.numpy(), t_c.numpy(),'o')
输出:
显然效果不咋地
下一章将使用神经网络来解决问题。