PyTorch学习日志_20201029_基础操作

日期:2020.10.29
主题:PyTorch入门
内容:

  • 根据PyTorch官方教程文档,学习PyTorch基础操作(主要与张量相关)。

  • 根据自己的理解和试验,为代码添加少量注解。

具体代码如下 ↓

from __future__ import print_function
import torch
import numpy as np

# {入门}

# 【张量】

# 创建一个没有初始化的5*3矩阵
x = torch.empty(5, 3)   
print(x)


# 创建一个随机初始化矩阵
x = torch.rand(5, 3)    
print(x)


# 构造一个填满0且数据类型为long的矩阵
x = torch.zeros(5, 3, dtype=torch.long)     
print(x)
print('-'*40)


# 直接从数据构造张量
x = torch.tensor([5.5, 3])  
print(x)
print('-'*40)


# 根据已有的tensor建立新的tensor。
# 除非用户提供新的值,否则这些方法将重用输入张量的属性,例如dtype等。
x = x.new_ones(5, 3, dtype=torch.double)      # new_* methods take in sizes
print(x)
x = torch.randn_like(x, dtype=torch.float)    # 重载 dtype!
print(x)                                      # 结果size一致


# 获取张量的形状
print(x.size())     # torch.Size本质上还是tuple,支持tuple的一切操作。
print('-'*40)


# 【运算】

# 加法:形式一
y = torch.rand(5, 3)
print(x + y)

# 加法:形式二
print(torch.add(x, y))

# 加法:给定一个输出张量作为参数
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)

# 加法:原位/原地操作(in-place)
y.add_(x)   # 任何一个in-place改变张量的操作后面都固定一个_。例如x.copy_(y)、x.t_()将更改x
print(y)
print('-'*40)


# 像标准的NumPy一样的各种索引操作
print(x[:, 1])  # 输出第1列元素
print('-'*40)


# 改变形状
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)   # the size -1 is inferred from other dimensions
w1 = x.view(-1)     # x.view(-1)把x降维成一维向量
w2 = x.view(-1, 2)  # x.view(-1, 2)先降维,后按2个元素为一组的方式分配
print(x.size(), y.size(), z.size(), w1.size(), w2.size())


# 仅包含一个元素的tensor,可以使用.item()来得到对应的python数值
x = torch.randn(1)
print(x)
print(x.item())


# {桥接 NumPy}
# Torch张量和NumPy数组将共享它们的底层内存位置,同步变化

# 将torch的Tensor转化为NumPy数组
a = torch.ones(5)
print(a)
b = a.numpy()
print(b)
a.add_(1)
print(a)
print(b)
print('-'*40)

# 将NumPy数组转化为Torch张量
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)
# CPU上的所有张量(CharTensor除外)都支持与Numpy的相互转换。


# {CUDA上的张量}
# 张量可以使用.to方法移动到任何设备(device)上

# 当GPU可用时,我们可以运行以下代码
# 我们将使用`torch.device`来将tensor移入和移出GPU
if torch.cuda.is_available():
    device = torch.device("cuda")          # a CUDA device object
    y = torch.ones_like(x, device=device)  # 直接在GPU上创建tensor
    x = x.to(device)                       # 或者使用`.to("cuda")`方法
    z = x + y
    print(z)
    print(z.to("cpu", torch.double))       # `.to`也能在移动时改变dtype


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用PyTorch构建多任务学习模型时,可以通过以下步骤进行操作: 1. 导入所需的库和模块: ```python import torch import torch.nn as nn import torch.optim as optim ``` 2. 定义模型的网络结构: ```python class MultiTaskModel(nn.Module): def __init__(self): super(MultiTaskModel, self).__init__() # 定义共享的特征提取层 self.shared_layer = nn.Sequential( nn.Linear(input_size, hidden_size), nn.ReLU() ) # 定义任务特定的输出层 self.task1_layer = nn.Linear(hidden_size, num_classes_task1) self.task2_layer = nn.Linear(hidden_size, num_classes_task2) ``` 这里的`input_size`是输入特征的大小,`hidden_size`是隐藏层的大小,`num_classes_task1`和`num_classes_task2`分别是两个任务的类别数量。 3. 定义前向传播函数: ```python def forward(self, x): shared_features = self.shared_layer(x) task1_output = self.task1_layer(shared_features) task2_output = self.task2_layer(shared_features) return task1_output, task2_output ``` 这里的`x`是输入数据。 4. 实例化模型和损失函数: ```python model = MultiTaskModel() criterion_task1 = nn.CrossEntropyLoss() criterion_task2 = nn.CrossEntropyLoss() ``` 5. 定义优化器: ```python optimizer = optim.Adam(model.parameters(), lr=learning_rate) ``` 这里的`learning_rate`是学习率。 6. 训练模型: ```python for epoch in range(num_epochs): for batch_idx, (data, labels_task1, labels_task2) in enumerate(train_loader): # 将数据和标签转移到设备上(例如,GPU) data = data.to(device) labels_task1 = labels_task1.to(device) labels_task2 = labels_task2.to(device) # 清除优化器的梯度 optimizer.zero_grad() # 前向传播 outputs_task1, outputs_task2 = model(data) # 计算损失 loss_task1 = criterion_task1(outputs_task1, labels_task1) loss_task2 = criterion_task2(outputs_task2, labels_task2) loss = loss_task1 + loss_task2 # 反向传播和优化 loss.backward() optimizer.step() # 打印损失值 if (batch_idx + 1) % log_interval == 0: print(f'Epoch [{epoch+1}/{num_epochs}], Batch [{batch_idx+1}/{len(train_loader)}], Loss: {loss.item():.4f}') ``` 这里的`train_loader`是训练数据的数据加载器,`device`是所使用的设备(如CPU或GPU),`log_interval`是打印日志的间隔。 这就是使用PyTorch搭建多任务学习模型的基本步骤。你可以根据自己的需求进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值