PyTorch 神經(jīng)網(wǎng)絡(luò)保存和提取

?PyTorch 通過簡(jiǎn)單的途徑來(lái)使用神經(jīng)網(wǎng)絡(luò)進(jìn)行事物的分類.

更多可以查看官網(wǎng) :
* PyTorch 官網(wǎng)


快速搭建神經(jīng)網(wǎng)絡(luò)

net1 代表這種方式搭建的神經(jīng)網(wǎng)絡(luò).

class Net(torch.nn.Module):
    def __init__(self, n_feature, n_hidden, n_output):
        super(Net, self).__init__()
        self.hidden = torch.nn.Linear(n_feature, n_hidden)
        self.predict = torch.nn.Linear(n_hidden, n_output)

    def forward(self, x):
        x = F.relu(self.hidden(x))
        x = self.predict(x)
        return x

net1 = Net(1, 10, 1)   

class 繼承了一個(gè) torch 中的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu), 然后對(duì)其進(jìn)行了修改, 不過還有更快的一招, 用一句話就概括了上面所有的內(nèi)容.

net2 = torch.nn.Sequential(
    torch.nn.Linear(1, 10),
    torch.nn.ReLU(),
    torch.nn.Linear(10, 1)
)

對(duì)比一下兩者的結(jié)構(gòu):

print(net1)
"""
Net (
  (hidden): Linear (1 -> 10)
  (predict): Linear (10 -> 1)
)
"""
print(net2)
"""
Sequential (
  (0): Linear (1 -> 10)
  (1): ReLU ()
  (2): Linear (10 -> 1)
)
"""

我們會(huì)發(fā)現(xiàn) net2 多顯示了一些內(nèi)容.

他把激勵(lì)函數(shù)也一同納入進(jìn)去了, 但是 net1 中, 激勵(lì)函數(shù)實(shí)際上是在 forward() 功能中才被調(diào)用的.這也就說明了, 相比 net2, net1 的好處就是, 你可以根據(jù)你的個(gè)人需要更加個(gè)性化你自己的前向傳播過程, 比如(RNN).不過如果你不需要七七八八的過程, 相信 net2 這種形式更適合你.


保存和提取

訓(xùn)練好了一個(gè)模型,保存它, 留到下次要用的時(shí)候直接提取直接用.

快速地建造數(shù)據(jù), 搭建網(wǎng)絡(luò):

torch.manual_seed(1)    # reproducible

# 假數(shù)據(jù)
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)  # x data (tensor), shape=(100, 1)
y = x.pow(2) + 0.2*torch.rand(x.size())  # noisy y data (tensor), shape=(100, 1)
x, y = Variable(x, requires_grad=False), Variable(y, requires_grad=False)


def save():
    # 建網(wǎng)絡(luò)
    net1 = torch.nn.Sequential(
        torch.nn.Linear(1, 10),
        torch.nn.ReLU(),
        torch.nn.Linear(10, 1)
    )
    optimizer = torch.optim.SGD(net1.parameters(), lr=0.5)
    loss_func = torch.nn.MSELoss()

    # 訓(xùn)練
    for t in range(100):
        prediction = net1(x)
        loss = loss_func(prediction, y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

有兩種途徑來(lái)保存

torch.save(net1, 'net.pkl')  # 保存整個(gè)網(wǎng)絡(luò)
torch.save(net1.state_dict(), 'net_params.pkl')   # 只保存網(wǎng)絡(luò)中的參數(shù) (速度快, 占內(nèi)存少)

提取網(wǎng)絡(luò)

這種方式將會(huì)提取整個(gè)神經(jīng)網(wǎng)絡(luò), 網(wǎng)絡(luò)大的時(shí)候可能會(huì)比較慢.

def restore_net():
    # restore entire net1 to net2
    net2 = torch.load('net.pkl')
    prediction = net2(x)

只提取網(wǎng)絡(luò)參數(shù)

這種方式將會(huì)提取所有的參數(shù), 然后再放到新建網(wǎng)絡(luò)中.

def restore_params():
    # 新建 net3
    net3 = torch.nn.Sequential(
        torch.nn.Linear(1, 10),
        torch.nn.ReLU(),
        torch.nn.Linear(10, 1)
    )

    # 將保存的參數(shù)復(fù)制到 net3
    net3.load_state_dict(torch.load('net_params.pkl'))
    prediction = net3(x)

結(jié)果

調(diào)用上面建立的幾個(gè)功能, 然后出圖.

# 保存 net1 (1. 整個(gè)網(wǎng)絡(luò), 2. 只有參數(shù))
save()

# 提取整個(gè)網(wǎng)絡(luò)
restore_net()

# 提取網(wǎng)絡(luò)參數(shù), 復(fù)制到新網(wǎng)絡(luò)
restore_params()
結(jié)果

這樣就能看出三個(gè)網(wǎng)絡(luò)完全一模一樣的了.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 文章主要分為:一、人工神經(jīng)網(wǎng)絡(luò)的概念;二、人工神經(jīng)網(wǎng)絡(luò)的發(fā)展歷史;三、人工神經(jīng)網(wǎng)絡(luò)的特點(diǎn);四、人工神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)。...
    艾剪疏閱讀 16,572評(píng)論 0 7
  • Pytorch 神經(jīng)網(wǎng)絡(luò)基礎(chǔ) 1.1 Pytorch & Numpy 1.1.1 用Torch還是Numpy To...
    suwi閱讀 6,518評(píng)論 0 10
  • 每過一段時(shí)間,總會(huì)有一個(gè)python庫(kù)被開發(fā)出來(lái),改變深度學(xué)習(xí)領(lǐng)域。而PyTorch就是這樣一個(gè)庫(kù)。 在過去的幾周...
    AiTechYun閱讀 4,268評(píng)論 0 4
  • 希望我的眼睛里是你看不透的深情與孤獨(dú)。
    離別式相遇_50e1閱讀 260評(píng)論 0 0
  • 今天美亨姐晉升了,晉升到了ed。 今天得知這個(gè)消息,心里確實(shí)還是挺有感觸的,是有一種失落感,同時(shí)自己對(duì)自己也很失望...
    順鑫夢(mèng)閱讀 350評(píng)論 0 0

友情鏈接更多精彩內(nèi)容