簡體   English   中英

如何使Keras在密集層中具有兩個不同的初始化器?

[英]How to make Keras have two different initialisers in a dense layer?

我有兩個分別設計的CNN,用於相同數據的兩個不同特征(圖像和文本),並且輸出具有兩個類

在最后一層:

對於圖像(resnet),我想使用“ he_normal”作為初始值設定項

flatten1 = Flatten()(image_maxpool)
dense = Dense(output_dim=2, kernel_initializer="he_normal")(flatten1)

但對於文字CNN,我想使用默認的“ glorot_normal”

flatten2 = Flatten()(text_maxpool)
output = Dense(output_dim=2, kernel_initializer="glorot_normal")(flatten2)

flatten1和flatten2具有以下大小:

flatten_1(平鋪)(無,512)

flatten_2(Flatten)(無,192)

無論如何,我是否可以連接這兩個扁平層並具有大小為192 + 512 = 704的長致密層,其中前192和后512具有兩個單獨的kernel_initializer,並產生2類輸出?

像這樣的東西:

merged_tensor = merge([flatten1, flatten2], mode='concat', concat_axis=1)
output = Dense(output_dim=2, 
    kernel_initializer for [:512]='he_normal',
    kernel_initializer for [512:]='glorot_normal')(merged_tensor)

編輯:我想我已經有了以下代碼(感謝@Aechlys)完成了這項工作:

def my_init(shape, shape1, shape2):
    x = initializers.he_normal()(shape1)
    y = initializers.glorot_normal()(shape2)
    return tf.concat([x,y], 0)

class_num = 2

flatten1 = Flatten()(image_maxpool)
flatten2 = Flatten()(text_maxpool)

merged_tensor = concatenate([flatten1, flatten2],axis=-1)

output = Dense(output_dim=class_num, kernel_initializer=lambda shape: my_init(shape,\
              shape1=(512,class_num),\
              shape2=(192,class_num)),\
              activation='softmax')(merged_tensor)

我必須手動添加形狀大小512和192,因為我無法通過代碼獲取flatten1和flatten1的大小

flatten1.get_shape().as_list()

,它給了我[none,none],雖然應該是[None,512],但應該沒問題

哦,天哪,我玩得開心嗎? 您必須創建自己的內核初始化器:

def my_init(shape, dtype=None, *, shape1, shape2):
    x = keras.initializers.he_normal()(shape1, dtype=dtype)
    y = keras.initializers.glorot_normal()(shape2, dtype=dtype)
    return tf.concat([x,y], 0)

然后,您將通過Dense函數中的lambda函數調用它:

不幸的是,如您所見,我還無法以編程方式推斷出形狀。 當我這樣做時,我可能會更新此答案。 但是,如果您事先知道形狀,則可以將它們作為常量傳遞:

DENSE_UNITS = 64

input_t = Input((1,25))
input_i = Input((1,35))
input_a = Concatenate(axis=-1)([input_t, input_i])

dense = Dense(DENSE_UNITS, kernel_initializer=lambda shape: my_init(shape, 
                                shape1=(int(input_t.shape[-1]), DENSE_UNITS),
                                shape2=(int(input_i.shape[-1]), DENSE_UNITS)))(input_a)
tf.keras.Model(inputs=[input_t, input_i], outputs=dense)
Out: <tensorflow.python.keras._impl.keras.engine.training.Model at 0x19ff7baac88>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM