Keras Conv2D输入形状

时间:2019-04-23 20:51:18

标签: python machine-learning keras

我正在将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)

2 个答案:

答案 0 :(得分:1)

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

由于信息量少,因此逻辑上模型无法像以前一样准确地预测类。

答案 1 :(得分:1)

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

  1. 我们将在资源较少的情况下对数据进行预处理
  2. 我们对数据进行预处理,因为它们在我们的数据中既很大又很小。比我们标准化它标准化它并获得我们的数据在一定范围内。像(0,1)
  3. 它们还有许多其他原因需要预处理。

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

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