from keras.layers import Input, Lambda, Dense, Flatten
from keras.models import Model
from keras.applications.vgg16 import VGG16
from keras.applications.vgg16 import preprocess_input
from keras.preprocessing import image
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
import numpy as np
from glob import glob
import matplotlib.pyplot as plt
IMAGE_SIZE = [224, 224]
train_path = 'chest_xray/train'
valid_path = 'chest_xray/test'
vgg = VGG16(input_shape=IMAGE_SIZE + [3], weights='imagenet', include_top=False)
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5 58892288/58889256 [==============================] - 9s 0us/step
for layer in vgg.layers:
layer.trainable = False
folders = glob('chest_xray/train/*')
x = Flatten()(vgg.output)
prediction = Dense(len(folders), activation='softmax')(x)
model = Model(inputs=vgg.input, outputs=prediction)
model.summary()
Model: "model_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) [(None, 224, 224, 3)] 0 _________________________________________________________________ block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten_1 (Flatten) (None, 25088) 0 _________________________________________________________________ dense_1 (Dense) (None, 2) 50178 ================================================================= Total params: 14,764,866 Trainable params: 50,178 Non-trainable params: 14,714,688 _________________________________________________________________
model.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
train= train_datagen.flow_from_directory('chest_xray/train',
target_size = (224, 224),
batch_size = 32,
class_mode = 'categorical')
Found 5216 images belonging to 2 classes.
test = test_datagen.flow_from_directory('chest_xray/test',
target_size = (224, 224),
batch_size = 32,
class_mode = 'categorical')
Found 624 images belonging to 2 classes.
r = model.fit_generator(
train,
validation_data=test,
epochs=5,
steps_per_epoch=len(training_set),
validation_steps=len(test_set)
)
Epoch 1/5 163/163 [==============================] - 1738s 11s/step - loss: 0.1352 - accuracy: 0.9515 - val_loss: 0.3047 - val_accuracy: 0.9071 Epoch 2/5 163/163 [==============================] - 1584s 10s/step - loss: 0.1006 - accuracy: 0.9609 - val_loss: 0.3198 - val_accuracy: 0.9054 Epoch 3/5 163/163 [==============================] - 1684s 10s/step - loss: 0.0982 - accuracy: 0.9613 - val_loss: 0.2883 - val_accuracy: 0.9135 Epoch 4/5 163/163 [==============================] - 1811s 11s/step - loss: 0.0753 - accuracy: 0.9724 - val_loss: 0.3813 - val_accuracy: 0.8990 Epoch 5/5 163/163 [==============================] - 1855s 11s/step - loss: 0.0771 - accuracy: 0.9714 - val_loss: 0.3549 - val_accuracy: 0.8990
plt.plot(r.history['loss'], label='train loss')
plt.plot(r.history['val_loss'], label='val loss')
plt.legend()
plt.show()
plt.savefig('LossVal_loss')
<Figure size 432x288 with 0 Axes>
import tensorflow as tf
from keras.models import load_model
model.save('pneumonia_model.h5')
from keras.models import load_model
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
import numpy as np
model=load_model('pneumonia_model.h5')
img=image.load_img('./chest_xray/train/PNEUMONIA/person2_bacteria_4.jpeg',target_size=(224,224))
x=image.img_to_array(img)
x=np.expand_dims(x,axis=0)
img_data=preprocess_input(x)
classes=model.predict(img_data)
int(classes[0][1])
1