九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
深度學(xué)習(xí)筆記34_函數(shù)式API之多輸出模型構(gòu)建

多輸出模型

社交模型的構(gòu)建

這里我們先來看個(gè)例子,通過一個(gè)網(wǎng)絡(luò)來試圖預(yù)測數(shù)據(jù)的不同性質(zhì),一個(gè)網(wǎng)絡(luò)中:

  • 輸入:某個(gè)匿名人士在社交媒體發(fā)帖一系列文章

  • 預(yù)測個(gè)人屬性:

    • 年齡

    • 性別

    • 收入水平

這個(gè)就是一個(gè)典型的一個(gè)輸入,多個(gè)輸出的模型,具體的coding如下。

多頭輸出模型案例
from keras import layers
from keras import Input
from keras.models import Model

 # 最常用的前50000詞語
vocabulary_size = 50000
# 收入為10個(gè)等級
num_income_groups = 10

# shape = (None,) 表示輸入的長度是可變的
# 輸入的格式類型是:整數(shù)序列
# name='posts' 對輸入進(jìn)行命名
posts_input = Input(shape=(None,),dtype='int32',name='posts')
# # 將輸入嵌入維度為256的向量
embedded_posts = layers.Embedding(256,vocabulary_size)(posts_input)
x = layers.Conv1D(128,5,activation='relu')(embedded_posts)
x = layers.MaxPooling1D(5)(x)
x = layers.Conv1D(256,5,activation = 'relu')(x)
x = layers.Conv1D(256,5,activation='relu')(x)
x = layers.MaxPooling1D(5)(x)
x = layers.Conv1D(256,5,activation='relu')(x)
x = layers.Conv1D(256,5,activation='relu')(x)
# 求全局的MAX池化,這里全局指的是整個(gè)steps
x = layers.GlobalMaxPooling1D()(x)
x = layers.Dense(128,activation='relu')(x)

# 對于每一個(gè)輸出層進(jìn)行命名
age_prediction = layers.Dense(1,name='age')(x)
income_prediction = layers.Dense(num_income_groups,
                                activation='softmax',
                                name = 'income')(x)
gender_prediction = layers.Dense(1,
                                 activation='sigmoid',
                                name = 'gender')(x)

# 創(chuàng)建模型,模型的輸出是三個(gè)數(shù)據(jù)構(gòu)成一個(gè)列表
model = Model(posts_input,
             [age_prediction,
             income_prediction,
             gender_prediction])

社交模型編譯 - 損失函數(shù)處理

這里我們需要對于不同的輸入指定不同的損失函數(shù):

  • 年齡:標(biāo)量回歸

  • 性別:二分類

  • 收入:多分類
    所以對于不同的損失函數(shù),需要訓(xùn)練的過程也不同,但是梯度下降要求僅僅對一個(gè)標(biāo)量進(jìn)行最小化,所以我們需要將這三個(gè)不同的損失值合并稱為一個(gè)標(biāo)量。這里一個(gè)簡單的方法就是:

  • 對所有的損失值求和

對于在keras中我們可以這樣處理:

在編譯函數(shù)compile中,使用列表或者使用字典將不同的輸出指定不同的損失,然后將得到的損失值相加得到一個(gè)全局損失值,然后在訓(xùn)練過程中將相加的那個(gè)損失進(jìn)行最小化.

具體的coding如下

# 使用列表的形式,要與模型建立的是輸出要對應(yīng)
model.compile(optimizer='rmsprop',
             loss = ['mse',
                     'categorical_crossentropy',
                    'binary_crossentropy'])
# 使用字典的形式
# 這里也是需要輸出層具有名稱時(shí)
model.compile(optimizer='rmsprop',
             loss= {'age':'mse',
                'income': 'categorical_crossentropy',
                'gender': 'binary_crossentropy'

             })

損失值權(quán)重的分配

上面的相加是比較粗暴的直接相加,這里需要考慮兩個(gè)問題:

  • 每個(gè)損失值的度量不一樣,各個(gè)損失值的范圍不一樣

    • 比如age:得出的結(jié)果可能在3-5左右

    • gender:交叉熵?fù)p失值可能在0.1左右

  • 每個(gè)損失值貢獻(xiàn)不一樣,需要分配不同的權(quán)重
    為了平衡這些損失值的貢獻(xiàn),我們這里需要對損失值進(jìn)行權(quán)重的賦值.比如:交叉熵que
    具體coding如下:

# 使用列表的形式,要與模型建立的是輸出要對應(yīng)
model.compile(optimizer='rmsprop',
             loss = ['mse',
                     'categorical_crossentropy',
                    'binary_crossentropy'],
             loss_weights=[0.25,1.0,10.])
# 使用字典的形式
# 這里也是需要輸出層具有名稱時(shí)
model.compile(optimizer='rmsprop',
             loss= {'age':'mse',
                'income': 'categorical_crossentropy',
                'gender': 'binary_crossentropy'

             },
              loss_weights={
                  'age':0.25,
                  'imcome':1.,
                  'gender':10.

              }
             )

多輸出模型的訓(xùn)練

對于多輸出模型,要將標(biāo)簽數(shù)據(jù)對應(yīng)與模型中的目標(biāo)數(shù)據(jù).我們可以使用Numpy數(shù)據(jù)組成的列表或者字典.

