深度CNN的准确性低

时间:2020-01-28 12:22:50

标签: deep-learning conv-neural-network

我已经使用EMNIST和数学符号生成了一个数据集,每个图像有一个字符或每个图像有两个字符。数据集中有72个可能的字符。图片尺寸为28x56(hxw)。

例如:-single character double character

考虑字符的所有组合,有5256(72 * 73)个可能的类。这是标签第一部分中的72个可能字符和第二部分中的73个可能字符(包括空格)。我确保每个班级都有大约540-600张图像。整个数据集约有300万张图像。

我尝试过的CNN模型:

  input_shape = (28, 56, 1)
  model = Sequential()
  model.add(Conv2D(filters=32, kernel_size=(3, 3), padding='same', use_bias=False,
  input_shape=input_shape))
  model.add(Activation('relu'))
  model.add(Conv2D(filters=32, kernel_size=(3, 3), padding='same', use_bias=False))
  model.add(BatchNormalization())
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(.2))

  model.add(Conv2D(filters=64, kernel_size=(3, 3), padding='same', use_bias=False))
  model.add(Activation('relu'))
  model.add(Conv2D(filters=64, kernel_size=(3, 3), padding='same', use_bias=False))
  model.add(BatchNormalization())
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(.2))

  model.add(Conv2D(filters=128, kernel_size=(3, 3), padding='same', use_bias=False))
  model.add(Activation('relu'))
  model.add(Conv2D(filters=128, kernel_size=(3, 3), padding='same', use_bias=False))
  model.add(BatchNormalization())
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(.3))

  model.add(Flatten())
  model.add(Dense(4096, activation='relu'))
  model.add(BatchNormalization())
  model.add(Dense(4096, activation='relu'))

  model.add(Dense(units=5256, activation='softmax'))
  sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

  model.compile(loss='sparse_categorical_crossentropy', optimizer=sgd, metrics=['sparse_categorical_accuracy'])

我什至尝试了一个具有两个10512单位的密集层的模型。我只能达到约66%的准确度。我尝试了32,64,256和ADAM优化程序的各种批处理大小以及各种学习率。如果有人可以指出我在这里做错了,或者提供一些提高准确性的提示,那将是很好的。

1 个答案:

答案 0 :(得分:0)

根据Ruslan S.的建议,我在Resnet50上训练了模型(重新训练了整个网络,而不仅仅是最后一层)。我能够显着提高Accuracy。我能够达到约96%的准确度。