#python #tensorflow #keras #augmentor
#python #tensorflow #keras #augmentor
Вопрос:
Я пытаюсь обучить модель keras, используя keras_generator из библиотеки Augmentor, и проблема в том, что я не могу получить больше изображений, чем у меня уже есть.
Теперь у меня есть каталог с классами:
images/
0/0.png
1/1.png
...
z/z.png
Я запускаю следующий код python:
import Augmentor
pipeline = Augmentor.Pipeline("images")
pipeline.rotate(probability=0.7, max_left_rotation=10, max_right_rotation=10)
pipeline.zoom(probability=0.5, min_factor=1.1, max_factor=1.3)
pipeline.random_distortion(probability=0.8, grid_width=4, grid_height=4, magnitude=1)
pipeline.greyscale(1.0)
pipeline.invert(1.0)
pipeline.status()
Что дает вывод:
Initialised with 22 image(s) found.
Output directory set to images/output.Operations: 5
0: RotateRange (probability=0.7 max_left_rotation=-10 max_right_rotation=10 )
1: Zoom (probability=0.5 min_factor=1.1 max_factor=1.3 )
2: Distort (probability=0.8 grid_width=4 grid_height=4 magnitude=1 randomise_magnitude=True )
3: Greyscale (probability=1.0 )
4: Invert (probability=1.0 )
Images: 22
Classes: 22
Class index: 0 Class label: 0
...
Class index: 20 Class label: x
Class index: 21 Class label: y
Dimensions: 1
Width: 28 Height: 28
Formats: 1
PNG
Затем я создаю модель:
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Model
from keras.optimizers import Adam
from keras.layers import Conv2D, Input, Dropout, Flatten, Dense, MaxPooling2D
img_input = Input(shape=(28, 28, 1))
x = Conv2D(32, 3, activation='relu')(img_input)
x = Conv2D(64, 3, activation='relu')(x)
x = MaxPooling2D(2, 2)(x)
x = Dropout(0.25)(x)
x = Flatten()(x)
x = Dense(128, activation='relu')(x)
x = Dropout(0.5)(x)
output = Dense(22, activation='softmax')(x)
model = Model(img_input, output)
model.compile(loss='categorical_crossentropy',
optimizer=Adam(),
metrics=['acc'])
И дайте ему генератор для обучения:
generator = pipeline.keras_generator(batch_size=128)
model.fit_generator(generator, steps_per_epoch=len(pipeline.augmentor_images)/128, epochs=5, verbose=1)
Который возвращает мне вывод
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.cast instead.
Epoch 1/5
1/0 [==============================================================================================================================================================================] - 1s 1s/step - loss: 3.1237 - acc: 0.0312
Epoch 2/5
1/0 [==============================================================================================================================================================================] - 0s 361ms/step - loss: 2.9429 - acc: 0.1797
Epoch 3/5
1/0 [==============================================================================================================================================================================] - 0s 298ms/step - loss: 2.7841 - acc: 0.2188
Epoch 4/5
1/0 [==============================================================================================================================================================================] - 0s 417ms/step - loss: 2.4919 - acc: 0.3672
Epoch 5/5
1/0 [==============================================================================================================================================================================] - 0s 439ms/step - loss: 2.2927 - acc: 0.3438
Таким образом, он видит только одно изображение, которое было в каталоге изображений для соответствующего класса. Как я могу передать ему тысячи изображений, не сохраняя их на диске?
Комментарии:
1. что вы получаете, когда делаете
next(generator)
. Получаете ли вы элементы, равные вашему batch_size?2. @borarak Привет. Да, я получаю массив изображений и массив меток, равных моему batch_size