Как рассчитать оценку нового изображения, используя модель увлеченного автоэнкодера для обнаружения аномалий в тензорном потоке? - PullRequest
0 голосов
/ 12 марта 2020

Я новичок в тензорном потоке, и я пытаюсь создать простой авто-кодер для изображений, чтобы обнаружить аномалии. Во-первых, я создал простой авто-кодер, используя изображения собак, теперь я хочу использовать эту модель, чтобы восстановить мои тестовые изображения и сравнить результат. используя некоторые метрики. Так, как я могу сделать это в тензорном потоке (потому что я новичок в тензорном потоке) (я нашел ту же идею, реализованную в числовых наборах данных, а также в наборе данных MNIST). это мой код:

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import LearningRateScheduler

BATCH_SIZE = 256
EPOCHS = 2
train_datagen = ImageDataGenerator(rescale=1./255)
train_batches = train_datagen.flow_from_directory('C:/MyPath/PetImages1',
    target_size=(64,64), shuffle=True, class_mode='input', batch_size=BATCH_SIZE)




input_img = Input(shape=(64, 64, 3)) 

x = Conv2D(48, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(96, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(192, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
 encoded = Conv2D(32, (1, 1), activation='relu', padding='same')(x)


 latentSize = (8,8,32)


 # DECODER
 direct_input = Input(shape=latentSize)
 x = Conv2D(192, (1, 1), activation='relu', padding='same')(direct_input)
 x = UpSampling2D((2, 2))(x)
 x = Conv2D(192, (3, 3), activation='relu', padding='same')(x)
 x = UpSampling2D((2, 2))(x)
 x = Conv2D(96, (3, 3), activation='relu', padding='same')(x)
 x = UpSampling2D((2, 2))(x)
 x = Conv2D(48, (3, 3), activation='relu', padding='same')(x)
 decoded = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x)
# COMPILE

encoder = Model(input_img, encoded)
decoder = Model(direct_input, decoded)
autoencoder = Model(input_img, decoder(encoded))

autoencoder.compile(optimizer='Adam', loss='binary_crossentropy')
autoencoder.save_weights('autoencoder_DogsAuto.h5')
history=autoencoder.fit_generator(train_batches,steps_per_epoch=10,epochs = 
 EPOCHS)

#Images for tests
 testGene = train_datagen.flow_from_directory('C:/PetImages/',
    target_size=(64,64), shuffle=True, class_mode='input', 
  batch_size=BATCH_SIZE)

  restored = autoencoder.predict_generator(testGene, 
 steps=testGene.n/BATCH_SIZE)

 image_height=64
 image_width=64
 image_channels=3



 x_train = np.zeros((0, image_height, image_width, image_channels), dtype=float)
for x, _ in train_batches :
    if train_batches.total_batches_seen > train_batches.n/BATCH_SIZE:
        break
   else:
       x_train = np.r_[x_train,x]
pred=autoencoder.predict(train_batches, steps=train_batches.n/BATCH_SIZE)
from sklearn import metrics


score1=np.sqrt(metrics.mean_squared_error(pred,x_train ))
print(score1)

И я получил эту ошибку:

Traceback (последний вызов был последним): файл "c: \ autoencoder_anomaly.py", строка 196, в файле score1 = np.sqrt (metrics.mean_squared_error (pred, x_train)) "C: \ Users \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ sklearn \ metrics_regression.py", строка 252, в файле mean_squared_error y_true, y_pred, multioutput) Файл "C: \ Users \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ sklearn \ metrics_regression.py", строка 84, в _check_reg_targets check_consistent_length ( y_true, y_pred)

ValueError: Найдены входные переменные с непоследовательным количеством выборок: [6, 0] Обратите внимание, что я использую только 6 изображений. Так, как я могу вычислить ошибку восстановленного изображения, используя метрики и Модель автоэнкодера на тензорном потоке?

1 Ответ

0 голосов
/ 17 марта 2020

Это просто из-за несоответствия формы.

, когда вы вычисляете среднеквадратичную ошибку, он вычисляет поэлементную ошибку значений истинности и оценочных значений. поэтому pred.shape и train_batches.shape должны быть равны. Проверьте формы входных данных и убедитесь, что они равны.

шаг 1: получите все тренировочные изображения из генератора и добавьте в один массив

x_test = np.zeros((0, image_height, image_width, image_color), dtype=float)
for x, _ in testGene:
    if testGene.total_batches_seen > testGene.n/BATCH_SIZE:
        break
    else:
        x_test = np.r_[x_test , x]

шаг 2: прогноз

pred=autoencoder.predict(testGene, steps=testGene.n/BATCH_SIZE)

шаг 3: вычисление разницы

score1=np.sqrt(metrics.mean_squared_error(pred,testGene))
...