2

I'am пытается изменить keras пример pretrained_word_embeddings, который доступен here и я столкнулся следующий вопрос: если я уменьшил MAX_SEQUENCE_LENGTH varibae, например, чтобы 95 значение я получаю следующее сообщение об ошибке:Ошибка во время воспроизведения с keras например pretrained_word_embeddings

Traceback (most recent call last): File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\framework\common_shapes.py", line 670, in _call_cpp_shape_fn_impl status) File "C:\Program Files\Anaconda3\lib\contextlib.py", line 66, in exit next(self.gen) File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 469, in raise_exception_on_not_ok_status pywrap_tensorflow.TF_GetCode(status)) tensorflow.python.framework.errors_impl.InvalidArgumentError: Negative dimension size caused by subtracting 5 from 2 for 'Conv2D_2' (op: 'Conv2D') with input shapes: [?,2,1,128], [5,1,128,128].

Мне нужно изменить его в случае, если я, например, должен работать с небольшими сообщениями, например, твитами. Я использую бэкэнс Tensorflow.

Пожалуйста, помогите мне уточнить 1) В чем проблема с MAX_SEQUENCE_LENGTH? 2) В чем причина того, что Conv2D_2 находится в следе вместо Conv1D, который я использую в модели.

ответ

7

Давайте пройдемся по определению сети и анализировать формы выходов слоя при MAX_SEQUENCE_LENGTH=95:

sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32') 
embedded_sequences = embedding_layer(sequence_input) 
# Output shape: (95, EMBEDDING_DIM) 
x = Conv1D(128, 5, activation='relu')(embedded_sequences) 
# Output shape: (91, 128) (because of valid border mode) 
x = MaxPooling1D(5)(x) 
# Output shape: (18, 128) 
x = Conv1D(128, 5, activation='relu')(x) 
# Output shape: (14, 128) 
x = MaxPooling1D(5)(x) 
# Output shape: (2, 128) 
x = Conv1D(128, 5, activation='relu')(x) 
# Output shape: (2 - 4??, 128) - PROBLEM!! 
x = MaxPooling1D(35)(x) # In the easiest way - change 35 to 2. 
x = Flatten()(x) 
x = Dense(128, activation='relu')(x) 
preds = Dense(100, activation='softmax')(x) 

Как вы можете видеть, что проблема заключается в последнем Conv1D слое, где не хватает размера, чтобы применить свертку с valid пограничный режим. Есть много способов, как вы могли бы это решить. Самый простой из них, чтобы обрезать последний Conv-MaxPool дуэтом и изменить определение сети для:

sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32') 
embedded_sequences = embedding_layer(sequence_input) 
# Output shape: (95, EMBEDDING_DIM) 
x = Conv1D(128, 5, activation='relu')(embedded_sequences) 
# Output shape: (91, 128) (because of valid border mode) 
x = MaxPooling1D(5)(x) 
# Output shape: (18, 128) 
x = Conv1D(128, 5, activation='relu')(x) 
# Output shape: (14, 128) 
x = MaxPooling1D(5)(x) 
# Output shape: (2, 128) 
x = Flatten()(x) # Here - everything is ok. 
x = Dense(128, activation='relu')(x) 
preds = Dense(100, activation='softmax')(x) 

Конечно, - есть еще способ сделать это (как играть с размером пула, и т.д.).

Причина использования Conv2D исходит из того, что в случае TensorFlow бэкэндом Conv1D реализуются в две размерных сверток с одним размером зажатых иметь размер 1.

+0

Большое спасибо! Это помогает мне разобраться в форме потока через модель. –

+0

Есть ли что-нибудь еще, что я мог бы объяснить? –

+0

спасибо за внимание! Несколько дополнительных вопросов: 1) Можно ли использовать исключение в такой модели? 2) Последний слой MaxPooling1D должен каждый раз охватывать всю форму вывода? На исходной модели последний результат выполнения conv-слоя равен 35, и мы устанавливаем maxpool то же самое значение 35, в моем примере, если у нас есть последний conv 2, поэтому мы можем поставить maxpool как 2. 3) Правильно ли я, если сказать, что увеличение значения 128 (ядра номер) повысит точность –

Смежные вопросы