为什么有keras的CNN无法学习?

时间:2019-05-13 19:45:48

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

我是深度学习(尤其是keras)的新手,并且我从大学分配来训练CNN并使用keras进行学习。我正在使用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

我在代码中做错了吗?是数据集拆分吗?我目前处在一个黑点,我似乎无法弄清楚。

0 个答案:

没有答案