在新的 API 变更下,如何在 Keras 中进行层的元素-wise 乘法?在旧的 API 中,我会尝试类似这样的操作:
merge([dense_all, dense_att], output_shape=10, mode='mul')
我尝试了以下最小工作示例 (MWE):
from keras.models import Modelfrom keras.layers import Input, Dense, Multiplydef 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 0if __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 的元素-wise 乘法函数。当然,结果不是 Layer()
实例,所以它不起作用。以下是尝试的代码,供后人参考:
def new_multiply(inputs): #假设只有两个 - 这是不好的做法,但为了说明... 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) #哪些交互是重要的? 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
回答:
对于 keras
版本大于 2.0:
from keras.layers import multiplyoutput = multiply([dense_all, dense_att])