带有keras的CNN,准确性没有提高

Laxmikant:

我最近开始学习机器学习,正在学习CNN,我计划在此Keras博客和此github repo的帮助下编写一个用于汽车损坏严重性检测的应用程序

汽车数据集如下所示:

F:\WORKSPACE\ML\CAR_DAMAGE_DETECTOR\DATASET\DATA3A
├───training (979 Images for all 3 categories of training set)
│   ├───01-minor
│   ├───02-moderate
│   └───03-severe
└───validation (171 Images for all 3 categories of validation set)
    ├───01-minor
    ├───02-moderate
    └───03-severe

以下代码仅给我32%的准确性。

from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras import backend as K


# dimensions of our images.
img_width, img_height = 150, 150

train_data_dir = 'dataset/data3a/training'
validation_data_dir = 'dataset/data3a/validation'
nb_train_samples = 979
nb_validation_samples = 171
epochs = 10
batch_size = 16

if K.image_data_format() == 'channels_first':
    input_shape = (3, img_width, img_height)
else:
    input_shape = (img_width, img_height, 3)

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

# this is the augmentation configuration we will use for training
train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

# this is the augmentation configuration we will use for testing:
# only rescaling
test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')
model.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=nb_validation_samples // batch_size)

model.save_weights('first_try.h5')

我试过了:

  • 通过将时代增加到10、20、50。
  • 通过增加数据集中的图像(将所有验证图像添加到训练集中)。
  • 通过更新Conv2D图层中的过滤器大小
  • 试图添加几层Conv2DMaxPooling几层
  • 还具有不同的优化,如试过adamSgd
  • 还尝试通过将过滤器步幅更新为(1,1) and (5,5)而不是(3,3)
  • 还通过更新变更图像尺寸,以尝试(256, 256)(64, 64)(150, 150)

但是,没有运气,每次我获得的准确率都高达32%或更低,但不超过32%。知道我想念的是什么。

正如我们github repo中看到的那样,对于同一数据集,它给出72%的准确性(训练-979,验证-171)。为什么它不适合我。

我在机器上的github链接上尝试了他的代码,但是在训练数据集时挂断了(我等了8个多小时),所以改变了方法,但是到目前为止还算不上运气。

这是Pastebin,其中包含我的训练纪元的输出。

SymbolixAU:

该问题是由于输出类别的数量(三个)与最终层激活(S型)和损失函数(二进制交叉熵)的选择不匹配而引起的。

S型函数将实值“压缩”为[0,1]之间的值,但它仅适用于二进制(两类)问题。对于多个类,您需要使用诸如softmax函数之类的东西。Softmax是Sigmoid的通用版本(当您有两个类时,两个应等效)。

损耗值也需要更新为可以处理多个类别的值-在这种情况下,分类交叉熵将起作用。

在代码方面,如果您将模型定义和编译代码修改为以下版本,则它应该起作用。

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(3))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

最后,您需要class_mode='categorical'在数据生成器中指定这将确保输出目标的格式设置为3列分类矩阵,该列在对应于正确值的列中为1,而在其他位置为零。categorical_cross_entropy损失函数需要此响应格式

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

术语准确性和验证准确性之间有什么区别

keras准确性提高不超过61%

keras准确性提高不超过59%

提高缩小图像的准确性

准确性没有进一步提高

CNN火车的准确性在训练期间会提高,但测试准确性可保持在40%左右

具有Tensorflow的CNN,在CIFAR-10上的准确性较低,并且没有改进

当神经网络的损失在减少但准确性没有提高时?

有没有一种语义相似性方法优于word2vec方法以提高语义准确性?

具有featurewise_center的ImageDataGenerator()上的Keras fit()验证准确性较差

如何提高LSTM训练的准确性

“ Booster”对象没有“ score”属性-准确性

CNN的培训和测试准确性没有增加,其次是RNN以进行签名验证

Keras CNN的准确性很高,但预测错误。如何改善

为什么训练准确性没有提高?

辍学层将提高准确性

Keras的CNN模型的准确性差

验证损失和准确性提高

随机森林提高准确性

如何在Keras中提高CNN分类器的准确性?

提高2D CNN的准确性

提高QR码读取的准确性

当我训练我的Caffe模型时,损失总是保持很大的值,并且准确性并没有提高。

损失或准确性没有变化

验证准确性没有意义

Tensorflow 代码准确性没有增加

如何提高读取tesseract的准确性?

自定义小 CNN 比预训练分类器具有更好的准确性

有人可以看看我的 Keras CNN 模型并帮助我确定提高训练和验证准确性的方法吗?