异想天开

What's the true meaning of light, Could you tell me why

pytorch使用

日期:2019-08-12 21:19:03
  
最后更新日期:2019-08-14 09:49:10
新学了一下pytorch的使用, 权当笔记, 作为pytorch新使用者,整体感受用pytorch构建神经网络比较舒心。记录下使用resnet来跑一个数据犯的错误。 先从官网下载pytorch的resnet训练程序和image预训练的模型。 手动将resnet101模型的fc层注释掉, 同时注释掉forward函数的self.fc(x)计算。
添加分类器
[code lang="code"]
class JudgeModel(nn.Module):
def __init__(self, num_bins):
self.features = resnet.resnet101(pretrained=False,num_classes=num_bins)
for p in self.parameters()
p.requires_grad = False
self.scoreDistribution = nn.Sequential( nn.Dropout(p=0.75),
nn.Linear(2048, num_bins),
nn.Softmax(dim=1))
def forward(self, x):
out = self.features(x)
out = out.view(out.size(0), -1)
out = self.scoreDistribution(out)
return out
[/code]

这里加载预先训练好的模型参数。
[code lang="cpp"]
trained_stated_dict = torch.load("/root/.cache/torch/checkpoints/resnet101-5d3b4d8f.pth")
trained_stated_dict_keys = list(trained_stated_dict.keys())
from collections import OrderedDict
new_state_dict = OrderedDict()
for k, v in model.state_dict().items():
name = k[9:]
if name in trained_stated_dict_keys:
new_state_dict[k] = trained_stated_dict[name]
else:
new_state_dict[k] = model.state_dict()[k]
model.load_state_dict(new_state_dict)
return model
[/code]

训练的时候, 可以这样来不必训练某些参数:
[code lang="cpp"]
optimizer = torch.optim.Adam( filter( lambda p : p.requires_grad, judgenet.parameters() ), lr = 0.003 )
for epoch in range(5):
for i,(images, scores) in enumerate(train_loader):
images = images.cuda()
scores = scores.cuda().float().unsqueeze(2)
predict = judgenet(images).view(-1, 10, 1)
计算loss
optimizer.zero_grad()
loss.back_grad()
optimizer.step()
print( loss.item() )
[/code]

如果蒙头一训练,检验就发现一堆随机点
最后挨个挨个查函数具体含义。发现了一个坑,nn.Softmax函数需要用dim参数指定维度。如果一行是一个sample,那么就是对列进行softmax。这里改成nn.Softmax(dim=1).改完就ok了