pytorch一般框架
import torch
N, D_in, H, D_out = 64, 1000, 100, 10 #64个数据,输入1000维,中间层100维,输出10维
# 1. 确定训练数据
x = torch.randn(N, D_in)
y = torch.randn(N, D_out)
# 2. 定义模型
class TwoLayerNet(torch.nn.Module):
#在init里定义模型的框架
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)
#在forward里定义前向传播的过程
def forward(self, x):
h_relu = self.linear1(x).clamp(min=0)
y_pred = self.linear2(h_relu)
return y_pred
model = TwoLayerNet(D_in, H, D_out)
# 另一种定义方式
model = nn.Sequential(
nn.Linear(D_in, H),
nn.ReLU(),
nn.Linear(H, D_out)
)
if torch.cuda.is_available():
model = model.cuda()
# 3. 定义Loss Function
loss_fn = nn.MSELoss(reduction = "sum")
# 4. 定义optimizer
optimizer = torch.optim.Adam(model.parameters(), lr = 1e-4)
# 5. 训练
for it in range(500):
if torch.cuda.is_available:
x = x.cuda()
y = y.cuda()
#前向传播
y_pred = model(x) #也可以写成model.forward(x)
#计算loss
loss = loss_fn(y_pred, y)
print(it, loss.item())
#求梯度的时候要清0,不清0会多次叠加
optimizer.zero_grad() #对应第一种
model.zero_grad() #对应第二种
#反向传播
loss.backward()
#更新参数
optimizer.step()
# 6. 测试集
testX =
Y =
if torch.cuda.is_available():
testX = test.cuda()
with torch.no_grad(): #测试的时候不需要保存计算图
testY = model(testX)
1. 加下划线的函数表示结果保存在y里面 eg. y.add_(x)
2. numpy和torch之间的转化
a = torch.ones(5)
b = a.numpy() //a和b共享内存,一起改变
a = np.ones(5)
b = torch.from_numpy(a)
3. add(a, 1, out=a),a=a+1和a.add_(a1)的区别:
out=a和a=a+1实际上是重新分配了一个新内存来保存a
4. 使用.to方法,Tensor可以被移动到别的device上,eg.GPU
if torch.cuda.is_available():
device = torch.device("cuda")
y = torch.ones_like(x, device = device)
x = x.to(device)//x放到GPU
x.to("cpu") //x放回CPU
在GPU上的数据不能直接转成numpy,需要先转到CPU上
5. ReLU函数的实现 clamp(min=0)
矩阵相乘是mm()
6. 所有的运算都是一张计算图,为了不让没有用的计算图占内存,要加上
with torch.no_grad():