умножение тензоров, когда одно из измерений не является постоянным - PullRequest
0 голосов
/ 20 января 2020

У меня есть модель BERT, и я пытаюсь отфильтровать некоторые слова (временные шаги) из вывода. Это выходная форма слоя BERT:

Tensor("bert_layer/bert_layer_module_apply_tokens/bert/encoder/Reshape_13:0", shape=(?, ?, 768), dtype=float32)

, где первый ? - для batch_size, а второй - для количества временных шагов.

Я хочу применить умножение матриц между выводом BERT и вектором нулей и единиц в позициях слов, которые я хочу сохранить (например, 0,0,0,0,1,0,1,0,0 et c.). Таким образом, размерность этого вектора - это количество временных шагов.

Tensor("ExpandDims:0", shape=(?, 200), dtype=float32)

Чтобы умножить, я делаю следующее (см. filtering функция):

bert_max_seq_length = 200
in_id = tf.keras.layers.Input(shape=(bert_max_seq_length,), name="input_ids")
in_mask = tf.keras.layers.Input(shape=(bert_max_seq_length,), name="input_masks")
in_segment = tf.keras.layers.Input(shape=(bert_max_seq_length,), name="segment_ids")

# The filtering vector
e1_mask = tf.keras.layers.Input(shape=(bert_max_seq_length,), name="e1_masks")

bert_inputs = [in_id, in_mask, in_segment]

net = BertLayer(n_fine_tune_layers=0, bert_model='bert-base-uncased')(bert_inputs)
def filtering(sequence_output, e_mask):
    extended_e_mask = tf.keras.backend.expand_dims(e_mask, 1) # `(A)`
    # extended_e_mask shape becomes (?, 1, 200)
    dotted = tf.keras.layers.dot([e_mask, sequence_output], axes=[1, 1]) # `(B)`
    return dotted
e1_h = filtering(net, e1_mask)

pred = tf.keras.layers.Dense(2, activation="softmax")(e1_h)
model = tf.keras.models.Model(inputs=[*bert_inputs, e1_mask], outputs=pred)
optimizer = tf.keras.optimizers.Adam(lr=0.001)
model.compile(loss="categorical_crossentropy", optimizer=optimizer, metrics=["accuracy"])
model.summary()

В точке A Я добавил еще одно измерение к фильтрующему вектору, чтобы он был в форме (1x200). А в точке B я хочу применить умножение матриц между матрицами (?,1,200) и (?,?, 765). Я передаю [1,1] параметру axes, чтобы указать размеры, в которых должен выполняться процесс умножения.

Проблема в том, что вывод BERT не определен во втором измерении, и поэтому я получаю эту ошибку :

ValueError: Dimension incompatibility 200 != None. Layer shapes: (None, 200), (None, None, 768)

Как я могу решить эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...