Тензор потока Встраиваемый слой продолжает уменьшать размер пакета до половины - PullRequest
0 голосов
/ 07 апреля 2020

Я строю модель тензорного потока в Google Colab. я путаюсь с поведением встраиваемого слоя. он продолжает уменьшать размер входного слоя до половины.

def build_model(vocab_size, embedding_dim, rnn_units, batch_size):
  model = tf.keras.Sequential([
    tf.keras.layers.Embedding(vocab_size, embedding_dim,
                              batch_input_shape=[batch_size, 100]),
    tf.keras.layers.GRU(rnn_units,
                        return_sequences=True,
                        stateful=True,
                        recurrent_initializer='glorot_uniform'),
    tf.keras.layers.Dense(vocab_size)
  ])
  return model

model = build_model(
  vocab_size = len(vocab),
  embedding_dim=embedding_dim,
  rnn_units=rnn_units,
  batch_size=BATCH_SIZE)

model.compile(optimizer='adam', loss=loss)

, и вот входные данные.

dataset = helperDf(df, 64,100)

набор данных - это пакетный вспомогательный класс. каждый раз, когда он вызывается, он возвращает массив с двумя тензорными размерами [(64,100), (64,100)] для поезда и метки.

вызов

example_batch_predictions = model(dataset.batch())


print(example_batch_predictions.shape, "# (batch_size, sequence_length, vocab_size)")

возвращает штраф. с (64, 100, 48) # (batch_size, sequence_length, vocab_size)

однако, когда я звоню:

history = model.fit(dataset.batch(), epochs=EPOCHS, callbacks=[checkpoint_callback])

Возвращается:

WARNING:tensorflow:Model was constructed with shape (64, 100) for input Tensor("embedding_4_input:0", shape=(64, 100), dtype=float32), but it was called on an input with incompatible shape (32, 100).

, почему он определяет вход как 32, а не 64?

* привет * 1023

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Возможно, весь ваш набор данных не имеет количества выборок, кратного 64. Последняя партия может быть меньше.

Если это так, то ясно, что ваш набор данных кратен 32, и вы можете попробовать использовать размер пакета 32 (как в итераторе набора данных, так и в модели), чтобы проверить, это проблема.

Поскольку вы используете stateful=True и требуется размер пакета, вам необходимо обработать набор данных. Если вы хотите использовать 64, вам, вероятно, потребуется либо создать еще 32 примера (возможно, вы скопируете несколько примеров недопредставленных классов), либо удалите 32 образца (предпочтительно из перепредставленных классов).

0 голосов
/ 14 апреля 2020

Я решаю проблему сам. как генератор. мой класс нужно адаптировать с:

iter ()

и

далее ()

...