Pytorch学习记录-60分钟

最最最基础的部分
实现一遍,其实就是pytorch教程的那个60分钟实践。
主要包括7个部分

    1. Basic autograd example 1
    1. Basic autograd example 2
    1. Loading data from numpy
    1. Input pipline
    1. Input pipline for custom dataset
    1. Pretrained model
    1. Save and load model

1. Basic autograd example 1

用PyTorch构建的神经网络,其梯度计算是通过torch.autograd来完成的。当我们进行了一系列计算,并想获取一些变量间的梯度信息,需要进行以下步骤:

  • 构建一个计算图,用Variable将Tensor包装起来,形成计算图中的节点。然后Variable之间进行各种运算就像Tensor之间的运算一样,Variable支持几乎所有的Tensor运算。
  • 当你进行完一系列运算之后,可以执行.backward()来自动计算出所有需要的梯度。
  • 来针对某个变量x执行x.grad获得想要的梯度值。
x = torch.tensor(1., requires_grad=True)
w = torch.tensor(2., requires_grad=True)
b = torch.tensor(3., requires_grad=True)
# 也可以使用下面注释的这种写法
# x = Variable(torch.tensor(1.), requires_grad=True)
# w = Variable(torch.tensor(2.), requires_grad=True)
# b = Variable(torch.tensor(3.), requires_grad=True)

y = x * w + b
y.backward()

print(x.data)
print(w.data)
print(b.data)
# tensor(1.)
# tensor(2.)
# tensor(3.)

print('*'*6)

print(x.grad)
print(w.grad)
print(b.grad)

# tensor(2.)
# tensor(1.)
# tensor(1.)

2. Basic autograd example 2

# 第二个案例
#*****************************************
# 随机生成数据作为x和标签y
#*****************************************
# 创建shape为(10, 3) 和 (10, 2)的tensor
x = torch.randn(10, 3)
y = torch.randn(10, 2)

#*****************************************
# 构建一个全连接层
#*****************************************
linear = nn.Linear(3, 2)
print('w:', linear.weight)
print('b:', linear.bias)

# 构建损失函数和优化器(你可以打印自己的优化器,这里使用的是随机梯度下降,学习率为0.01)
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(linear.parameters(), lr=0.01)
# print(optimizer)

# 做一次前向
pred = linear(x)

# 计算损失
loss = criterion(pred, y)
print('loss:', loss)

# 做一次后向传递
loss.backward()
print('dl/dw:', linear.weight.grad)
print('dl/db:', linear.bias.grad)

# 做一次优化
optimizer.step()


#*****************************************
# 也可以在低级别执行梯度下降
#*****************************************
pred = linear(x)
loss = criterion(pred, y)
print('loss after 1 step optim:', loss.item())

3. Loading data from numpy

  • 可以通过from_numpy()完成引入
  • 可以通过numpy()完成tensor到numpy的转换
# 构建numpy的array
x = np.array([[1, 2], [3, 4]])

y = torch.from_numpy(x)
z = y.numpy()
print(x)
print(y)
print(z)

# [[1 2]
#  [3 4]]
# tensor([[1, 2],
#         [3, 4]], dtype=torch.int32)
# [[1 2]
#  [3 4]]

4. Input pipline

我调了一下代码,这节就是使用torchvision下载和加载数据。

# 输入流水线

transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
     ]
)
# 下载数据
train_dataset = torchvision.datasets.CIFAR10(root='./data/',
                                             train=True,
                                             transform=transforms.ToTensor(),
                                             download=True)
# 加载数据
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
                                           batch_size=64,
                                           shuffle=True)


def imshow(img):
    img = img / 2 + 0.5  # unnormalize
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1, 2, 0)))
    plt.show()


# data_iter = iter(train_loader)
# images, labels = data_iter.next()
# for image, labels in train_loader:
#     pass

classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

if __name__ == '__main__':
    # get some random training images
    dataiter = iter(train_loader)
    images, labels = dataiter.next()

    # show images
    imshow(torchvision.utils.make_grid(images))
    # print labels
    print(' '.join('%5s' % classes[labels[j]] for j in range(4)))

5. Input pipline for custom dataset

从用户数据集输入流水线
可以构建自己数据集,其实就是按照标准重构一个类

class CustomDataset(torch.utils.data.Dataset):
    def __init__(self):
        # 初始化文件地址或是文件名list
        pass
    def __getitem__(self, index):
        # 1. 从文件中读取数据
        # 2. 预处理数据(可以使用torchvision.Transform)
        # 3. 返回数据集(如:图和标签)
        pass
    def __len__(self):
        # 修改数字0为你的数据集大小
        return 0

# 在重构好之后使用之前已经构建好的数据加载器
custom_dataset=CustomDataset()
train_loader=torch.utils.data.Dataset(dataset=custom_dataset,
                                      batch_size=64,
                                      shuffle=True)

6. Pretrained model

# 下载并加载ResNet-18.
resnet = torchvision.models.resnet18(pretrained=True)

# 如果仅想加载顶层的finetune.
for param in resnet.parameters():
    param.requires_grad = False

# 为finetuning替换掉顶层.
resnet.fc = nn.Linear(resnet.fc.in_features, 100)  # 100 is an example.

# Forward pass.
images = torch.randn(64, 3, 224, 224)
outputs = resnet(images)
print (outputs.size())     # (64, 100)

7. Save and load model

torch.save(resnet, "model.ckpt")
model = torch.load('model.ckpt')

torch.save(resnet.state_dict(), 'params.ckpt')
resnet.load_state_dict(torch.load('params.ckpt'))

你可能感兴趣的:(Pytorch学习记录-60分钟)