亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Keras自定義實(shí)現(xiàn)帶masking的meanpooling層方式

 更新時(shí)間:2020年06月16日 11:55:17   作者:蕉叉熵  
這篇文章主要介紹了Keras自定義實(shí)現(xiàn)帶masking的meanpooling層方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

Keras確實(shí)是一大神器,代碼可以寫得非常簡(jiǎn)潔,但是最近在寫LSTM和DeepFM的時(shí)候,遇到了一個(gè)問題:樣本的長(zhǎng)度不一樣。對(duì)不定長(zhǎng)序列的一種預(yù)處理方法是,首先對(duì)數(shù)據(jù)進(jìn)行padding補(bǔ)0,然后引入keras的Masking層,它能自動(dòng)對(duì)0值進(jìn)行過濾。

問題在于keras的某些層不支持Masking層處理過的輸入數(shù)據(jù),例如Flatten、AveragePooling1D等等,而其中meanpooling是我需要的一個(gè)運(yùn)算。例如LSTM對(duì)每一個(gè)序列的輸出長(zhǎng)度都等于該序列的長(zhǎng)度,那么均值運(yùn)算就只應(yīng)該除以序列長(zhǎng)度,而不是padding后的最長(zhǎng)長(zhǎng)度。

例如下面這個(gè) 3x4 大小的張量,經(jīng)過補(bǔ)零padding的。我希望做axis=1的meanpooling,則第一行應(yīng)該是 (10+20)/2,第二行應(yīng)該是 (10+20+30)/3,第三行應(yīng)該是 (10+20+30+40)/4。

Keras如何自定義層

在 Keras2.0 版本中(如果你使用的是舊版本請(qǐng)更新),自定義一個(gè)層的方法參考這里。具體地,你只要實(shí)現(xiàn)三個(gè)方法即可。

build(input_shape) : 這是你定義層參數(shù)的地方。這個(gè)方法必須設(shè)self.built = True,可以通過調(diào)用super([Layer], self).build()完成。如果這個(gè)層沒有需要訓(xùn)練的參數(shù),可以不定義。

call(x) : 這里是編寫層的功能邏輯的地方。你只需要關(guān)注傳入call的第一個(gè)參數(shù):輸入張量,除非你希望你的層支持masking。

compute_output_shape(input_shape) : 如果你的層更改了輸入張量的形狀,你應(yīng)該在這里定義形狀變化的邏輯,這讓Keras能夠自動(dòng)推斷各層的形狀。

下面是一個(gè)簡(jiǎn)單的例子:

from keras import backend as K
from keras.engine.topology import Layer
import numpy as np

class MyLayer(Layer):

 def __init__(self, output_dim, **kwargs):
 self.output_dim = output_dim
 super(MyLayer, self).__init__(**kwargs)

 def build(self, input_shape):
 # Create a trainable weight variable for this layer.
 self.kernel = self.add_weight(name='kernel', 
  shape=(input_shape[1], self.output_dim),
  initializer='uniform',
  trainable=True)
 super(MyLayer, self).build(input_shape) # Be sure to call this somewhere!

 def call(self, x):
 return K.dot(x, self.kernel)

 def compute_output_shape(self, input_shape):
 return (input_shape[0], self.output_dim)

Keras自定義層如何允許masking

觀察了一些支持masking的層,發(fā)現(xiàn)他們對(duì)masking的支持體現(xiàn)在兩方面。

在 __init__ 方法中設(shè)置 supports_masking=True。

實(shí)現(xiàn)一個(gè)compute_mask方法,用于將mask傳到下一層。

部分層會(huì)在call中調(diào)用傳入的mask。

自定義實(shí)現(xiàn)帶masking的meanpooling

假設(shè)輸入是3d的。首先,在__init__方法中設(shè)置self.supports_masking = True,然后在call中實(shí)現(xiàn)相應(yīng)的計(jì)算。

from keras import backend as K
from keras.engine.topology import Layer
import tensorflow as tf

class MyMeanPool(Layer):
 def __init__(self, axis, **kwargs):
 self.supports_masking = True
 self.axis = axis
 super(MyMeanPool, self).__init__(**kwargs)

 def compute_mask(self, input, input_mask=None):
 # need not to pass the mask to next layers
 return None

 def call(self, x, mask=None):
 if mask is not None:
 mask = K.repeat(mask, x.shape[-1])
 mask = tf.transpose(mask, [0,2,1])
 mask = K.cast(mask, K.floatx())
 x = x * mask
 return K.sum(x, axis=self.axis) / K.sum(mask, axis=self.axis)
 else:
 return K.mean(x, axis=self.axis)

 def compute_output_shape(self, input_shape):
 output_shape = []
 for i in range(len(input_shape)):
 if i!=self.axis:
 output_shape.append(input_shape[i])
 return tuple(output_shape)

使用舉例:

from keras.layers import Input, Masking
from keras.models import Model
from MyMeanPooling import MyMeanPool

data = [[[10,10],[0, 0 ],[0, 0 ],[0, 0 ]],
 [[10,10],[20,20],[0, 0 ],[0, 0 ]],
 [[10,10],[20,20],[30,30],[0, 0 ]],
 [[10,10],[20,20],[30,30],[40,40]]]

A = Input(shape=[4,2]) # None * 4 * 2
mA = Masking()(A)
out = MyMeanPool(axis=1)(mA)

model = Model(inputs=[A], outputs=[out])

print model.summary()
print model.predict(data)

