Использование вычитания слоя в Keras - PullRequest
0 голосов
/ 20 декабря 2018

Я реализую в 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 >> 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).

Кто-нибудь знает, в чем именно заключается проблема и как я могу ее решить?

1 Ответ

0 голосов
/ 20 декабря 2018

На входе слоя Keras должны быть тензоры Keras, которые являются выходом предыдущих слоев.Когда вы пишете only_ones_en = K.ones(gate_en.shape), тогда only_ones_en не будет тензором Keras, скорее это будет тензором бэкэнда (например, 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.* в качестве ввода слоя .

...