【问题标题】:Keras Conv2D input ShapeKeras Conv2D 输入形状
【发布时间】:2019-04-23 20:51:17
【问题描述】:

我将 Keras 用于我的 CNN 模型。在该模型中,我正在使用图像对其进行训练。我的图像形状为 256*256。但是我将其训练为 64*64。当我将图像大小调整为 64*64 并再次训练时,我的准确率急剧下降。我错过了什么?

当我将 Convolution2D 输入形状排列为

classifier.add(Convolution2D(32,3,3,input_shape = (256,256), activation ='relu'))

这需要很多时间。因此,我将 Convolution2D 设置为 classifier.add(Convolution2D(32,3,3,input_shape = (64,64), activation ='relu')),并训练了我的第一个模型。它预测得很好。

当我将输入图像的形状调整为 64*64 并使用 Convolution2D 进行训练时

classifier.add(Convolution2D(32,3,3,input_shape = (64,64) 

我的准确率降低了。有什么问题?

这里是代码

classifier = Sequential()
classifier.add(Convolution2D(32,3,3,input_shape = (64,64,3), activation ='relu'))
classifier.add(MaxPooling2D(pool_size=(2,2)))
classifier.add(Flatten())
classifier.fit_generator(
        training_set,
        steps_per_epoch=8000,
        epochs=10,
        validation_data=test_set,
        validation_steps=800)

这是我的重塑代码

from PIL import Image
import os
path = 'TestForTrain2'
for file in os.listdir('TestForTrain2'):
    img = Image.open(os.path.join('TestForTrain2', file))
    width, height = img.size
    stringName = str(file)
    print(width," === ",height)
    print(stringName)
    f, e = os.path.splitext(path + file)
    imResize = img.resize((64, 64), Image.ANTIALIAS)
    imResize.save( stringName + '.jpg', 'JPEG', quality=90)

【问题讨论】:

  • 请说明您如何调整图像大小?你用什么来打开它们? opencv,枕头?在这种情况下,它是 opencv 不要忘记它使用 BGR 颜色格式,而不是 RGB 格式。
  • 我很困惑。您的 2 个培训过程有什么区别?
  • 不同之处仅在于输入图像的形状。在我的第一个模型中,输入图像的形状是 256*256。而且这个模型效果很好。在我的第二个模型中,我将输入图像重塑为 64*64,模型的准确率非常低。我不明白为什么会这样。
  • @constt 我添加了重塑代码。而且我还有一个问题,当我将 256*256 形状的输入图像训练为 64*64 输入形状时会发生什么?会影响训练还是CNN会做出一些安排?
  • @GhostDede,您要预测的目标变量是什么?从您发布的顺序模型定义来看,您解决的问题不是很清楚。您是否学习图像嵌入或其他东西?我认为如果您将整个代码发布在这里会很有帮助。

标签: python machine-learning keras


【解决方案1】:

何时预处理: 这可能是预处理的图像。我们只在需要时预处理数据,因为当我们预处理数据时,我们会丢失一些信息。如果我们在某些情况下不对数据进行预处理,那么算法可能需要时间来处理大值(不是预处理数据)。

  1. 当我们训练模型的资源较少时,我们将预处理数据
  2. 我们对数据进行预处理,因为它们在我们的数据中是非常大和非常小的值。比我们标准化它标准化它并在某个范围内获取我们的数据。喜欢 (0,1)
  3. 还有许多其他原因也需要预处理。

但我们不会对所有数据进行预处理。您首先要了解数据的性质,然后再对其进行预处理。

您的解决方案: 现在,您正在通过调整图像大小来预处理数据。通过将您的图像从 ((256,256)) 转换为 ((64,64)) 现在,当您拥有大尺寸图像时,它们是图像中更多的像素值,并且每个像素都会向我们提供一些信息。现在,当您调整图像大小时,像素会减少,因此模型可用于分类的信息会减少。但是,当您不调整数据大小时,您的机器需要时间来处理您的图像。现在通过实验找到一些中间方法,即您选择的尺寸将为您的模型和机器提供足够的信息,从而减少处理它的工作量。试试(180*180) (164 *164) 不断下降,直到根据数据达到您要求的精度。

【讨论】:

  • 其实我按照你说的做了。但是我不明白的部分是,即使我的图像是 256*256 的形状,我也应用了 conv2D 64*64 作为输入形状。通过这样做我缺少什么?顺便谢谢你的回答。
【解决方案2】:

您的模型定义似乎并不完整,它似乎至少错过了最后一个 Dense() 层来执行实际分类。但是,在 2 维中将输入分辨率降低 4 将使您的“原始信息”输入减少 16 (4^2),这最终会对您的预测准确性产生负面影响。

由于信息少很多,因此您的模型无法像以前那样准确地预测类别是合乎逻辑的。

【讨论】:

  • 其实我有 Dense() 层,我只是没有放在这里。我想知道当我调用 classifier.add(Convolution2D(32,3,3,input_shape = (64,64), activation ='relu')) 函数时,即使输入图像的形状为 256*256,它也能很好地预测。即使我的图像在我应用 con2d 时的形状为 256*256 会发生什么。谢谢!
猜你喜欢
  • 2018-08-15
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 2020-06-10
  • 2017-08-14
  • 2018-11-21
相关资源
最近更新 更多