最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Pytorch實(shí)現(xiàn)two-head(多輸出)模型的操作

 更新時(shí)間:2021年05月28日 11:53:20   作者:XJTU-Qidong  
這篇文章主要介紹了使用Pytorch實(shí)現(xiàn)two-head(多輸出)模型的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

如何使用Pytorch實(shí)現(xiàn)two-head(多輸出)模型

1. two-head模型定義

先放一張我要實(shí)現(xiàn)的模型結(jié)構(gòu)圖:

A two-head model

如上圖,就是一個(gè)two-head模型,也是一個(gè)但輸入多輸出模型。該模型的特點(diǎn)是輸入一個(gè)x和一個(gè)t,h0和h1中只有一個(gè)會輸出,所以可能這不算是一個(gè)典型的多輸出模型。

2.實(shí)現(xiàn)所遇到的困難 一開始的想法:

這不是很簡單嘛,做一個(gè)判斷不就完了,t=0時(shí)模型為前半段加h0,t=1時(shí)模型為前半段加h1。但實(shí)現(xiàn)的時(shí)候傻眼了,發(fā)現(xiàn)在真正前向傳播的時(shí)候t是一個(gè)tensor,有0有1,沒法兒進(jìn)行判斷。

靈機(jī)一動(dòng),又生一法:把這個(gè)模型變?yōu)槿齻€(gè)模型,前半段是一個(gè)模型(r),后面的h0和h1分別為另兩個(gè)模型。把數(shù)據(jù)集按t=0和1分開,分別訓(xùn)練兩個(gè)模型:r+h0和r+h1。

但是后來搜如何進(jìn)行模型串聯(lián),發(fā)現(xiàn)極為麻煩。

3.解決方案

后來在pytorch的官方社區(qū)中看到一個(gè)極為簡單的方法:

(1) 按照一般的多輸出模型進(jìn)行實(shí)現(xiàn),代碼如下:

def forward(self, x):
        #三層的表示層
        x = F.elu(self.fcR1(x))
        x = F.elu(self.fcR2(x))
        x = F.elu(self.fcR3(x))
		#two-head,兩個(gè)head分別進(jìn)行輸出
        y0 = F.elu(self.fcH01(x))
        y0 = F.elu(self.fcH02(y0))
        y0 = F.elu(self.fcH03(y0))
        y1 = F.elu(self.fcH11(x))
        y1 = F.elu(self.fcH12(y1))
        y1 = F.elu(self.fcH13(y1))
        return y0, y1

這樣就相當(dāng)實(shí)現(xiàn)了一個(gè)多輸出模型,一個(gè)x同時(shí)輸出y0和y1.

訓(xùn)練的時(shí)候分別訓(xùn)練,也即分別建loss,代碼如下:

    f_out_y0, _ = net(x0)
            _, f_out_y1 = net(x1)
            #實(shí)例化損失函數(shù)
            criterion0 = Loss()
            criterion1 = Loss()
            loss0 = criterion0(f_y0, f_out_y0, w0)
            loss1 = criterion1(f_y1, f_out_y1, w1)
            print(loss0.item(), loss1.item())
            #對網(wǎng)絡(luò)參數(shù)進(jìn)行初始化
            optimizer.zero_grad()
            loss0.backward()
            loss1.backward()
            #對網(wǎng)絡(luò)的參數(shù)進(jìn)行更新
            optimizer.step()

先把x按t=0和t=1分為x0和x1,然后分別送入進(jìn)行訓(xùn)練。這樣就實(shí)現(xiàn)了一個(gè)two-head模型。

4.后記

我自以為多輸出模型可以分為以下兩類:

多個(gè)輸出不同時(shí)獲得,如本文情況。

多個(gè)輸出同時(shí)獲得。

多輸出不同時(shí)獲得的解決方法上文已說明。多輸出同時(shí)獲得則可以通過把y0和y1拼接起來一起輸出來實(shí)現(xiàn)。

補(bǔ)充:PyTorch 多輸入多輸出模型構(gòu)建

本篇教程基于 PyTorch 1.5版本

直接上代碼!

import torch
import torch.nn as nn
from torch.autograd import Variable
import torch.distributed as dist
import torch.utils.data as data_utils
class Net(nn.Module):
    def __init__(self, n_input, n_hidden, n_output):
        super(Net, self).__init__()
        self.hidden1 = nn.Linear(n_input, n_hidden)
        self.hidden2 = nn.Linear(n_hidden, n_hidden)
        self.predict1 = nn.Linear(n_hidden*2, n_output)
        self.predict2 = nn.Linear(n_hidden*2, n_output)
    def forward(self, input1, input2): # 多輸入?。?!
        out01 = self.hidden1(input1)
        out02 = torch.relu(out01)
        out03 = self.hidden2(out02)
        out04 = torch.sigmoid(out03)
        out11 = self.hidden1(input2)
        out12 = torch.relu(out11)
        out13 = self.hidden2(out12)
        out14 = torch.sigmoid(out13)
        out = torch.cat((out04, out14), dim=1) # 模型層拼合?。?!當(dāng)然你的模型中可能不需要~
 
        out1 = self.predict1(out)
        out2 = self.predict2(out)
        return out1, out2 # 多輸出?。?!
