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'))
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容