我在Keras中实现了这里描述的LSTM架构。我认为我已经非常接近了,尽管我仍然在共享层和特定语言层的组合上遇到了一些问题。这里是公式(近似):y = g * y^s + (1 - g) * y^u
以下是我尝试的代码:
### Linear Layers ###univ_linear = Dense(50, activation=None, name='univ_linear')univ_linear_en = univ_linear(en_encoded)univ_linear_es = univ_linear(es_encoded)print(univ_linear_en)# Gate >> ggate_en = Dense(50, activation='sigmoid', name='gate_en')(en_encoded)gate_es = Dense(50, activation='sigmoid', name='gate_es')(es_encoded)print(gate_en)print(gate_es)# EN >> y^sspec_linear_en = Dense(50, activation=None, name='spec_linear_en') (en_encoded)print(spec_linear_en)# g * y^sgated_spec_linear_en = Multiply()([gate_en, spec_linear_en])print(gated_spec_linear_en)# ES >> y^sspec_linear_es = Dense(50, activation=None, name='spec_linear_es')(es_encoded)print(spec_linear_es)# g * y^sgated_spec_linear_es = Multiply()([gate_es, spec_linear_es])print(gated_spec_linear_es)# 1 - Gate >> (1 - g)only_ones_en = K.ones(gate_en.shape)univ_gate_en = Subtract()([only_ones_en, gate_en])print(univ_gate_en)only_ones_es = K.ones(gate_es.shape)univ_gate_es = Subtract()([only_ones_es, gate_es])print(univ_gate_es)# (1 - g) * y^ugated_univ_linear_en = Multiply()([univ_gate_en, univ_linear_en])print(gated_univ_linear_en)gated_univ_linear_es = Multiply()([univ_gate_es, univ_linear_es])print(gated_univ_linear_es)out_en = Add()([gated_spec_linear_en, gated_univ_linear_en])print(out_en)out_es = Add()([gated_spec_linear_es, gated_univ_linear_es])print(out_es)
当我编译我的模型时,我得到了这个错误:
AttributeError: 'NoneType' object has no attribute '_inbound_nodes'
然而,当我用g * y^u
替换(1 - g) * y^u
时,我的模型可以无误地编译:
# (1 - g) * y^ugated_univ_linear_en = Multiply()([gate_en, univ_linear_en])print(gated_univ_linear_en)gated_univ_linear_es = Multiply()([gate_es, univ_linear_es])print(gated_univ_linear_es)
因此,我认为问题出在注释# 1 - Gate >> (1 - g)
下的代码中,更具体地说,是来自减法(1 - g)
。
有谁知道具体的问题是什么以及我如何解决它吗?
回答:
Keras层的输入必须是Keras张量,这些张量是前一层的输出。当你编写only_ones_en = K.ones(gate_en.shape)
时,only_ones_en
不会是一个Keras张量,而是一个后端的张量(例如TensorFlow张量)。
至于你的具体例子,你可以使用Lambda
层更容易地实现这一点:
univ_gate_en = Lambda(lambda x: 1. - x)(gate_en)
或者可能以一种不太有效的方式:
univ_gate_en = Lambda(lambda x: K.ones_like(x) - x)(gate_en)
或者以一种更加冗长且可能不太有效的方式:
only_ones_en = Lambda(lambda x: K.ones_like(x))(gate_en)univ_gate_en = Subtract()([only_ones_en, gate_en])
在你使用K.*
作为层输入的其他地方也适用同样的方法。