Плотный слой, не распознающий форму ввода, хотя он должен

#python #tensorflow #keras

#python #тензорный поток #keras

Вопрос:

Суть в том, что я получаю эту ошибку, и я видел несколько сообщений об этом, но, похоже, ничего не соответствует действительности.

 ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.
 

Я использую tf.data.Dataset его в качестве входных данных, и он выдает выходные данные переменной длины в словаре.
Я использую .padded_batch , и все дополняется, как и ожидалось.

Каждый образец представляет собой что-то вроде {'seq_feature1': [1, 2, 3], 'seq_feature2': [5, 6], 'feature': 10} (перед пакетной обработкой и заполнением padding) — внутри моей сети каждый seq_feature из них внедряется tf.keras.layers.Embedding , затем объединяется и передается через LSTM, а затем снова объединяется с другой встроенной функцией (без временного измерения), а затем в плотный слой, где все идет не так.

Вот как выглядит мой прямой проход (модель реализована как подкласс, так что это часть call метода):

 # self.embedding1 amp; 2 amp; 3 are tf.keras.layers.Embedding
embedded_seq1 = self.embedding1(inputs['seq_feature1'])  # (batch_size, seq_len, emb_dim1)
embedded_seq2 = self.embedding2(inputs['seq_feature2'])  # (batch_size, seq_len, emb_dim2)
embedded_feat = tf.squeeze(self.embedding3(inputs['feature']))  # (batch_size, emb_dim3)

# project and pass through LSTM
x = tf.concat([embedded_seq1, embedded_seq2], axis=-1)
x = self.dense1(x)  # <-- Works as expected, (batch_size, seq_len, dense1_units)
x = self.lstm(x)  # (batch_size, lstm_units)

# concat pass through Dense
x = tf.concat([x, embedded_feat, axis=-1)  # (batch_size, lstm_units   emb_dim3)

# ERROR GETS THROWN HERE
x = self.dense2(x)
 

Последняя строка выдает ValueError упомянутое ранее, что не имеет никакого смысла. Я могу вычислить последнее измерение входных данных, и я проверил его, используя быстрое выполнение и просматривая слои один за другим (что работает без ошибок, ошибка возникает только при одновременном запуске всего этого).).

Что я здесь упускаю из виду?

* фактический код использует маскировку в LSTM, но, полагаю, не имеет значения для post


Редактировать

Я могу избежать этой ошибки, если я явно вызову self.dense2.build(tf.TensorShape([None, <the_number_i_can_calculate_but_tf_cant>])) , но поскольку я могу легко вычислить ее, используя lstm_units emb_dim3 , это все еще ошибка, и я не могу понять, почему это происходит

Ответ №1:

Эта ошибка может быть вызвана тем, что форма вывода генератора не передается на первые слои модели, в вашем случае это слои встраивания. У меня была похожая проблема, которую я решил с помощью обходного пути. Для каждого ввода вы должны инициализировать форму вручную:

 my_model._layers[0]._batch_input_shape= my_geneartor.element_spec[0].shape
my_model = tf.keras.models.model_from_json(my_model.to_json()) #rebuilding the model
 

Он работает на tf версии 2.1.