PyTorch深度学习实战第六章代码交互式编程转普通py脚本(带注释) Jupyter Notebook代码转普通py代码
·
6.2.2回到线性模型:
import torch
import numpy as np
import matplotlib.pyplot as plt
import torch.nn as nn
t_c = [0.5,14.0,15.0,28.0,11.0,8.0,3.0,-4.0,6.0,13.0,21.0]
t_u = [35.7,55.9,58.2,81.9,56.3,48.9,33.9,21.8,48.4,60.4,68.4]
t_c = torch.tensor(t_c, dtype=torch.float32).unsqueeze(1) #仅添加声明数据类型
t_u = torch.tensor(t_u, dtype=torch.float32).unsqueeze(1)
n_samples = t_u.shape[0]
n_val = int(0.2 * n_samples)
shuffled_indices = torch.randperm(n_samples)
train_indices = shuffled_indices[:-n_val]
val_indices = shuffled_indices[-n_val:]
t_u_train = t_u[train_indices]
t_c_train = t_c[train_indices]
t_u_val = t_u[val_indices]
t_c_val = t_c[val_indices]
t_un_train = 0.1 * t_u_train
t_un_val = 0.1 * t_u_val
def training_loop(n_epochs,optimizer,model,loss_fn, t_u_train,t_u_val,t_c_train,t_c_val):
for n in range(1,n_epochs+1):
t_p_train =model(t_u_train)
loss_train = loss_fn(t_p_train,t_c_train)
t_p_val = model(t_u_val)
loss_val = loss_fn(t_p_val,t_c_val)
optimizer.zero_grad()
loss_train.backward()
optimizer.step()
if n % 1000 == 0 or n == 1:
print(f"Epoch {n}, Loss {loss_train.item():.4f},Validation loss{loss_val.item():.4f}")
return model.parameters()
if __name__ == "__main__":
#训练
linear_model = nn.Linear(1,1)
learning_rate = 1e-2 #学习率
opertimizer = torch.optim.SGD(linear_model.parameters(), lr=learning_rate)
n_epochs = 3000 #轮数
trained_params = training_loop(n_epochs, opertimizer,linear_model,nn.MSELoss(),t_un_train,t_un_val,t_c_train,t_c_val)
print(f"Trained parameters: w {linear_model.weight.item():.4f}, b {linear_model.bias.item():.4f}")

6.3最终完成一个神经网络
import torch
import numpy as np
import matplotlib.pyplot as plt
import torch.nn as nn
t_c = [0.5,14.0,15.0,28.0,11.0,8.0,3.0,-4.0,6.0,13.0,21.0]
t_u = [35.7,55.9,58.2,81.9,56.3,48.9,33.9,21.8,48.4,60.4,68.4]
t_c = torch.tensor(t_c, dtype=torch.float32).unsqueeze(1) #仅添加声明数据类型
t_u = torch.tensor(t_u, dtype=torch.float32).unsqueeze(1)
n_samples = t_u.shape[0]
n_val = int(0.2 * n_samples)
shuffled_indices = torch.randperm(n_samples)
train_indices = shuffled_indices[:-n_val]
val_indices = shuffled_indices[-n_val:]
t_u_train = t_u[train_indices]
t_c_train = t_c[train_indices]
t_u_val = t_u[val_indices]
t_c_val = t_c[val_indices]
t_un_train = 0.1 * t_u_train
t_un_val = 0.1 * t_u_val
def training_loop(n_epochs,optimizer,model,loss_fn, t_u_train,t_u_val,t_c_train,t_c_val):
for n in range(1,n_epochs+1):
t_p_train =model(t_u_train)
loss_train = loss_fn(t_p_train,t_c_train)
t_p_val = model(t_u_val)
loss_val = loss_fn(t_p_val,t_c_val)
optimizer.zero_grad()
loss_train.backward()
optimizer.step()
if n % 1000 == 0 or n == 1:
print(f"Epoch {n}, Loss {loss_train.item():.4f},Validation loss{loss_val.item():.4f}")
return model.parameters()
if __name__ == "__main__":
#训练
seq_model = nn.Sequential(#输出张量大小为13的隐藏层,文中最后结果为8,可自行修改
nn.Linear(1, 13),
nn.Tanh(),
nn.Linear(13, 1)
)
# seq_model = nn.Sequential( #输出张量大小为8的隐藏层,文中最后结果为8,可自行修改
# nn.Linear(1, 8),
# nn.Tanh(),
# nn.Linear(8, 1)
# )
learning_rate = 1e-3 #学习率
opertimizer = torch.optim.SGD(seq_model.parameters(), lr=learning_rate)
n_epochs = 5000 #轮数
trained_params = training_loop(n_epochs, opertimizer,seq_model,nn.MSELoss(),t_un_train,t_un_val,t_c_train,t_c_val)
print('output',seq_model(t_un_val))
print('answer',t_c_val)
print('hidden',seq_model[0].weight.grad)
# 绘制原始数据与拟合曲线
import matplotlib.pyplot as plt
x_lin = torch.linspace(float(t_u.min()), float(t_u.max()), 200).unsqueeze(1)
with torch.no_grad():
y_pred = seq_model(0.1 * x_lin)
x_np = x_lin.squeeze().numpy()
y_pred_np = y_pred.squeeze().numpy()
t_u_np = t_u.squeeze().numpy()
t_c_np = t_c.squeeze().numpy()
plt.figure(figsize=(8,6))
plt.scatter(t_u_np, t_c_np, color='red')
plt.plot(x_np, y_pred_np, color='blue')
plt.xlabel('temperature(°F)')
plt.ylabel('temperature(°C)')
plt.legend()
plt.grid(True)
plt.show()

更多推荐
所有评论(0)