Точность вывода CNN ниже 50% - PullRequest
0 голосов
/ 22 февраля 2019

Я новичок в использовании неконтролируемой модели CNN в Python.Я пытаюсь использовать модель CNN для классификации изображений с неконтролируемыми входными изображениями спектрограммы.Каждое изображение имеет размер 523 ширины и 393 высоты.И я попробовал следующий код

    X_data = []
files = glob.glob ("C:/train/*.png")
for myFile in files:
    image = cv2.imread (myFile)
    image_resized = misc.imresize(image, (523,393))
    image_resi = misc.imresize(image_resized, (28, 28))
    assert image_resized.shape == (523,393, 3), "img %s has shape %r" % (myFile, image_resized.shape)
    X_data.append (image_resi)

X_datatest = []
files = glob.glob ("C:/test/*.png")
for myFile in files:
    image = cv2.imread (myFile)
    image_resized = misc.imresize(image, (523,393))
    image_resi = misc.imresize(image_resized, (28, 28))
    assert image_resized.shape == (523,393, 3), "img %s has shape %r" % (myFile, image_resized.shape)
    X_datatest.append (image_resi)

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

x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)

x = Conv2D(32, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation='relu')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x)

autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy', metrics=['accuracy'])
X_data = np.array(X_data)
X_datatest = np.array(X_datatest)
##print('X_data shape:', X_data)   

X_data= X_data.astype('float32') / 255.
X_datatest = X_datatest.astype('float32') / 255.
X_data = np.reshape(X_data, (len(X_data), 28, 28, 3))  # adapt this if using `channels_first` image data format
X_datatest = np.reshape(X_datatest, (len(X_datatest), 28, 28, 3))  # adapt this if using `channels_first` image data format

hist=autoencoder.fit(X_data, X_data,
                     epochs=5,batch_size=128,verbose = 2,validation_data=(X_datatest, X_datatest))
##                callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])
avg = np.mean(hist.history['acc'])
print('The Average Training Accuracy is', avg)

Но выход составляет 33% только для точности.Я не знаю почему.Может ли кто-нибудь помочь мне с этим и попытаться заставить меня понять количество фильтров, ядер и изменение размера с 28 * 28 на основе чего?И почему мы просто используем размер изображения, который здесь составляет 523 ширины и 393 высоты?

1 Ответ

0 голосов
/ 22 февраля 2019
  1. Мы не используем размер изображения 523x393.В коде вы можете видеть, что изображение размером 28x28 всегда добавляется к X_data и X_datatest.Я не вижу причин, чтобы сначала изменить размер до 523x393, а затем снова изменить размер до 28x28.(возможно, плохая копировальная паста?)

  2. Модель, которую вы пытаетесь обучить, является автоэнкодером.В основном, первая часть модели ( encoder ) будет пытаться «закодировать» входное изображение как некоторый абстрактный вектор чисел (encoder в коде).Целью модели является изучение хорошей схемы преобразования между изображением и этим абстрактным вектором, чтобы этот вектор чисел также содержал все особенности изображений.

    Модель учится делать это, декодируя это вВторая часть.decoder - это вывод, который имеет те же размеры, что и изображение, и, если модель обучена идеально, должен точно соответствовать входному изображению.

  3. Теперь параметры модели.Ну, это зависит от модели.Вы можете выбрать:

    • размеры входного изображения
    • количество слоев, которое вы хотите
    • количество фильтров в каждом слое
    • размер ядра каждого фильтра

    и многое другое.Единственное ограничение для этой модели автоэнкодера состоит в том, что dims decoder должны соответствовать dims input_img.

Попробуйте прочитать некоторые учебники CNN, чтобы узнать, как они работают.Это займет время и не может быть освещено в одном посте.

Вы также должны взглянуть на источник этого кода автоэнкодера и увидеть соответствующую статью.Это позволит лучше понять выбор этих параметров.

...