代码:

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.代码中有部分优化(值未发生变化)

更多推荐