結(jié)果如下,每一行對(duì)應(yīng)一個(gè)樣本的結(jié)果,例如第一個(gè)樣本只有第一個(gè)時(shí)刻有值,輸出結(jié)果是[10. 10. ],是正確的。

[[10. 10.]
 [15. 15.]
 [20. 20.]
 [25. 25.]]

在DeepFM中,每個(gè)樣本都是由ID構(gòu)成的,多值field往往會(huì)導(dǎo)致樣本長(zhǎng)度不一的情況,例如interest這樣的field,同一個(gè)樣本可能在該field中有多項(xiàng)取值,畢竟每個(gè)人的興趣點(diǎn)不止一項(xiàng)。

采取padding的方法將每個(gè)field的特征補(bǔ)長(zhǎng)到最長(zhǎng)的長(zhǎng)度,則數(shù)據(jù)尺寸是 [batch_size, max_timestep],經(jīng)過Embedding為每個(gè)樣本的每個(gè)特征ID配一個(gè)latent vector,數(shù)據(jù)尺寸將變?yōu)?[batch_size, max_timestep,latent_dim]。

我們希望每一個(gè)field的Embedding之后的尺寸為[batch_size, latent_dim],然后進(jìn)行concat操作橫向拼接,所以這里就可以使用自定義的MeanPool層了。希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • PyCharm-錯(cuò)誤-找不到指定文件python.exe的解決方法

    PyCharm-錯(cuò)誤-找不到指定文件python.exe的解決方法

    今天小編就為大家分享一篇PyCharm-錯(cuò)誤-找不到指定文件python.exe的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python用二分法求平方根的案例

    Python用二分法求平方根的案例

    這篇文章主要介紹了Python用二分法求平方根的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python中try excpet BaseException(異常處理捕獲)的使用

    Python中try excpet BaseException(異常處理捕獲)的使用

    本文主要介紹了Python中try excpet BaseException(異常處理捕獲)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • macOS M1(Apple Silicon)安裝配置Conda環(huán)境的具體實(shí)現(xiàn)

    macOS M1(Apple Silicon)安裝配置Conda環(huán)境的具體實(shí)現(xiàn)

    由于常用的Anaconda和Miniconda現(xiàn)在都沒有提供M1處理器支持的conda環(huán)境,以下是conda-forge提供的miniforge,感興趣的可以了解一下
    2021-08-08
  • python?PyQt5中QButtonGroup的詳細(xì)用法解析與應(yīng)用實(shí)戰(zhàn)記錄

    python?PyQt5中QButtonGroup的詳細(xì)用法解析與應(yīng)用實(shí)戰(zhàn)記錄

    在PyQt5中,QButtonGroup是一個(gè)用于管理按鈕互斥性和信號(hào)槽連接的類,它可以將多個(gè)按鈕劃分為一個(gè)組,管理按鈕的選中狀態(tài)和ID,本文詳細(xì)介紹了QButtonGroup的創(chuàng)建、使用方法和實(shí)際應(yīng)用案例,適合需要在PyQt5項(xiàng)目中高效管理按鈕組的開發(fā)者
    2024-10-10
  • 一文掌握Python爬蟲XPath語法

    一文掌握Python爬蟲XPath語法

    這篇文章主要介紹了一文掌握Python爬蟲XPath語法,xpath是一門在XML和HTML文檔中查找信息的語言,可用來在XML和HTML文檔中對(duì)元素和屬性進(jìn)行遍歷,XPath 通過使用路徑表達(dá)式來選取 XML 文檔中的節(jié)點(diǎn)或者節(jié)點(diǎn)集。下面會(huì)更學(xué)習(xí)的介紹,需要的朋友可以參考一下
    2021-11-11
  • 淺析Python函數(shù)式編程

    淺析Python函數(shù)式編程

    在本篇文章中我們給大家分享了關(guān)于Python函數(shù)式編程的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友參考下。
    2018-10-10
  • Python2和Python3之間的str處理方式導(dǎo)致亂碼的講解

    Python2和Python3之間的str處理方式導(dǎo)致亂碼的講解

    今天小編就為大家分享一篇關(guān)于Python2和Python3之間的str處理方式導(dǎo)致亂碼的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Python協(xié)程操作之gevent(yield阻塞,greenlet),協(xié)程實(shí)現(xiàn)多任務(wù)(有規(guī)律的交替協(xié)作執(zhí)行)用法詳解

    Python協(xié)程操作之gevent(yield阻塞,greenlet),協(xié)程實(shí)現(xiàn)多任務(wù)(有規(guī)律的交替協(xié)作執(zhí)行)用法詳解

    這篇文章主要介紹了Python協(xié)程操作之gevent(yield阻塞,greenlet),協(xié)程實(shí)現(xiàn)多任務(wù)(有規(guī)律的交替協(xié)作執(zhí)行)用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了協(xié)程的功能、原理及gevent、greenlet實(shí)現(xiàn)協(xié)程,以及協(xié)程實(shí)現(xiàn)多任務(wù)相關(guān)操作技巧,需要的朋友可以參考下
    2019-10-10
  • Python如何利用opencv實(shí)現(xiàn)手勢(shì)識(shí)別

    Python如何利用opencv實(shí)現(xiàn)手勢(shì)識(shí)別

    這篇文章主要介紹了Python如何利用opencv實(shí)現(xiàn)手勢(shì)識(shí)別,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙可以參考一下
    2022-05-05

最新評(píng)論