在 Keras 中使用 Subtract 层
Using Subtract layer in Keras
我正在 Keras 中实施 here 描述的 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 >> g
gate_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^s
spec_linear_en = Dense(50, activation=None, name='spec_linear_en') (en_encoded)
print(spec_linear_en)
# g * y^s
gated_spec_linear_en = Multiply()([gate_en, spec_linear_en])
print(gated_spec_linear_en)
# ES >> y^s
spec_linear_es = Dense(50, activation=None, name='spec_linear_es')(es_encoded)
print(spec_linear_es)
# g * y^s
gated_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^u
gated_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'
不过,当我将 (1 - g) * y^u
替换为 g * y^u
时,我的模型编译没有错误:
# (1 - g) * y^u
gated_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 Tensor,而是后端的 Tensor(例如 TensorFlow Tensor)。
至于您的具体示例,您可以使用 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.*
作为图层输入的其他地方。
我正在 Keras 中实施 here 描述的 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 >> g
gate_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^s
spec_linear_en = Dense(50, activation=None, name='spec_linear_en') (en_encoded)
print(spec_linear_en)
# g * y^s
gated_spec_linear_en = Multiply()([gate_en, spec_linear_en])
print(gated_spec_linear_en)
# ES >> y^s
spec_linear_es = Dense(50, activation=None, name='spec_linear_es')(es_encoded)
print(spec_linear_es)
# g * y^s
gated_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^u
gated_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'
不过,当我将 (1 - g) * y^u
替换为 g * y^u
时,我的模型编译没有错误:
# (1 - g) * y^u
gated_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 Tensor,而是后端的 Tensor(例如 TensorFlow Tensor)。
至于您的具体示例,您可以使用 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.*
作为图层输入的其他地方。