中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Pytorch實現two-head模型

發布時間:2021-05-29 16:59:39 來源:億速云 閱讀:174 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關如何使用Pytorch實現two-head模型,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

如何使用Pytorch實現two-head(多輸出)模型

1. two-head模型定義

先放一張我要實現的模型結構圖:

如何使用Pytorch實現two-head模型

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

2.實現所遇到的困難 一開始的想法:

這不是很簡單嘛,做一個判斷不就完了,t=0時模型為前半段加h0,t=1時模型為前半段加h2。但實現的時候傻眼了,發現在真正前向傳播的時候t是一個tensor,有0有1,沒法兒進行判斷。

靈機一動,又生一法:把這個模型變為三個模型,前半段是一個模型(r),后面的h0和h2分別為另兩個模型。把數據集按t=0和1分開,分別訓練兩個模型:r+h0和r+h2。

但是后來搜如何進行模型串聯,發現極為麻煩。

3.解決方案

后來在pytorch的官方社區中看到一個極為簡單的方法:

(1) 按照一般的多輸出模型進行實現,代碼如下:

def forward(self, x):
        #三層的表示層
        x = F.elu(self.fcR1(x))
        x = F.elu(self.fcR2(x))
        x = F.elu(self.fcR3(x))
		#two-head,兩個head分別進行輸出
        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

這樣就相當實現了一個多輸出模型,一個x同時輸出y0和y1.

訓練的時候分別訓練,也即分別建loss,代碼如下:

f_out_y0, _ = net(x0)
            _, f_out_y1 = net(x1)
            #實例化損失函數
            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())
            #對網絡參數進行初始化
            optimizer.zero_grad()
            loss0.backward()
            loss1.backward()
            #對網絡的參數進行更新
            optimizer.step()

先把x按t=0和t=1分為x0和x1,然后分別送入進行訓練。這樣就實現了一個two-head模型。

4.后記

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

多個輸出不同時獲得,如本文情況。

多個輸出同時獲得。

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

補充:PyTorch 多輸入多輸出模型構建

本篇教程基于 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) # 模型層拼合!!!當然你的模型中可能不需要~
 
        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) # 請不要關心這里,隨便弄一個數據,為了說明問題而已
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 # 重點!
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    if t % 100 == 0:
       print('Loss1 = %.4f' % loss1.data,'Loss2 = %.4f' % loss2.data,)

關于“如何使用Pytorch實現two-head模型”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石嘴山市| 石楼县| 蒙山县| 石城县| 五台县| 前郭尔| 临颍县| 垣曲县| 纳雍县| 天津市| 山东省| 保亭| 阜宁县| 白水县| 洮南市| 旌德县| 驻马店市| 思南县| 吐鲁番市| 锡林郭勒盟| 襄城县| 望江县| 嘉祥县| 镇江市| 肥乡县| 桃园县| 梁平县| 汝城县| 锦州市| 巴青县| 云梦县| 卢湾区| 西乡县| 平江县| 博湖县| 华蓥市| 太湖县| 荥经县| 曲沃县| 施秉县| 恭城|