pytorch学习笔记

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():

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值