TF2 padded_batch для контролируемого набора данных - PullRequest
1 голос
/ 13 февраля 2020

Постановка проблемы

Я следую этому учебнику . Сначала учебник загружает контролируемый набор данных (используя tfds.load с as_supervised=True):

(train_data, test_data), info = tfds.load(
    'imdb_reviews/subwords8k', 
    split = (tfds.Split.TRAIN, tfds.Split.TEST), 
    with_info=True, as_supervised=True)

Затем учебник предлагает перемешать и дополнить набор данных следующим образом:

Mov ie рецензии могут быть разной длины. Мы будем использовать метод padded_batch для стандартизации длины проверок.

train_batches = train_data.shuffle(1000).padded_batch(10)
test_batches = test_data.shuffle(1000).padded_batch(10)

... но, к сожалению, метод padded_batch нуждается в дополнительном аргументе, что учебник, кажется, забыл:

Traceback (most recent call last):
  File "imdb_reviews.py", line 14, in <module>
    train_batches = train_data.shuffle(1000).padded_batch(10)
TypeError: padded_batch() missing 1 required positional argument: 'padded_shapes'

Важное предположение

Хотя в стеке ошибок говорится, что padded_shapes является отсутствующим аргументом, из учебника я считаю справедливым сделать вывод, что отсутствующий аргумент на самом деле batch_size (что должно предшествовать padded_shapes).

То, что я пробовал

Я думал, что это можно легко исправить следующим образом:

batch_sz = 100 # arbitrary number
train_batches = train_data.shuffle(1000).padded_batch(batch_sz, ([10],[None]))
test_batches = test_data.shuffle(1000).padded_batch(batch_sz, ([10],[None]))

... но мое решение, по-видимому, неверно:

Traceback (most recent call last):
  File "imdb_reviews.py", line 15, in <module>
    train_batches = train_data.shuffle(1000).padded_batch(batch_sz, ([10],[None]))
  File "/home/ggiuffre/.local/lib/python3.7/site-packages/tensorflow_core/python/data/ops/dataset_ops.py", line 2298, in padded_batch
    batch_size, padded_shapes, padding_values, drop_remainder))
  File "/home/ggiuffre/.local/lib/python3.7/site-packages/tensorflow_core/python/data/ops/dataset_ops.py", line 1481, in padded_batch
    drop_remainder)
  File "/home/ggiuffre/.local/lib/python3.7/site-packages/tensorflow_core/python/data/ops/dataset_ops.py", line 3813, in __init__
    _padded_shape_to_tensor(padded_shape, input_component_shape))
  File "/home/ggiuffre/.local/lib/python3.7/site-packages/tensorflow_core/python/data/ops/dataset_ops.py", line 3741, in _padded_shape_to_tensor
    % (padded_shape_as_shape, input_component_shape))
ValueError: The padded shape (None,) is not compatible with the corresponding input component shape ().

Замена None на () дает мне ValueError: Padded shape [()] must be a 1-D tensor of tf.int64 values, but its shape was (1, 0).

Замена None на 1 дает мне ValueError: The padded shape (1,) is not compatible with the corresponding input component shape ().

Задача

Какое значение я должен дать аргументу padded_shapes? Или, в целом, что я здесь не так делаю?

Большое спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Посмотрите на этот блог. https://medium.com/@a.ydobon /ensorflowflow-2-0-word-embeddings-part3-964b2b9caf94

Рекомендует

padded_shapes = ([None],())
train_batches = train_data.shuffle(1000).padded_batch(10,padded_shapes=padded_shapes)
test_batches = test_data.shuffle(1000).padded_batch(10,padded_shapes=padded_shapes)

Это сработало для меня.

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

Это также отлично работает

batch_sz = 100 # arbitrary number
train_batches = train_data.shuffle(1000)
test_batches = test_data.shuffle(1000)

train_batches = train_batches.padded_batch(batch_sz, train_batches.output_shapes)
test_batches = test_batches.padded_batch(batch_sz, test_batches.output_shapes)

Чем вы можете определить свои слои LSTM и подогнать train_batches, test_batches

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