Вы подходите к проблеме с неверного направления.
Сначала загрузите данные, используя, например, tfds.load
, cifar10
(для простоты мы будем использовать разбиения по умолчанию TRAIN
и TEST
):
import tensorflow_datasets as tfds
dataloader = tfds.load("cifar10", as_supervised=True)
train, test = dataloader["train"], dataloader["test"]
(вы можете использовать пользовательские tfds.Split
объекты для создания наборов данных проверки или других, см. документацию)
train
и test
являются tf.data.Dataset
объектами, поэтому вы можете использовать map
, apply
, batch
и аналогичные функции для каждого из них.
Ниже приведен пример, в котором я буду (используя tf.image
в основном):
- преобразовать каждое изображение в
tf.float64
в диапазоне 0-1
(не используйте этот дурацкий фрагмент из официальных документов, это гарантирует правильный формат изображения)
cache()
результатов, так как их можно использовать повторно после каждого repeat
- произвольно переворачивать
left_to_right
каждое изображение
- произвольно изменить контраст изображения
- перемешать данные и пакет
- ВАЖНО: повторите все шаги, когда набор данных исчерпан. Это означает, что через одну эпоху все вышеупомянутые преобразования применяются снова (кроме тех, которые были кэшированы).
Вот код, выполняющий вышеуказанное (вы можете изменить lambda
s на функторы или функции):
train = train.map(
lambda image, label: (tf.image.convert_image_dtype(image, tf.float32), label)
).cache().map(
lambda image, label: (tf.image.random_flip_left_right(image), label)
).map(
lambda image, label: (tf.image.random_contrast(image, lower=0.0, upper=1.0), label)
).shuffle(
100
).batch(
64
).repeat()
Такой tf.data.Dataset
можно передать непосредственно методам Кераса fit
, evaluate
и predict
.
Проверка того, что это действительно так работает
Я вижу, вы очень подозрительно относитесь к моему объяснению, давайте рассмотрим пример:
1. Получите небольшой набор данных.
Вот один из способов взять один элемент, который, по общему признанию, нечитабелен и не интуитивно понятен, но вас это должно устроить, если вы сделаете что-нибудь с Tensorflow
:
# Horrible API is horrible
element = tfds.load(
# Take one percent of test and take 1 element from it
"cifar10",
as_supervised=True,
split=tfds.Split.TEST.subsplit(tfds.percent[:1]),
).take(1)
2. Повторите данные и проверьте, совпадают ли они:
Используя Tensorflow 2.0
, можно обойтись без глупых обходных путей (почти):
element = element.repeat(2)
# You can iterate through tf.data.Dataset now, finally...
images = [image[0] for image in element]
print(f"Are the same: {tf.reduce_all(tf.equal(images[0], images[1]))}")
И это неудивительно:
Are the same: True
3. Проверяйте, отличаются ли данные после каждого повтора со случайным увеличением.
Ниже фрагмент repeat
s одиночный элемент 5 раз и проверки, которые равны, а какие разные.
element = (
tfds.load(
# Take one percent of test and take 1 element
"cifar10",
as_supervised=True,
split=tfds.Split.TEST.subsplit(tfds.percent[:1]),
)
.take(1)
.map(lambda image, label: (tf.image.random_flip_left_right(image), label))
.repeat(5)
)
images = [image[0] for image in element]
for i in range(len(images)):
for j in range(i, len(images)):
print(
f"{i} same as {j}: {tf.reduce_all(tf.equal(images[i], images[j]))}"
)
Вывод (в моем случае каждый запуск был бы другим):
0 same as 0: True
0 same as 1: False
0 same as 2: True
0 same as 3: False
0 same as 4: False
1 same as 1: True
1 same as 2: False
1 same as 3: True
1 same as 4: True
2 same as 2: True
2 same as 3: False
2 same as 4: False
3 same as 3: True
3 same as 4: True
4 same as 4: True
Вы также можете преобразовать каждое из этих изображений в numpy
и сами увидеть изображения, используя _ 34_, matplotlib.pyplot.imshow
или другие альтернативы.
Еще один пример визуализации пополнения данных в реальном времени
Этот ответ предоставляет более полное и удобочитаемое представление об увеличении данных с использованием Tensorboard
и MNIST
, возможно, вы захотите проверить это (да Бесстыдный штекер, но полезный наверное).
person
Szymon Maszke
schedule
09.04.2019