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)
再来一个结果图

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

浙公网安备 33010602011771号