# 訓(xùn)練函數(shù)中,多輸出模型的列表數(shù)據(jù)
model.fit(posts,
          [age_targets,income_targets,gender_targets],
         epochs=10,
         batch_size=64)

# 訓(xùn)練函數(shù)中,多輸出模型的字典數(shù)據(jù)
# 這里也是需要輸出層具有名稱時(shí)
model.fit(posts,
          {'age':age_targets,
           'income':income_targets,
           'gender':gender_targets},
         epochs=10,
         batch_size=64)

多輸入多輸出模型

本例子參考Keras 文檔的關(guān)于試圖預(yù)測Twitter上的一條新聞?dòng)卸嗌俎D(zhuǎn)發(fā)和點(diǎn)贊數(shù),來說明多輸入多輸出模型,利用函數(shù)API里處理大量交織的數(shù)據(jù)流.

輸入的數(shù)據(jù):

  • 新聞標(biāo)題本身

  • 輔助輸入來接收額外的數(shù)據(jù): 新聞標(biāo)題的發(fā)布的時(shí)間等

輸出的數(shù)據(jù):

  • 輔助輸出

    • 較早地在模型中使用主損失函數(shù),是深度學(xué)習(xí)模型的一個(gè)良好正則方法

    • 插入輔助損失,使得即使在模型主損失很高的情況下,LSTM 層和 Embedding 層都能被平穩(wěn)地訓(xùn)練

  • 主輸出

具體的模型結(jié)構(gòu)如下圖:

多輸入多輸出模型

具體的coding如下:

from keras.layers import Input,Embedding,LSTM,Dense
from keras.models import Model

 # 最常用的前10000詞語
vocabulary_size = 10000

# shape = (100,) 表示輸入是一個(gè)含有100個(gè)整數(shù)序列,
# 每個(gè)整數(shù)在1到10000之間的
# 輸入的格式類型是:整數(shù)序列
# name='main_input' 對輸入進(jìn)行命名
main_input = Input(shape=(100,),
                   dtype='int32',
                   name='main_input')
# Embedding 層將輸入序列編碼為一個(gè)稠密向量的序列,
# 每個(gè)向量維度為 512。
# 使用最常用的前10000詞語
# 輸入的長度100,同上面main_input
x = Embedding(output_dim=512,
              input_dim=10000,
              input_length=100)(main_input)

# LSTM 層把向量序列轉(zhuǎn)換成單個(gè)向量,
# 它包含整個(gè)序列的上下文信息
lstm_out = LSTM(32)(x)
# 這里直接來一個(gè)輔助輸出
# 作用是:
# 1.使得即使在模型主損失很高的情況下,
#LSTM 層和 Embedding 層都能被平穩(wěn)地訓(xùn)練
# 2. 較早地在模型中使用主損失函數(shù),是一個(gè)良好正則方法 
auxiliary_output = Dense(1,
                         activation='sigmoid',
                         name='aux_output')(lstm_out)

# 引入輔助輸入數(shù)據(jù)
auxiliary_input = Input(shape=(5,),name = 'aux_input')
# 結(jié)合輔助數(shù)據(jù)
x = keras.layers.concatenate([lstm_out,auxiliary_input])

# 堆疊多個(gè)全連接網(wǎng)絡(luò)層
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)

# 最后添加主要的邏輯回歸層
main_output = Dense(1, a
                    ctivation='sigmoid',
                    name='main_output')(x)

# 定義一個(gè)多輸入多輸出模型
model = Model(inputs=[main_input,auxiliary_input],
              outputs=[main_output,auxiliary_output]
             )
# 這里做了一個(gè)簡寫,因?yàn)檫@里的兩個(gè)損失函數(shù)選的是一樣,
# 這里對于輔助損失值分配一個(gè)0.2的權(quán)重
model.compile(optimizer='rmsprop',
             loss='binary_crossentropy',
             loss_weights=[1.,0.2])
# 另外一種列表的寫法
model.compile(optimizer='rmsprop',
             loss=['binary_crossentropy',
                   'binary_crossentropy'],
             loss_weights=[1.,0.2])

# 傳入的數(shù)據(jù)也是兩個(gè),和兩個(gè)標(biāo)簽數(shù)據(jù)
model.fit([headline_data,additional_data],
         [labels,labels],
         epochs=50,
         batch_size=32)

# 使用字典的寫法

model.compile(optimizer='rmsprop',
              losss = {'main_output':'binary_crossentropy',
                       'aux_output':'binary_crossentropy'},
              loss_weight=[1.,0.2]
             )
# 要跟前面的name對應(yīng)
model.fit(
    {'main_input':headline_data,
     'aux_input': additional_data},
    {'main_output':labels,
     'aux_output':labels},
    epochs=50,
    batch_size=32
)
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
深度學(xué)習(xí) .net keras python雙實(shí)現(xiàn)
TensorFlow 實(shí)戰(zhàn)之利用5
Guide to the Sequential model
【TensorFlow2.0】以后我們再也離不開Keras了?
輕量級深度學(xué)習(xí)框架Keras簡介
編織人工智能:機(jī)器學(xué)習(xí)發(fā)展總覽與關(guān)鍵技術(shù)全解析
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服