PyTorch深度学习实战第五章代码交互式编程转普通py脚本(带注释) Jupyter Notebook代码转普通py代码
·
代码:
import torch
import numpy as np
import matplotlib.pyplot as plt
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) #仅添加声明数据类型
t_u = torch.tensor(t_u, dtype=torch.float32)
def model(t_u, w, b):
return w * t_u + b
def loss_fn(t_p, t_c):
return ((t_p - t_c) ** 2).mean()
def dloss_dtp(t_p, t_c):
return 2.0 * (t_p - t_c) / t_p.numel()
def grad_fn(t_u, t_c, t_p):
dloss_dt = dloss_dtp(t_p, t_c)
dloss_dw = (dloss_dt * t_u).sum() #小幅修改,结果与原值一样
dloss_db = dloss_dt.sum() #原值dmodel/db = 1因此省略
return torch.stack([dloss_dw, dloss_db])
def training_loop(n_epochs, learning_rate, params, t_u, t_c):
for n in range(n_epochs):
w, b = params[0], params[1]
t_p = model(t_u, w, b)
loss = loss_fn(t_p, t_c)
grad = grad_fn(t_u, t_c, t_p)
params = params - learning_rate * grad
if (n + 1) % 100 == 0 or n == 0:
print(f"Epoch {n+1}, Loss {loss.item():.4f}, w {params[0].item():.4f}, b {params[1].item():.4f}")
return params
if __name__ == "__main__":
#训练
params = torch.tensor([1.0, 0.0], dtype=torch.float32)
learning_rate = 1e-4 #学习率
n_epochs = 350000 #轮数
trained_params = training_loop(n_epochs, learning_rate, params, t_u, t_c)
print(f"Trained parameters: w {trained_params[0].item():.4f}, b {trained_params[1].item():.4f}")
#画图
t_u_np = t_u.numpy()
t_c_np = t_c.numpy()
w = trained_params[0].item()
b = trained_params[1].item()
u_line = np.linspace(t_u_np.min(), t_u_np.max(), 100)
t_p_line = w * u_line + b
plt.figure(figsize=(8, 6))
plt.scatter(t_u_np, t_c_np, color='red', label='Data (t_u vs t_c)')
plt.plot(u_line, t_p_line, color='blue', label=f'Predicted: t = {w:.4f} * u + {b:.4f}')
plt.xlabel('t_u')
plt.ylabel('Temperature (°C)')
plt.title('Data and Learned Linear Model')
plt.grid(True)
plt.show()
5.5.1自动计算梯度代码
import torch
import numpy as np
import matplotlib.pyplot as plt
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) #仅添加声明数据类型
t_u = torch.tensor(t_u, dtype=torch.float32)
def model(t_u, w, b):
return w * t_u + b
def loss_fn(t_p, t_c):
return ((t_p - t_c) ** 2).mean()
# def dloss_dtp(t_p, t_c):
# return 2.0 * (t_p - t_c) / t_p.numel()
# def grad_fn(t_u, t_c, t_p):
# dloss_dt = dloss_dtp(t_p, t_c)
# dloss_dw = (dloss_dt * t_u).sum() #小幅修改,结果与原值一样
# dloss_db = dloss_dt.sum() #原值dmodel/db = 1因此省略
# return torch.stack([dloss_dw, dloss_db])
def training_loop(n_epochs, learning_rate, params, t_u, t_c):
for n in range(1,n_epochs+1):
if params.grad is not None:
params.grad.zero_()
t_p =model(t_u,*params)
loss = loss_fn(t_p, t_c)
loss.backward()
with torch.no_grad():
params -= learning_rate * params.grad
if n % 1000 == 0 or n == 1:
print(f"Epoch {n}, Loss {loss.item():.4f}, w {params[0].item():.4f}, b {params[1].item():.4f}")
return params
if __name__ == "__main__":
#训练
params = torch.tensor([1.0, 0.0],requires_grad=True,dtype=torch.float32)
learning_rate = 1e-4 #学习率
n_epochs = 350000 #轮数
trained_params = training_loop(n_epochs, learning_rate, params, t_u, t_c)
print(f"Trained parameters: w {trained_params[0].item():.4f}, b {trained_params[1].item():.4f}")
#画图
t_u_np = t_u.numpy()
t_c_np = t_c.numpy()
w = trained_params[0].item()
b = trained_params[1].item()
u_line = np.linspace(t_u_np.min(), t_u_np.max(), 100)
t_p_line = w * u_line + b
plt.figure(figsize=(8, 6))
plt.scatter(t_u_np, t_c_np, color='red', label='Data (t_u vs t_c)')
plt.plot(u_line, t_p_line, color='blue', label=f'Predicted: t = {w:.4f} * u + {b:.4f}')
plt.xlabel('t_u')
plt.ylabel('Temperature (°C)')
plt.title('Data and Learned Linear Model')
plt.grid(True)
plt.show()
5.5.2优化器
梯度下降优化器:
import torch
import numpy as np
import matplotlib.pyplot as plt
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) #仅添加声明数据类型
t_u = torch.tensor(t_u, dtype=torch.float32)
def model(t_u, w, b):
return w * t_u + b
def loss_fn(t_p, t_c):
return ((t_p - t_c) ** 2).mean()
# def dloss_dtp(t_p, t_c):
# return 2.0 * (t_p - t_c) / t_p.numel()
# def grad_fn(t_u, t_c, t_p):
# dloss_dt = dloss_dtp(t_p, t_c)
# dloss_dw = (dloss_dt * t_u).sum() #小幅修改,结果与原值一样
# dloss_db = dloss_dt.sum() #原值dmodel/db = 1因此省略
# return torch.stack([dloss_dw, dloss_db])
def training_loop(n_epochs,optimizer,learning_rate, params, t_u, t_c):
for n in range(1,n_epochs+1):
if params.grad is not None:
params.grad.zero_()
t_p =model(t_u,*params)
loss = loss_fn(t_p, t_c)
loss.backward()
optimizer.step()
with torch.no_grad():
params -= learning_rate * params.grad
if n % 1000 == 0 or n == 1:
print(f"Epoch {n}, Loss {loss.item():.4f}, w {params[0].item():.4f}, b {params[1].item():.4f}")
return params
if __name__ == "__main__":
#训练
params = torch.tensor([1.0, 0.0],requires_grad=True,dtype=torch.float32)
learning_rate = 1e-4 #学习率
opertimizer = torch.optim.SGD([params], lr=learning_rate)
n_epochs = 170000 #轮数,未使用优化器前是350000
trained_params = training_loop(n_epochs, opertimizer,learning_rate, params, t_u, t_c)
print(f"Trained parameters: w {trained_params[0].item():.4f}, b {trained_params[1].item():.4f}")
#画图
t_u_np = t_u.numpy()
t_c_np = t_c.numpy()
w = trained_params[0].item()
b = trained_params[1].item()
u_line = np.linspace(t_u_np.min(), t_u_np.max(), 100)
t_p_line = w * u_line + b
plt.figure(figsize=(8, 6))
plt.scatter(t_u_np, t_c_np, color='red', label='Data (t_u vs t_c)')
plt.plot(u_line, t_p_line, color='blue', label=f'Predicted: t = {w:.4f} * u + {b:.4f}')
plt.xlabel('t_u')
plt.ylabel('Temperature (°C)')
plt.title('Data and Learned Linear Model')
plt.grid(True)
plt.show()
Adam优化器:
import torch
import numpy as np
import matplotlib.pyplot as plt
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) #仅添加声明数据类型
t_u = torch.tensor(t_u, dtype=torch.float32)
def model(t_u, w, b):
return w * t_u + b
def loss_fn(t_p, t_c):
return ((t_p - t_c) ** 2).mean()
# def dloss_dtp(t_p, t_c):
# return 2.0 * (t_p - t_c) / t_p.numel()
# def grad_fn(t_u, t_c, t_p):
# dloss_dt = dloss_dtp(t_p, t_c)
# dloss_dw = (dloss_dt * t_u).sum() #小幅修改,结果与原值一样
# dloss_db = dloss_dt.sum() #原值dmodel/db = 1因此省略
# return torch.stack([dloss_dw, dloss_db])
def training_loop(n_epochs,optimizer,learning_rate, params, t_u, t_c):
for n in range(1,n_epochs+1):
if params.grad is not None:
params.grad.zero_()
t_p =model(t_u,*params)
loss = loss_fn(t_p, t_c)
loss.backward()
optimizer.step()
with torch.no_grad():
params -= learning_rate * params.grad
if n % 1000 == 0 or n == 1:
print(f"Epoch {n}, Loss {loss.item():.4f}, w {params[0].item():.4f}, b {params[1].item():.4f}")
return params
if __name__ == "__main__":
#训练
params = torch.tensor([1.0, 0.0],requires_grad=True,dtype=torch.float32)
learning_rate = 1e-4 #学习率
opertimizer = torch.optim.Adam([params], lr=learning_rate)
n_epochs = 90000 #轮数,未使用优化器前是350000,使用SGD是170000
trained_params = training_loop(n_epochs, opertimizer,learning_rate, params, t_u, t_c)
print(f"Trained parameters: w {trained_params[0].item():.4f}, b {trained_params[1].item():.4f}")
#画图
t_u_np = t_u.numpy()
t_c_np = t_c.numpy()
w = trained_params[0].item()
b = trained_params[1].item()
u_line = np.linspace(t_u_np.min(), t_u_np.max(), 100)
t_p_line = w * u_line + b
plt.figure(figsize=(8, 6))
plt.scatter(t_u_np, t_c_np, color='red', label='Data (t_u vs t_c)')
plt.plot(u_line, t_p_line, color='blue', label=f'Predicted: t = {w:.4f} * u + {b:.4f}')
plt.xlabel('t_u')
plt.ylabel('Temperature (°C)')
plt.title('Data and Learned Linear Model')
plt.grid(True)
plt.show()
代码说明
1.代码中训练轮数已经调整至最优
2.代码中有部分优化(值未发生变化)
更多推荐
所有评论(0)