#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.