使用CNN训练Kaggle的chest_xray项目

引用自kaggle的代码 ,感谢Korra
传送门

一、以下代码我改动了一些参数得到如下结论(如果这个模型没有过拟合…):
1、 适当增加batch size大小可以提高训练精度,控制epoc为4,原作者使用了16的batch size训练得到了97.8的精度,使用128大小的batch size达到了99.06的精度,但是如果过度增加batch size,把batch size增加到256,训练精度有大概2%~3%的下降,也许通过增加epoc可以弥补,但我还没试过。
2、如果去掉batchNormalization层,在batch size大小为128,epoc为4的情况下精度下降到74.31%。
3、val acc在任何参数下都不理想,最高是80%多,与acc99%的高度相差较大,很可能是因为验证数据集只有16个数据的原因,数据量太少,不止此作者的模型如此,其他模型都存在这个问题。是不是过拟合呢?我想可以适量减少训练数据,并将减少那部分训练数据转换为验证数据中去,200个应该足够了。没准是过拟合了呢….
4、作者把原图像大概2090*1850大小的图像缩放至64*64,依然能准确识别,我自己讲图像大小调整至128*128,准确率没有明显提升。
5、我自己本来想用vgg16训练一个,但是精度一直上不去,90%左右,参考了我的上一篇[博客],还是解决不了…(https://blog.csdn.net/wangdongwei0/article/details/81256423)
6、这个网络使用4层卷积,2层全连接就实现了很好的效果,收敛速度非常快,vgg16那种复杂网络也是多余了…

import keras
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Conv2D,MaxPool2D,Dense,Dropout,Softmax,Input,Flatten
from keras.optimizers import Adam,RMSprop,SGD
from keras.layers.merge import add
from keras.layers import Dense, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D, BatchNormalization
from keras.layers import BatchNormalization
import os

# from sklearn.metrics import roc_auc_score,roc_curve,accuracy_score,recall_score
from keras.metrics import categorical_accuracy
# %matplotlib inline
from keras.preprocessing.image import ImageDataGenerator

from tensorflow import set_random_seed
os.environ['PYTHONHASHSEED'] = "0"
np.random.seed(1)
set_random_seed(2)


model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(3,3), activation="relu", padding="same",
                 input_shape=(128,128,1)))
model.add(Conv2D(filters=32, kernel_size=(3,3), activation="relu", padding="same"))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(rate=0.25))
model.add(Conv2D(filters=64, kernel_size=(3,3), activation="relu", padding="same"))
model.add(Conv2D(filters=64, kernel_size=(3,3), activation="relu", padding="same"))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(rate=0.25))
model.add(Flatten())
model.add(Dense(1024,activation="relu"))
model.add(BatchNormalization())
model.add(Dropout(rate=0.4))
model.add(Dense(2, activation="softmax"))

model.compile(Adam(lr=0.001),loss="categorical_crossentropy", metrics=["accuracy"])

gen = ImageDataGenerator()
train_batches = gen.flow_from_directory("/home/wdw/DL/chest_xray/train",model.input_shape[1:3],color_mode="grayscale",shuffle=True,seed=1,
                                        batch_size=128)
valid_batches = gen.flow_from_directory("/home/wdw/DL/chest_xray/val", model.input_shape[1:3],color_mode="grayscale", shuffle=True,seed=1,
                                        batch_size=16)
test_batches = gen.flow_from_directory("/home/wdw/DL/chest_xray/test", model.input_shape[1:3], shuffle=False,
                                       color_mode="grayscale", batch_size=8)


model.compile(Adam(lr=0.0001),loss="categorical_crossentropy", metrics=["accuracy"])
model.fit_generator(train_batches,validation_data=valid_batches,epochs=4)
p = model.predict_generator(test_batches, verbose=True)
pre = pd.DataFrame(p)
pre["filename"] = test_batches.filenames
pre["label"] = (pre["filename"].str.contains("PNEUMONIA")).apply(int)
pre['pre'] = (pre[1]>0.5).apply(int)

猜你喜欢

转载自blog.csdn.net/wangdongwei0/article/details/81256406
今日推荐