性别分类-火车和Val的准确性没有变化

时间:2018-10-18 12:34:01

标签: python tensorflow keras deep-learning conv-neural-network

我的火车套装-男性/女性中有30万张图像,测试套装-男性/女性中有约50K图像。我正在使用下面的工作,还尝试添加更多的层和更多的单元。另外,我正在做数据扩充以及keras文档提供的其他功能。

targetSize =64
classifier.add(Conv2D(filters = 32,kernel_size =(3,3),input_shape=(targetSize,targetSize,3),activation ='relu'))
classifier.add(MaxPooling2D(pool_size = (2,2)))
classifier.add(Conv2D(filters = 32,kernel_size =(3,3),activation ='relu'))
classifier.add(MaxPooling2D(pool_size = (2,2)))
classifier.add(Conv2D(filters = 32,kernel_size =(3,3),activation ='relu'))
classifier.add(MaxPooling2D(pool_size = (2,2)))
classifier.add(Conv2D(filters = 32,kernel_size =(3,3),activation ='relu'))
classifier.add(MaxPooling2D(pool_size = (2,2)))
classifier.add(Flatten())
classifier.add(Dropout(rate = 0.6))
classifier.add(Dense(units = 64, activation='relu'))
classifier.add(Dropout(rate = 0.5))
classifier.add(Dense(units = 64, activation='relu'))
classifier.add(Dropout(rate = 0.2))
classifier.add(Dense(units = 1,activation='sigmoid')

classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
# 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,
                     height_shift_range = 0.2,
                     width_shift_range = 0.2,
                     horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('<train_folder_loc>',
                                                 target_size = (img_size, img_size),
                                                 batch_size = batch_size_train,
                                                 class_mode = 'binary')
test_set = test_datagen.flow_from_directory('<test_folder_loc>',
                                            target_size = (img_size, img_size),
                                            batch_size = batch_size_test,
                                            class_mode = 'binary')
classifier.fit_generator(training_set,
                         steps_per_epoch = <train_image_count>/batch_size_train,
                         epochs = n_epoch,
                         validation_data = test_set,
                         validation_steps = <test_image_count>/batch_size_test,
                         use_multiprocessing = True,
                         workers=<mycpu>)

但是尝试了许多组合后,我得到的结果如下,train acc和val acc没有前进。我一直尝试到100个时代,几乎都一样。

11112/11111 [==============================] - 156s 14ms/step - loss: 0.5628 - acc: 0.7403 - val_loss: 0.6001 - val_acc: 0.6967
Epoch 2/25
11112/11111 [==============================] - 156s 14ms/step - loss: 0.5516 - acc: 0.7403 - val_loss: 0.6096 - val_acc: 0.6968
Epoch 3/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5472 - acc: 0.7404 - val_loss: 0.5837 - val_acc: 0.6967
Epoch 4/25
11112/11111 [==============================] - 155s 14ms/step - loss: 0.5437 - acc: 0.7408 - val_loss: 0.5850 - val_acc: 0.6978
Epoch 5/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5409 - acc: 0.7417 - val_loss: 0.5844 - val_acc: 0.6991
Epoch 6/25
11112/11111 [==============================] - 155s 14ms/step - loss: 0.5386 - acc: 0.7420 - val_loss: 0.5828 - val_acc: 0.7011
Epoch 7/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5372 - acc: 0.7427 - val_loss: 0.5856 - val_acc: 0.6984
Epoch 8/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5347 - acc: 0.7437 - val_loss: 0.5847 - val_acc: 0.7017
Epoch 9/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5331 - acc: 0.7444 - val_loss: 0.5770 - val_acc: 0.7017
Epoch 10/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5323 - acc: 0.7443 - val_loss: 0.5803 - val_acc: 0.7037
Epoch 11/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5309 - acc: 0.7453 - val_loss: 0.5877 - val_acc: 0.7018
Epoch 12/25
11112/11111 [==============================] - 155s 14ms/step - loss: 0.5294 - acc: 0.7454 - val_loss: 0.5774 - val_acc: 0.7037
Epoch 13/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5282 - acc: 0.7464 - val_loss: 0.5807 - val_acc: 0.7024
Epoch 14/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5276 - acc: 0.7467 - val_loss: 0.5815 - val_acc: 0.7033
Epoch 15/25
11112/11111 [==============================] - 156s 14ms/step - loss: 0.5269 - acc: 0.7474 - val_loss: 0.5753 - val_acc: 0.7038
Epoch 16/25
11112/11111 [==============================] - 154s 14ms/step - loss: 0.5263 - acc: 0.7477 - val_loss: 0.5825 - val_acc: 0.7039
Epoch 17/25
11112/11111 [==============================] - 155s 14ms/step - loss: 0.5249 - acc: 0.7485 - val_loss: 0.5821 - val_acc: 0.7037

我需要您对此或任何片段的建议才能尝试。

3 个答案:

答案 0 :(得分:0)

  1. 在尝试扩展网络之前,请确保您对一个小样本过度拟合。

  2. 我将删除部分/全部Dropout层,看看它是否可以提高性能。我认为3个Dropout层很高。

  3. 尝试降低学习率。

答案 1 :(得分:0)

尝试并了解CNN的一些基本原理以及其构建方式;实现一个简单的方法,该方法可以在任意输入自己的参数之前起作用。

例如,通常,连续卷积中滤波器的数量以2的幂(例如32、64、128等)增加。您对dropout的使用也值得怀疑,0.6很高,更不用说像您一样堆叠三个dropout了。

答案 2 :(得分:-1)

如果您仔细观察它,那并不是说它不动。它有点移动。有时候,无论训练多长时间,甚至增加多少层,模型都只能在某个特定点变得更好。发生这种情况时,一切都归结为数据。我认为最好确定是什么阻碍了模型的改进。另外,我的朋友,训练好模型并不会在一夜之间发生,特别是对于现实世界的数据,尤其是对于复杂的数据(例如人的图像)而言。

我想,如果您只是在学习一个比您自己的评分更高的教程,则可以检查其使用的软件包的版本,所拥有的数据,所采取的步骤,更重要的是重新运行模型。在某些情况下,模型可以在不同的训练实例上获得不同的分数。

我建议您应该尝试更多地使用这些层,甚至使用其他类型的神经网络。如果没有,您应该尝试更多地处理数据。 300k图像很多,但是在图像分类方面,可能确实很难。

最后,我想您可以通过tensorflow研究transfer learning。您可以在那里阅读。它通过重新训练预制的图像识别模型来工作。 Keras也有tutorial关于转学的知识。