分享

optimizer.zero...

 松果仁图书馆 2020-09-21

大多数的代码都来自https://morvanzhou./tutorials/machine-learning/torch

只是自己入门pytorch随便记得东西,然后随手扔上来(markdown都不用了,懒懒懒

tensor:

import torch

data = [[1,2], [3,4]]

tensor = torch.FloatTensor(data)

各种操作和numpy.array类似

Variable:

from torch.autograd import Variable

变量,里面的主要元素就是tensor(type(Variable.data) == A_KIND_OF_TENSORS),但是一个variable是会记住自己是被哪些Variable计算出来的(variable = Variable(tensor, requires_grad=True)),所以当我们计算出最后一个Variable:loss时,就可以通过loss.backward(),来对梯度进行反向传播。

然后loss.grad就是其对应的梯度,loss计算图中的各个Variable中的grad成员也会自动变成其对应的参数,记得每次计算新的grad时,要把原来的梯度清0。(optimizer.zero_grad()可以自动完成这个操作,把所有Variable的grad成员数值变为0,然后optimizer.step()则在每个Variable的grad都被计算出来后,更新每个Variable的数值)

激励函数:

import torch.nn.functional as F

F里面存着各种激励函数,进去一个Variable,出来一个Variable,最常用的当然就是F.relu(A_VARIABLE)

optimizer:

optimizer = torch.optim.SGD(net.parameters(), lr=0.5)

qusetion:net.parameters()是哪里来的,作用是什么?

optimizer.zero_grad()可以把所有Variable的grad成员数值变为0

optimizer.step()则可以用所有Variable的grad成员和lr的数值自动更新Variable的数值。

给Variable打上粗体是因为之中Variable会被optimizer的相关函数更新,如果你把东西放在list或其它东西里,它们的梯度是不会被更新的!

loss function:

loss_func = torch.nn.MSELoss()

建立一个神经网络:

class Net(torch.nn.Module):  # 继承 torch 的 Module

    def __init__(self, n_feature, n_hidden, n_output):

        super(Net, self).__init__()     # 继承 __init__ 功能

        # 定义每层用什么样的形式

        self.hidden = torch.nn.Linear(n_feature, n_hidden)   # 隐藏层线性输出

        self.predict = torch.nn.Linear(n_hidden, n_output)   # 输出层线性输出

    def forward(self, x):   # 这同时也是 Module 中的 forward 功能

        # 正向传播输入值, 神经网络分析出输出值

        x = F.relu(self.hidden(x))      # 激励函数(隐藏层的线性值)

        x = self.predict(x)             # 输出值

        return x

net = Net(n_feature=1, n_hidden=10, n_output=1)

print(net)  # net 的结构"""

Net (

  (hidden): Linear (1 -> 10)

  (predict): Linear (10 -> 1)

)

"""

训练一个网络:

# optimizer 是训练的工具optimizer = torch.optim.SGD(net.parameters(), lr=0.5)  # 传入 net 的所有参数, 学习率loss_func = torch.nn.MSELoss()      # 预测值和真实值的误差计算公式 (均方差)

for t in range(100):

    prediction = net(x)     # 喂给 net 训练数据 x, 输出预测值

    loss = loss_func(prediction, y)     # 计算两者的误差

    optimizer.zero_grad()   # 清空上一步的残余更新参数值

    loss.backward()         # 误差反向传播, 计算参数更新值

    optimizer.step()        # 将参数更新值施加到 net 的 parameters 上

快速搭建网络:

之前写的搭建方法适用于你可以对网络进行各种各样的自定义

接下来的方法,如果不需要什么复杂的过程的话,只需要按下面的过程来构建就好了。

net2 = torch.nn.Sequential(

    torch.nn.Linear(1, 10),

    torch.nn.ReLU(),

    torch.nn.Linear(10, 1)

)

保存网络:

torch.save(net1, 'net.pkl') # 保存整个网络

torch.save(net1.state_dict(), 'net_params.pkl') # 只保存网络中的参数 (速度快, 占内存少)

提取网络:

提取整个神经网络, 网络大的时候可能会比较慢.

def restore_net():

    # restore entire net1 to net2

    net2 = torch.load('net.pkl')

    prediction = net2(x)

只提取网络参数

def restore_params():

    # 新建 net3

    net3 = torch.nn.Sequential(

        torch.nn.Linear(1, 10),

        torch.nn.ReLU(),

        torch.nn.Linear(10, 1)

    )

    # 将保存的参数复制到 net3

    net3.load_state_dict(torch.load('net_params.pkl'))

    prediction = net3(x)

批处理:

# 把 dataset 放入 DataLoaderloader = Data.DataLoader(

    dataset=torch_dataset,      # torch TensorDataset format

    batch_size=BATCH_SIZE,      # mini batch size

    shuffle=True,               # 要不要打乱数据 (打乱比较好)

    num_workers=2,              # 多线程来读数据)

for epoch in range(3):   # 训练所有!整套!数据 3 次

    for step, (batch_x, batch_y) in enumerate(loader):  # 每一步 loader 释放一小批数据用来学习

        # 假设这里就是你训练的地方...

        # 打出来一些数据

        print('Epoch: ', epoch, '| Step: ', step, '| batch x: ',

              batch_x.numpy(), '| batch y: ', batch_y.numpy())

"""

Epoch:  0 | Step:  0 | batch x:  [ 6.  7.  2.  3.  1.] | batch y:  [  5.   4.   9.   8.  10.]

Epoch:  0 | Step:  1 | batch x:  [  9.  10.   4.   8.   5.] | batch y:  [ 2.  1.  7.  3.  6.]

Epoch:  1 | Step:  0 | batch x:  [  3.   4.   2.   9.  10.] | batch y:  [ 8.  7.  9.  2.  1.]

Epoch:  1 | Step:  1 | batch x:  [ 1.  7.  8.  5.  6.] | batch y:  [ 10.   4.   3.   6.   5.]

Epoch:  2 | Step:  0 | batch x:  [ 3.  9.  2.  6.  7.] | batch y:  [ 8.  2.  9.  5.  4.]

Epoch:  2 | Step:  1 | batch x:  [ 10.   4.   8.   1.   5.] | batch y:  [  1.   7.   3.  10.   6.]

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多