Keras TimeDistributed Conv1D Ошибка - PullRequest
0 голосов
/ 24 августа 2018

Это мой код:

cnn_input = Input(shape=(cnn_max_length,)) 
emb_output = Embedding(num_chars + 1, output_dim=32, input_length=cnn_max_length, trainable=True)(cnn_input)
output = TimeDistributed(Convolution1D(filters=128, kernel_size=4, activation='relu'))(emb_output)

Я хочу обучить метку последовательности CNN на уровне персонажа и получаю эту ошибку:

Traceback (most recent call last):
  File "word_lstm_char_cnn.py", line 24, in <module>
    output = kl.TimeDistributed(kl.Convolution1D(filters=128, kernel_size=4, activation='relu'))(emb_output)
  File "/home/user/anaconda3/envs/thesisenv/lib/python3.6/site-packages/keras/engine/base_layer.py", line 457, in __call__
    output = self.call(inputs, **kwargs)
es/keras/layers/wrappers.py", line 248, in call
    y = self.layer.call(inputs, **kwargs)
  File "/home/user/anaconda3/envs/thesisenv/lib/python3.6/site-packages/keras/layers/convolutional.py", line 160, in call
    dilation_rate=self.dilation_rate[0])
  File "/home/user/anaconda3/envs/thesisenv/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 3526, in conv1d
    data_format=tf_data_format)
  File "/home/user/anaconda3/envs/thesisenv/lib/python3.6/site-packages/tensorflow/python/ops/nn_ops.py", line 779, in convolution
    data_format=data_format)
  File "/home/user/anaconda3/envs/thesisenv/lib/python3.6/site-packages/tensorflow/python/ops/nn_ops.py", line 828, in __init__
    input_channels_dim = input_shape[num_spatial_dims + 1]
  File "/home/user/anaconda3/envs/thesisenv/lib/python3.6/site-packages/tensorflow/python/framework/tensor_shape.py", line 615, in __getitem__
    return self._dims[key]
IndexError: list index out of range

Вход 3D, как и должно быть. Если я изменяю форму ввода, я получаю эту ошибку:

ValueError: Input 0 is incompatible with layer time_distributed_1: expected ndim=3, found ndim=4

1 Ответ

0 голосов
/ 24 августа 2018

Рекомендуемое решение : в этом случае нет необходимости использовать TimeDistributed.Вы можете решить эту проблему следующим кодом:

output = Convolution1D(filters=128, kernel_size=4, activation='relu')(emb_output)

На всякий случай, если вы хотите использовать TimeDistributed, вы можете сделать что-то вроде:

output = TimeDistributed(Dense(100,activation='relu'))(emb_output)

Не рекомендуется : Согласно документации:

Эта оболочка применяет слой к каждому временному фрагменту ввода.

Вход в TimeDistributed является чем-токак batch_size * seq_len * emb_size.Когда Conv1D применяется к каждой последовательности, ему нужны 2 измерения, но найдено только одно.

Вы можете решить проблему, добавив одно измерение к вашей последовательности:

TimeDistributed(Conv1D(100, 1))(keras.backend.reshape(emb, [-1, sequence_len, embeding_dim, 1]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...