二进制分类结果不佳,数据非常少

时间:2017-09-23 14:41:31

标签: deep-learning keras classification

我只有141张照片,每张照片71张(医学影像) 我想把它们归类。我知道这是非常少的数据所以我想使用扩充。

我的问题是,在使用增强时,我甚至无法通过训练数据传递0.5精度!

当我只训练141张图像时,我可以达到80%,所以它必然意味着我正在使用增强错误?

如果有人在这里可以理解我做错了什么,我会很高兴:

我的模特:

from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras import optimizers
K.clear_session()
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(256,256,1)))
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(2, activation='softmax'))


sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

model.compile(loss='categorical_crossentropy',
              optimizer=sgd,
              metrics=['accuracy'])
#normalize
meanImg = np.mean(X , axis = 0)
stdImg = np.std(X , axis = 0)
X_norm = (X - meanImg)  / (stdImg + 0.0001)


# we will split again without normalizing, the DataGenerator will normalize
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_norm, y,test_size=0.2)
train_datagen = ImageDataGenerator(
    featurewise_center=True,
    featurewise_std_normalization=True,
    rotation_range=20,
    zoom_range = 0.2,
    height_shift_range=0.2,
    horizontal_flip=True)

test_datagen = ImageDataGenerator(featurewise_center=True,
                                 featurewise_std_normalization = True)

train_datagen.fit(X_train)
test_datagen.fit(X_test)
train_generator = train_datagen.flow(X_train,y_train,batch_size = 16 , save_to_dir='train',save_prefix='aug')
validation_generator = test_datagen.flow(X_test,y_test,batch_size =16 , save_to_dir='test' , save_prefix = 'aug')

这会产生不好的结果:

batch_size = 16
model.fit_generator(
        train_generator,
        steps_per_epoch=2000// batch_size,
        epochs=10,
        validation_data=validation_generator,
        validation_steps=400 // batch_size)
model.save_weights('first_try.h5')  # always save your weights after training or during training

这给出了很好的结果:

history = model.fit(X_train, y_train, batch_size=16,
          epochs=20, verbose=1, validation_split=0.2)

2 个答案:

答案 0 :(得分:1)

我首先会使用更简单的网络并尝试获得非平凡的结果。另外,尝试使用适合测试集的列车组的相同数据项。

另外:你真的在两种情况下都应用相同的预处理吗?我依稀记得featurewise_centerfeaturewise_std_normalization经常以错误的方式应用...只是禁用扩充(也是其他选项),看看会发生什么。然后你可以断定你的扩充是否错误。

另请参阅:Debugging neural networks

答案 1 :(得分:0)

尝试为转换过滤器添加更多转换层或增加内核。 您正在使用3个转换层和3x3过滤器,因此您的感知区域仅为7x7。

我还建议使用BatchNormalization:

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(256,256,1), activation='relu'))
BatchNormalization(axis=1)
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3), activation='relu'))
BatchNormalization(axis=1),
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
BatchNormalization(axis=1),
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64), activation='relu')
BatchNormalization(axis=1)
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))
相关问题