#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])