Loading

Pytorch实现华氏度转摄氏度

pytorch实现 华氏度转摄氏度

import torch
# 可以理解为 key 和value 。本质上是华氏度与摄氏度关系
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]


def model(t_u, w, b):
    """
    建立模型
    :param t_u: 原来的,可以认为是key
    :param w:
    :param b:
    :return:
    """
    return t_u * w + b


def lossfn(t_p, t_c) -> torch.Tensor:
    """
    计算误差
    :param t_p:
    :param t_c:
    :return:
    """
    temp = (t_p - t_c) ** 2
    return temp.mean()


def training_loop(epochs: int, optimizer: torch.optim.Optimizer, params, train_u, train_c, val_u, val_c):
    for epoch in range(1, epochs + 1):
        t_p = model(train_u, *params)
        loss = lossfn(t_p, train_c)

        # 在这个with 块内,不生成计算图
        with torch.no_grad():
            v_p = model(val_u, *params)
            v_loss = lossfn(v_p, val_c)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if epoch <= 3 or epoch % 500 == 0:
            print("训练轮数{},训练集误差{},测试集误差{}".format(epoch, loss, v_loss))
    print(params)


if __name__ == '__main__':
    t_c = torch.tensor(t_c).cuda()
    t_u = torch.tensor(t_u).cuda()
    n_samples = t_u.shape[0]
    n_val = int(0.2 * n_samples)
    shuffled_indices = torch.randperm(n_samples)

    train_u = t_u[shuffled_indices[:-n_val]] * 0.1
    train_c = t_c[shuffled_indices[:-n_val]]
    val_u = t_u[shuffled_indices[-n_val:]] * 0.1
    val_c = t_c[shuffled_indices[-n_val:]]

    learning_rate = 1e-2
    params = torch.tensor([1.0, 0.0]).cuda()
    params.requires_grad = True
    sgd = torch.optim.SGD(params=[params], lr=learning_rate)

    training_loop(epochs=3000, optimizer=sgd, params=params, train_u=train_u, train_c=train_c, val_u=val_u, val_c=val_c)

再来一个结果图

第一个完整参考代码写出来的机器学习内容,万岁!

posted @ 2022-10-13 16:22  翙翙其羽  阅读(50)  评论(0)    收藏  举报