【问题标题】:CNN output accuracy below 50%CNN输出准确率低于50%
【发布时间】:2019-07-15 22:27:45
【问题描述】:

我是在 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 高的图像尺寸?

【问题讨论】:

  • 这是因为您传递了相同的数据集作为特征和标签X_data
  • @MassoudHosseinali 因为我没有标签,它的无监督数据.. 我可以将什么设置为标签而不是 X_data?

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


【解决方案1】:
  1. 我们没有使用 523x393 的图像尺寸。在代码中,您可以看到 28x28 图像始终附加到 X_data 和 X_datatest。我看不出有任何理由先调整为 523x393,然后再调整为 28x28。 (可能是坏的复制面食?)

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

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

  3. 现在是模型的参数。嗯,它因型号而异。你可以决定:

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

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

尝试阅读一些 CNN 教程以了解它们的工作原理。这需要时间,不能在一篇文章中涵盖。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-12
    • 2020-04-07
    • 1970-01-01
    • 2018-09-18
    • 2020-05-07
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多