PyTorch的三个抽象层次
Tensor: 可以认为是 可以运行在GPU上的 numpy的array
通过 dtype = torch.cuda.FloatTensor
x = torch.randn(N,D_in).type(dtype) 使得在GPU上运行。
Variable: Node in a computational graph, 存储数据与梯度 data and gradient
1.设输入 x = Variable(torch.randn(N,D_in),requires_grad=False)
则 x.data is a Tensor ; x.grad is a Variable of gradients; x.grad.data is a Tensor of gradients
2. Variable 和 tensor 有相同的API
3. Variable 通过参数 requires_grad = True 就可以计算 weight matrix 的梯度
4. 每一次计算梯度前,要将上一次梯度清空 ,而且要记得要先判断,不然会报错 None type has no attribute data
if w1.grad: w1.grad.data.zero_()
Module: torch.nn
1. 像keras 一样的高级封装好的API,不需要打出computational graph
2. 用一连串的层数来定义模型 model: linear RuLu linear
1) y的预测值 y_pred = model( x )
2) backward前清空上次计算的梯度 model.zero_grad()
3) 更新weight matrix :
for param in model.parameters():
param.data -= learning_rate * para.grad.data
3. nn 自带loss_function
loss_fn = torch.nn.MESLoss(size_average=False)
for t in range(500):
loss = loss_fn(y_pred,y)
优化方法的运用 :
optimizer = torch.optim.Adam(model.parameters(), lr = learning_rate)
for t in range(500):
y_pred = model(x)
loss = loss_fn(y_pred,y)
optimizer.zero_grad()
loss.backward()
optimizer.step() # 在计算了所有梯度之后,更新所有的参数 weight matrix
定义自己的Module:
之后就可以用module
Class TwoLayerNet(torch.nn.Module):
def __init__(self,D_in,H,D_out):
super(TwoLayerNet,self).__init__()
self.linear1 = torch.nn.Linear(D_in,H)
self.linear2 = torch.nn.Linear(H,D_out)
def forward(self,x):
h = self.linear1(x)
h_relu = h.clamp(0)
y_pred = self.linear2(h_relu)
return y_pred
model = TwoLayerNet(D_in,H,D_out)
替换
model = model.nn.Sequential (
torch.nn.Linear(D_in,H),
torch.nn.ReLu(),
torch.nn.Linear(H,D_out)
)
注: super() 函数是用于调用父类(超类)的一个方法。 https://www.runoob.com/python/python-func-super.html
有了输入之后的网络:
loader = DataLoader(TensorDataset(x,y),batch_size = 8) # 一次读取8个样本
for epoch in range(10):
for x_batch,y_batch in loader:
x_var,y_var = Variable(x),Variable(y) # 其实这里我很疑惑,参数是不是Variable(x_batch )
y_pred = model(x_var)
loss = loss_fn(y_pred,y_var)
optimizer.zero_grad() # 清空梯度
loss_backward()
optimizer.step() # 更新 weight matrix
预训练
可视化 : Visdom 与tensorflow 的 tensorboard相似
静态图 tensorflow VS 动态图 pytorch