精度低的CNN模型

时间:2018-09-06 16:57:26

标签: tensorflow machine-learning keras conv-neural-network image-recognition

我目前正在研究对食物图像进行分类的CNN模型。到目前为止,我已经设法建立了一个可正常运行的CNN,但我想提高准确性。对于数据集,我使用了一些来自Kaggle的图像,很少使用我自己的收藏集中的图像。

以下是有关数据集的一些信息:

  1. 共有91类食物图像。
  2. 每个班级都有大约500到650张图像。
  3. 该数据集已经过手动清理,并检查了不相关或质量不佳的图像(照片的大小不同)。

这是我的CNN模型:

classifier = Sequential()

def cnn_layer_creation(classifier):

classifier.add(InputLayer(input_shape=[224,224,3]))

classifier.add(Conv2D(filters=32,kernel_size=5,strides=1,padding='same',activation='relu',data_format='channels_first'))
classifier.add(MaxPooling2D(pool_size=5,padding='same'))

classifier.add(Conv2D(filters=50,kernel_size=5,strides=1,padding='same',activation='relu'))
classifier.add(MaxPooling2D(pool_size=5,padding='same'))

classifier.add(Conv2D(filters=80,kernel_size=5,strides=1,padding='same',activation='relu',data_format='channels_last'))
classifier.add(MaxPooling2D(pool_size=5,padding='same'))

classifier.add(Dropout(0.25))
classifier.add(Flatten())
classifier.add(Dense(64,activation='relu'))
classifier.add(Dropout(rate=0.5))
classifier.add(Dense(91,activation='softmax'))

# Compiling the CNN
classifier.compile(optimizer="RMSprop", loss = 'categorical_crossentropy', metrics = ['accuracy'])
data_initialization(classifier)

def data_initialization(classifier):

# Part 2 - Fitting the CNN to the images

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

test_datagen = ImageDataGenerator(rescale = 1./255,
                                  shear_range = 0.2,
                                  zoom_range = 0.2,
                                  horizontal_flip = True)

training_set = train_datagen.flow_from_directory('food_image/train',
                                                 target_size = (224, 224),
                                                 batch_size = 100,
                                                 class_mode = 'categorical')

test_set = test_datagen.flow_from_directory('food_image/test',
                                            target_size = (224, 224),
                                            batch_size = 100,
                                            class_mode = 'categorical')

classifier.fit_generator(training_set,
                         steps_per_epoch = 100,
                         epochs = 100,
                         validation_data = test_set,
                         validation_steps = 100)

classifier.save("brynModelGPULite.h5")
classifier.summary()

def main():

cnn_layer_creation(classifier)

培训是在GPU(nVidia 980M)上完成的

不幸的是,准确度未超过10%。我尝试过的事情是:

  1. 增加时期数。

  2. 更改优化器(ADAM,RMSPROP)。

  3. 更改激活功能。

  4. 减小图像输入大小。

  5. 增加批次大小。

  6. 将过滤器大小更改为32、64、128。

这些都没有提高准确性。

任何人都可以向我介绍如何提高模型精度吗?

3 个答案:

答案 0 :(得分:1)

您只能扩充训练数据。

以下代码

test_datagen = ImageDataGenerator(rescale = 1./255,
                                      shear_range = 0.2,
                                      zoom_range = 0.2,
                                      horizontal_flip = True)

应为

test_datagen = ImageDataGenerator(rescale = 1./255)

答案 1 :(得分:0)

首先,我假设您是从头开始构建模型的。由于这样的训练只需要较少的时间(我假设您不会训练模型超过1000个时间),就不会有帮助,因为网络无法完全发展,因为当您训练模型时,在那么短的时间就不能完全学习表示形式从头开始的模型。您可以尝试将纪元数增加到10000,然后看看。相反,为什么不尝试使用转移学习,另外,您也可以使用特征提取和微调,或者同时使用预先训练的卷积网络。作为参考,您可以看看Francois Chollet在书中的第5章,标题为《用Python进行深度学习》。

答案 2 :(得分:0)

我对另一个数据集也遇到了同样的问题,我用<?php namespace pshub; use Illuminate\Database\Eloquent\Model; class AccountType extends Model { /** * The attributes that are mass assignable. * * @var array */ protected $fillable = ['name']; // Create Type Function public function createType($type) { $existence = $this->where('name', $type)->get(); if (sizeof($existence) > 0) { return $this->where('name', $type); } else { $this->name = $type; $this->save(); return $this->id; } } } 替换了平坦层,从而解决了这个问题。

我不确定这对您是否有用,但是由于我的模型具有与您相似的结构,因此我认为这可以为您提供帮助。但是不同的是,我训练了3个班级的模型。