【问题标题】:Keras Multiply() layer in functional API功能 API 中的 Keras Multiply() 层
【发布时间】:2018-01-17 20:18:21
【问题描述】:

在新的 API 更改下,您如何在 Keras 中进行逐元素乘法?在旧的 API 下,我会尝试这样的事情:

merge([dense_all, dense_att], output_shape=10, mode='mul')

我试过这个(MWE):

from keras.models import Model
from keras.layers import Input, Dense, Multiply

def sample_model():
        model_in = Input(shape=(10,))
        dense_all = Dense(10,)(model_in)
        dense_att = Dense(10, activation='softmax')(model_in)
        att_mull = Multiply([dense_all, dense_att]) #merge([dense_all, dense_att], output_shape=10, mode='mul')
        model_out = Dense(10, activation="sigmoid")(att_mull)
        return 0

if __name__ == '__main__':
        sample_model()

完整的跟踪:

Using TensorFlow backend.
Traceback (most recent call last):
  File "testJan17.py", line 13, in <module>
    sample_model()
  File "testJan17.py", line 8, in sample_model
    att_mull = Multiply([dense_all, dense_att]) #merge([dense_all, dense_att], output_shape=10, mode='mul')
TypeError: __init__() takes exactly 1 argument (2 given)

编辑:

我尝试实现 tensorflow 的逐元素乘法函数。当然,结果不是Layer() 实例,所以它不起作用。这是为了后代的尝试:

def new_multiply(inputs): #assume two only - bad practice, but for illustration...
        return tf.multiply(inputs[0], inputs[1])


def sample_model():
        model_in = Input(shape=(10,))
        dense_all = Dense(10,)(model_in)
        dense_att = Dense(10, activation='softmax')(model_in) #which interactions are important?
        new_mult = new_multiply([dense_all, dense_att])
        model_out = Dense(10, activation="sigmoid")(new_mult)
        model = Model(inputs=model_in, outputs=model_out)
        model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
        return model

【问题讨论】:

    标签: python machine-learning neural-network keras deep-learning


    【解决方案1】:

    使用keras > 2.0:

    from keras.layers import multiply
    output = multiply([dense_all, dense_att])
    

    【讨论】:

    • ...呃。好的,所以,我猜 Multiply() 是 multiply() 之类的包装器。谢谢!
    • @StatsSorceress 反过来:multiply()Multiply() 的包装器。
    【解决方案2】:

    在函数式 API 下,您只需使用 multiply 函数,注意小写的“m”。正如您所见,Multiply 类是一个层,旨在与顺序 API 一起使用。

    更多信息在https://keras.io/layers/merge/#multiply_1

    【讨论】:

    • 哈!几乎在同一时间 :)
    【解决方案3】:

    您需要在前面再添加一个左右括号。

    from keras.layers import Multiply
    att_mull = Multiply()([dense_all, dense_att])
    

    【讨论】:

      猜你喜欢
      • 2018-09-26
      • 2017-11-26
      • 2022-01-23
      • 2021-02-22
      • 1970-01-01
      • 2019-05-07
      • 2018-08-18
      • 2017-10-25
      • 1970-01-01
      相关资源
      最近更新 更多