Ошибка значения: форма должна иметь ранг 3, но имеет ранг 2. Для слоя `Concatenate` требуются входные данные с соответствующими формами, за исключением concat

#python #tensorflow #keras #deep-learning #tensorflow2.0

#python #tensorflow #keras #глубокое обучение #tensorflow2.0

Вопрос:

Я пытаюсь использовать функциональный API Tensorflow для определения нейронной сети с несколькими входами.

Это мой код:

 from keras_self_attention import SeqSelfAttention
from tensorflow import keras
Input1 = Input(shape=(120, ),name="Input1")
Input2 = Input(shape=(10, ),name="Input2")
embedding_layer = Embedding(30,5,  input_length=120,)(Input1) 
lstm_layer = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(units=512))(embedding_layer)                  
attention=SeqSelfAttention(attention_activation='sigmoid')(lstm_layer) 
merge = concatenate([attention, Input2])                                  
  

Однако я получаю следующую ошибку:

 ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, None, 1024), (None, 10)]. 
  

Если я изменяю форму Input2 на (None,10, ), то я получаю эту ошибку:

 ValueError: Shape must be rank 3 but is rank 2 for '{{node model/concatenate/concat}} = ConcatV2[N=2, T=DT_FLOAT, Tidx=DT_INT32](model/dense/BiasAdd, model/Cast_1, model/concatenate/concat/axis)' with input shapes: [?,?,1024], [?,10], [].
  

и если я изменяю форму Input2 на (1,10, ), то я получаю эту ошибку:

 ValueError: Shape must be rank 3 but is rank 2 for '{{node model/concatenate/concat}} = ConcatV2[N=2, T=DT_FLOAT, Tidx=DT_INT32](model/dense/BiasAdd, model/Cast_1, model/concatenate/concat/axis)' with input shapes: [?,?,1024], [?,10], [].
  

Как я могу изменить вывод attention layer с (None, None, 1024) на что-то, с чем я могу объединить (None, 10)?

Комментарии:

1. Итак, я так понимаю, вы хотите объединить Input2 с каждым элементом в последовательности?

2. ДА. У меня есть только одна последовательность на входе, и я хочу обратить на нее внимание, а затем объединить с другим входом. Как я могу это сделать? Я получаю ошибку, которую я объяснил выше.

3.Проверьте tf.tile . Вам нужно Input2 N время тайлинга, где N — количество временных шагов в выводе attention .

4. @SusmitAgrawal Даже слой внимания не работает, и я получаю ошибку IndexError: индекс списка вне диапазона (это сообщение об ошибке связано со строкой, посвященной вниманию). Есть идеи, как установить гиперпараметры и / или размещать слои один за другим?

Ответ №1:

Входные данные для слоя concatenate не будут иметь соответствующих размеров. Вы можете добавить слой изменения формы перед слоем объединения, чтобы решить эту проблему.

 [(None, None, 1024), (None, 10)].
  

Здесь один равен трем, а один равен двум. Измените первый ввод на [None,1024] или измените второй ввод в [None, 1 , 10] зависимости от того, что вам нужно.

 reshape_layer = tf.keras.layers.Reshape((1024,))(attention)
merge = concatenate([reshapelayer, Input2])