Я думаю, что этот ответ будет полезным. Думаю, вы понимаете, что для каждой проблемы не существует общего решения. Вам нужно попробовать разные архитектуры, разные комбинации гиперпараметров и разные методы обработки изображений для обучения вашей сети.
- Для предварительной обработки данных и загрузки изображений в сеть. Вы можете использовать keras для обработки изображений , класс ImageGenerator для увеличения изображений и загрузки изображений в сеть.
Сначала вы создаете ImageGenerator с необходимыми конфигурациями.
datagen = ImageDataGenerator(width_shift_range=0.1,
height_shift_range=0.1,
horizontal_flip=False,
vertical_flip=False,
rescale=1/255)
Вторая загрузка изображений из каталога через ImageGenerator
trainGene = datagen.flow_from_directory(train_path,
color_mode="grayscale", #use grayscale images
target_size=(image_height,image_width), #image size
shuffle=True,
class_mode="input",
batch_size=batch_size,
save_to_dir=None)
Вы можете создать генератор данных проверки и загрузить набор данных проверки из directory.for пример проверки (valGene)
Создайте модель Convolution AutoEncoder и подгоните ее к генераторам.
Это зависит от варианта использования, и вам нужно попробовать разные слои и функцию потерь и разные архитектуры для достижения требуемого порога. Например, начните с простой архитектуры.
Layer (type) Output Shape Param #
=================================================================
input0 (InputLayer) (None, 64, 32, 1) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 64, 32, 32) 320
_________________________________________________________________
activation_1 (Activation) (None, 64, 32, 32) 0
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 32, 16, 32) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 16384) 0
_________________________________________________________________
dense_1 (Dense) (None, 16) 262160
_________________________________________________________________
dense_2 (Dense) (None, 16384) 278528
_________________________________________________________________
reshape_1 (Reshape) (None, 32, 16, 32) 0
_________________________________________________________________
up_sampling2d_1 (UpSampling2 (None, 64, 32, 32) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 64, 32, 32) 9248
_________________________________________________________________
activation_2 (Activation) (None, 64, 32, 32) 0
_________________________________________________________________
conv2d_3 (Conv2D) (None, 64, 32, 1) 289
_________________________________________________________________
activation_3 (Activation) (None, 64, 32, 1) 0
model.fit_generator(trainGene,
steps_per_epoch=trainGene.n/batch_size,
validation_data=valGene,
validation_steps=valGene.n/batch_size,
epochs=epochs, # number of epochs
verbose=True)
предсказание восстановления изображения для создания другого генератора для тестового набора (testGene)
restored = model.predict_generator(testGene, steps=testGene.n/batch_size)
Получите разницу
Теперь вы восстановили изображения для данного заказа.
difference = reconstructed_image - original_image
, например,
если вы хотите получить среднеквадратическую ошибку для каждого изображения
RMSE = np.sqrt(np.square(restored - x_test)/dim)
#x_test is your original images that used to predict
, вы можете получить x_test с помощью testGene следующим образом:
x_test = np.zeros((0, image_height, image_width, image_channels), dtype=float)
for x, _ in testGene:
x_test = np.r_[x_test, x]
if testGene.total_batches_seen > testGene.n/batch_size:
break