第五章 学习的机制 练习题

练习题目:将模型重新定义为 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')

输出:

显然效果不咋地

下一章将使用神经网络来解决问题。

猜你喜欢

转载自blog.csdn.net/weixin_45985148/article/details/124689225