最最最基础的部分
实现一遍,其实就是pytorch教程的那个60分钟实践。
主要包括7个部分
-
- Basic autograd example 1
-
- Basic autograd example 2
-
- Loading data from numpy
-
- Input pipline
-
- Input pipline for custom dataset
-
- Pretrained model
-
- 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'))