CNN输出精度低于50%

时间:2019-02-21 21:46:28

标签: python-3.x conv-neural-network unsupervised-learning

我是在python中使用无监督的CNN模型的新手。我正在尝试使用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 :(得分:0)

  1. 我们没有使用图像尺寸523x393。在代码中,您可以看到28x28图像始终被附加到X_data和X_datatest。我看不到任何理由先将其尺寸调整为523x393,然后再次将其尺寸调整为28x28。 (可能是复制的意大利面吗?)

  2. 您要训练的模型是自动编码器。基本上,模型的第一部分( encoder )将尝试将输入图像“编码”为一些抽象的数字矢量(代码中的encoder)。该模型的目的是学习图像与抽象矢量之间的良好转换方案,以使该数字矢量也包含图像的所有特征。

    该模型通过在第二部分中对此进行解码来学习执行此操作。 decoder是与图像尺寸相同的输出,如果模型经过完美训练,则应与输入图像完全匹配。

  3. 现在是模型的参数。好吧,它因模型而异。您可以决定:

    • 输入图像尺寸
    • 所需的层数
    • 每层过滤器的数量
    • 每个过滤器的内核大小

    还有更多。此自动编码器模型的唯一约束是decoder暗角应与input_img暗角匹配。

尝试阅读一些CNN教程,以了解它们的工作原理。这需要时间,并且无法在一篇文章中介绍。

您还应该查看此自动编码器代码的源代码,并查看相应的论文。它将对这些参数的选择有更好的了解。