net = Net(1, 20, 1)
x1 = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1) # 請不要關(guān)心這里,隨便弄一個(gè)數(shù)據(jù),為了說明問題而已
y1 = x1.pow(3)+0.1*torch.randn(x1.size())
x2 = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
y2 = x2.pow(3)+0.1*torch.randn(x2.size())
x1, y1 = (Variable(x1), Variable(y1))
x2, y2 = (Variable(x2), Variable(y2))
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)
loss_func = torch.nn.MSELoss()
for t in range(5000):
    prediction1, prediction2 = net(x1, x2)
    loss1 = loss_func(prediction1, y1)
    loss2 = loss_func(prediction2, y2)
    loss = loss1 + loss2 # 重點(diǎn)!
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    if t % 100 == 0:
       print('Loss1 = %.4f' % loss1.data,'Loss2 = %.4f' % loss2.data,)

至此搞定!

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python面向?qū)ο笾惖亩x與繼承用法示例

    Python面向?qū)ο笾惖亩x與繼承用法示例

    這篇文章主要介紹了Python面向?qū)ο笾惖亩x與繼承用法,結(jié)合實(shí)例形式分析了Python類的定義、實(shí)例化、繼承等基本操作技巧,需要的朋友可以參考下
    2019-01-01
  • pytorch無法使用GPU問題的解決方法

    pytorch無法使用GPU問題的解決方法

    這篇文章主要介紹了如何解決pytorch 無法使用GPU 的問題,文中通過代碼和圖文給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • python實(shí)現(xiàn)圖片橫向和縱向拼接

    python實(shí)現(xiàn)圖片橫向和縱向拼接

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)圖片橫向和縱向拼接,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 童年回憶錄之python版4399吃豆豆小游戲

    童年回憶錄之python版4399吃豆豆小游戲

    相信80,90后都玩過4399網(wǎng)站的小游戲,雖然游戲很low但是童年的回憶,今天小編帶你一起用python自己寫一個(gè)4399吃豆豆的小游戲,文中給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的價(jià)值
    2021-09-09
  • python矩陣列的實(shí)現(xiàn)示例

    python矩陣列的實(shí)現(xiàn)示例

    在Python和NumPy庫的幫助下,矩陣列可以很容易地進(jìn)行各種操作,本文主要介紹了python矩陣列的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Python有參函數(shù)使用代碼實(shí)例

    Python有參函數(shù)使用代碼實(shí)例

    這篇文章主要介紹了Python有參函數(shù)使用代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 使用keras2.0 將Merge層改為函數(shù)式

    使用keras2.0 將Merge層改為函數(shù)式

    這篇文章主要介紹了使用keras2.0 將Merge層改為函數(shù)式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python深入淺出分析元類

    Python深入淺出分析元類

    在Python里一切都是對象(object),基本數(shù)據(jù)類型,如數(shù)字,字符串,函數(shù)都是對象。對象可以由類(class)進(jìn)行創(chuàng)建。那么既然一切都是對象,那么類是對象嗎?是的,類也是對象,那么又是誰創(chuàng)造了類呢?答案也很簡單,也是類,一個(gè)能創(chuàng)作類的類,稱之為(type)元類
    2022-07-07
  • 使用Python編制一個(gè)批處理文件管理器

    使用Python編制一個(gè)批處理文件管理器

    在軟件開發(fā)和系統(tǒng)管理中,批處理文件(.bat)是一種常見且有用的工具,它們可以自動(dòng)化重復(fù)性任務(wù),簡化復(fù)雜的操作流程,今天,我們將探討如何使用Python和wxPython創(chuàng)建一個(gè)圖形用戶界面(GUI)應(yīng)用程序來管理和執(zhí)行批處理文件,需要的朋友可以參考下
    2025-01-01
  • python正則表達(dá)式常見的知識點(diǎn)匯總

    python正則表達(dá)式常見的知識點(diǎn)匯總

    正則表達(dá)式提供了一些可用的匹配模式,比如忽略大小寫、多行匹配等,下面這篇文章主要給大家介紹了關(guān)于python正則表達(dá)式常見的知識點(diǎn),文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05

最新評論

威远县| 谷城县| 金湖县| 广饶县| 阿城市| 特克斯县| 伊金霍洛旗| 平阴县| 齐河县| 方正县| 罗甸县| 临澧县| 昂仁县| 嘉兴市| 湖北省| 奉节县| 雷山县| 巴彦淖尔市| 天柱县| 凭祥市| 桐梓县| 宁明县| 彭州市| 于都县| 饶平县| 平江县| 西乡县| 太保市| 大兴区| 达拉特旗| 河间市| 库车县| 申扎县| 区。| 新沂市| 城固县| 潢川县| 恩平市| 常宁市| 武安市| 禹城市|