Модель LSTM не создается - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь создать базовую модель для задачи NER, используя двунаправленный LSTM с функциональным API, предоставленным Keras

Слой вложения, который я использовал, представляет собой 100-мерный вектор объектов

Входные данные для слоя - это дополненная последовательность длиной

MAX_LEN = 575

(Примечание: вход и выход имеют одинаковые размеры)

Я хочу вывод на каждом шаге по времени, поэтому я установил

return_sequences = True

Выходные данные - это просто активации, прошедшие через слой soft-max

Но при составлении модели я продолжаю получать это предупреждение

UserWarning: Model inputs must come from `keras.layers.Input`
(thus holding past layer metadata), they cannot be the output of a 
previous non-Input layer. Here, a tensor specified as input to your model was
not an Input tensor, it was generated by layer embedding_3.
Note that input tensors are instantiated via `tensor = keras.layers.Input(shape)`.
The tensor that caused the issue was: embedding_3_40/embedding_lookup/Identity:0 str(x.name))

в сопровождении

AssertionError:

Traceback:

---> 37 model = Model(inputs = nn_input, outputs = nn_output)
---> 91             return func(*args, **kwargs)
---> 93             self._init_graph_network(*args, **kwargs)
    222             # It's supposed to be an input layer, so only one node
    223             # and one tensor output.
--> 224             assert node_index == 0

Я попытался отладить код, чтобы проверить размеры, но они, кажется, совпадают, как отмечено комментариями в коде

nn_input = Input(shape = (MAX_LEN,) , dtype = 'int32')

print(nn_input.shape)   #(?, 575)

nn_input = embedding_layer(nn_input)

print(nn_input.shape)   #(?, 575, 100)

nn_out, forward_h, forward_c, backward_h, backward_c = Bidirectional(LSTM(MAX_LEN, return_sequences = True, return_state = True))(nn_input)

print(forward_h.shape)  #(?, 575)
print(forward_c.shape)  #(?, 575)
print(backward_h.shape) #(?, 575)
print(backward_c.shape) #(?, 575)

print(nn_out.shape)     #(?, ?, 1150)

state_h = Concatenate()([forward_h, backward_h])
state_c = Concatenate()([forward_c, backward_c])

print(state_h.shape)    #(?, 1150)
print(state_c.shape)    #(?, 1150)

densor = Dense(100, activation='softmax')
nn_output = densor(nn_out)

print(nn_output.shape)  #(?, 575, 100)

model = Model(inputs = nn_input, outputs = nn_output)

Некоторым это может показаться тривиальным, но я боюсь, что в моем понимании LSTM или, по крайней мере, Keras есть недостаток

В случае необходимости я предоставлю дополнительную информацию в изменениях

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 23 марта 2019

Как показывает ошибка, вы должны передать тензор, который является выводом слоя keras.layers.Input в API модели. В этом случае тензор nn_input является выходом embedding_layer. Измените имя переменной, используемое для назначения вывода embedding_layer из nn_input, на что-то другое.

nn_input = Input(shape = (MAX_LEN,) , dtype = 'int32')
# the line below is the cause of the error. Change the output variable name to like nn_embed. 
nn_input = embedding_layer(nn_input) 
...