Почему cnn с керасом не учится? - PullRequest
0 голосов
/ 13 мая 2019

Я в некотором роде новичок в области глубокого обучения и особенно в керасе, и у меня есть задание из университета, чтобы обучать CNN и узнавать об этом, используя керас.Я использую набор данных MURA (скелетная рентгенография).

То, что я делал до сих пор, - это просмотр всех изображений из набора данных и разделение тренировочного набора на поезд и проверку (90/10).

Я использую CNN, который был указан в статье, и мне не разрешено изменять его до второго задания.Первая задача - наблюдать и понимать CNN.

def run():
    train_datagen = ImageDataGenerator(rescale=1./255)

    val_datagen = ImageDataGenerator(rescale=1./255)

    train_generator = train_datagen.flow_from_directory('train_data',
                                                        target_size=(227,227),
                                                        batch_size=BATCH_SIZE,
                                                        class_mode='binary',
                                                        color_mode='grayscale'
                                                        )


    val_generator = val_datagen.flow_from_directory('test_data',
                                                        target_size=(227,227),
                                                        batch_size=BATCH_SIZE,
                                                        class_mode='binary',
                                                        color_mode='grayscale'
                                                        )

    classifier = Sequential()
    classifier.add(Conv2D(64,(7,7),strides=2, input_shape=(227,227,1)))
    classifier.add(Activation('relu'))
    classifier.add(MaxPooling2D(pool_size=(2,2), strides=2))
    classifier.add(Conv2D(128, (5,5), strides=2 ))
    classifier.add(Activation('relu'))
    classifier.add(MaxPooling2D(pool_size=(2,2),strides=2))
    classifier.add(Conv2D(256, (3,3), strides=1))
    classifier.add(Activation('relu'))
    classifier.add(Conv2D(384, (3,3), strides=1))
    classifier.add(Activation('relu'))
    classifier.add(Conv2D(256, (3,3), strides=1))
    classifier.add(Activation('relu'))
    classifier.add(Conv2D(256, (3,3), strides=1))
    classifier.add(Activation('relu'))
    classifier.add(MaxPooling2D(pool_size=(2,2),strides=2))
    classifier.add(Flatten())
    classifier.add(Dropout(0.5))
    classifier.add(Dense(units=2048))
    classifier.add(Activation('relu'))
    classifier.add(Dropout(0.5))
    classifier.add(Dense(units=1))
    classifier.add(Activation('sigmoid'))

    classifier.summary()

    # from keras.optimizers import SGD

    # sg = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)

    classifier.compile(optimizer=keras.optimizers.SGD(),loss='binary_crossentropy', metrics=['accuracy'])

    classifier.fit_generator(train_generator,
                            steps_per_epoch= training_len//BATCH_SIZE,
                            epochs=10,
                            validation_data=val_generator,
                            validation_steps= valid_len//BATCH_SIZE,
                            shuffle=True,
                            verbose=1)
    classifier.save_weights('first_model_weights.h5')
    classifier.save('first_model.h5')

Проблема, с которой я сталкиваюсь, заключается в том, что, если я запускаю это, он просто не учится.Или, по крайней мере, я так думаю.Вывод выглядит так:

Epoch 1/10
575/575 [==============================] - 693s 1s/step - loss: 0.6767 - acc: 0.5958 - val_loss: 0.6751 - val_acc: 0.5966
Epoch 2/10
575/575 [==============================] - 207s 359ms/step - loss: 0.6760 - acc: 0.5948 - val_loss: 0.6752 - val_acc: 0.5958
Epoch 3/10
575/575 [==============================] - 258s 448ms/step - loss: 0.6745 - acc: 0.5983 - val_loss: 0.6748 - val_acc: 0.5958
Epoch 4/10
575/575 [==============================] - 165s 287ms/step - loss: 0.6760 - acc: 0.5950 - val_loss: 0.6757 - val_acc: 0.5947
Epoch 5/10
575/575 [==============================] - 166s 288ms/step - loss: 0.6761 - acc: 0.5948 - val_loss: 0.6731 - val_acc: 0.6016
Epoch 6/10
575/575 [==============================] - 167s 290ms/step - loss: 0.6742 - acc: 0.5990 - val_loss: 0.6778 - val_acc: 0.5875
Epoch 7/10
575/575 [==============================] - 206s 359ms/step - loss: 0.6762 - acc: 0.5938 - val_loss: 0.6721 - val_acc: 0.6038
Epoch 8/10
575/575 [==============================] - 165s 286ms/step - loss: 0.6762 - acc: 0.5938 - val_loss: 0.6763 - val_acc: 0.5947
Epoch 9/10
575/575 [==============================] - 164s 286ms/step - loss: 0.6751 - acc: 0.5972 - val_loss: 0.6787 - val_acc: 0.5897
Epoch 10/10
575/575 [==============================] - 168s 292ms/step - loss: 0.6750 - acc: 0.5971 - val_loss: 0.6722 - val_acc: 0.6022

Я что-то не так делаю в коде?Это разделение набора данных?В настоящее время я нахожусь в темном месте, и я не могу понять это.

...