1. 导入相应的包
import torch
import torch.nn as nn
2. 创建模型y=wx+b
class LinearModel(nn.Module):
def __init__(self, ndim):
super(LinearModel, self).__init__()
self.ndim = ndim
self.weight = nn.Parameter(torch.randn(ndim, 2))
self.bias = nn.Parameter(torch.randn(1))
def forward(self, x):
# y = wx + b
return x.mm(self.weight) + self.bias
3. 创建x
输入并输出y
lm = LinearModel(5)
x = torch.randn(4, 5)
lm(x)
4. 获取模型参数的生成器
lm.named_parameters()
5. 将生成器转换为列表
list(lm.named_parameters())
6. 将模型参数转移到gpu上
lm.cuda()
list(lm.parameters())
7. 转换模型参数为半精度浮点数
lm.half()
list(lm.named_parameters())
8.实战-预测波士顿房价
No | 属性 | 数据类型 | 字段描述 |
---|---|---|---|
1 | CRIM | Float | 城镇人均犯罪率 |
2 | ZN | Float | 占地面积超过2.5万平方英尺的住宅用地比例 |
3 | INDUS | Float | 城镇非零售业务地区的比例 |
4 | CHAS | Integer | 查尔斯河虚拟变量 (= 1 如果土地在河边;否则是0) |
5 | NOX | Float | 一氧化氮浓度(每1000万份) |
6 | RM | Float | 平均每居民房数 |
7 | AGE | Float | 在1940年之前建成的所有者占用单位的比例 |
8 | DIS | Float | 与五个波士顿就业中心的加权距离 |
9 | RAD | Integer | 辐射状公路的可达性指数 |
10 | TAX | Float | 每10,000美元的全额物业税率 |
11 | PTRATIO | Float | 城镇师生比例 |
12 | B | Float | 1000(Bk - 0.63)^ 2其中Bk是城镇黑人的比例 |
13 | LSTAT | Float | 人口中地位较低人群的百分数 |
14 | MEDV | Float | (目标变量/类别属性)以1000美元计算的自有住房的中位数 |
波士顿房价数据集共有506条数据,13个特征
8.1 通过sklearn
导入数据集
from sklearn .datasets import load_boston
8.2 读取数据,定义优化器、损失函数
boston = load_boston()
lm = LinearModel(13)
# 定义平方损失函数
criterion = nn.MSELoss()
# 定义优化器
optim = torch.optim.SGD(lm.parameters(), lr=1e-6)
# 将数据转换为tensor类型的数据
data = torch.tensor(boston["data"], requires_grad=True, dtype=torch.float32)
target = torch.tensor(boston["target"], dtype=torch.float32)
8.3 训练模型
for step in range(10000):
# 计算模型预测的结果
predict = lm(data)
# 计算损失函数
loss = criterion(predict, target)
# 每100步输出一次信息
if step and step % 1000 == 0:
print("Loss: {:.4f}".format(loss.item()))
# 梯度清零
optim.zero_grad()
# 反向传播
loss.backward()
optim.step()
9.使用tensorboard
查看训练结果
9.1 下载tensorboard
conda install tensorboard
pip install future
9.2 修改训练代码
from torch.utils.tensorboard import SummaryWriter
# tesorboard输出类
writer = SummaryWriter()
# 训练
for step in range(10000):
# 计算模型预测的结果
predict = lm(data)
# 计算损失函数
loss = criterion(predict, target)
writer.add_scalar("loss/train", loss, step)
# 输出权重图
writer.add_histogram("loss/weight", lm.weight, step)
writer.add_histogram("loss/bias", lm.bias, step)
# 每100步输出一次信息
if step and step % 1000 == 0:
print("Loss: {:.4f}".format(loss.item()))
# 梯度清零
optim.zero_grad()
# 反向传播
loss.backward()
optim.step()
9.3 打开tensorboard
# 打开cmd,运行
tensorboard --logdir run文件夹地址 --host=127.0.0.1
# 访问127.0.0.1:6006