From d081002d5e85ae7984d2250d69acf082f786cdea Mon Sep 17 00:00:00 2001 From: Heiko J Schick Date: Thu, 8 Oct 2020 16:43:50 +0200 Subject: [PATCH] Minor modification to remove pylint messages --- linear_regression.py | 3 +- prepare_train_model.py | 130 ++++++++++++++++++++--------------------- test_model.py | 54 +++++++++-------- 3 files changed, 94 insertions(+), 93 deletions(-) diff --git a/linear_regression.py b/linear_regression.py index 17aded6..1d4b979 100644 --- a/linear_regression.py +++ b/linear_regression.py @@ -1,5 +1,6 @@ """ -Simple linear regression application. +Simple example on how to fine tune models in Keras and how to use them. +Part 2 Source: https://www.guru99.com/keras-tutorial.html """ diff --git a/prepare_train_model.py b/prepare_train_model.py index 64f9154..ddd8bef 100644 --- a/prepare_train_model.py +++ b/prepare_train_model.py @@ -1,121 +1,116 @@ -# Source: https://www.guru99.com/keras-tutorial.html +""" +Simple example on how to fine tune models in Keras and how to use them. +Part 1 + +Source: https://www.guru99.com/keras-tutorial.html +""" #### Data preparation from keras.preprocessing.image import ImageDataGenerator import numpy as np import matplotlib.pyplot as plt +import keras +from keras.layers import Flatten, Dense +from keras.applications.vgg16 import VGG16 -train_path = 'images/train/' -test_path = 'images/test/' -batch_size = 16 -image_size = 224 -num_class = 8 +TRAIN_PATH = 'images/train/' +TEST_PATH = 'images/test/' +BATCH_SIZE = 16 +IMAGE_SIZE = 224 +NUM_CLASSES = 8 + +# The ImageDataGenerator will make an X_training data from a directory. +# The sub-directory in that directory will be used as a class for each object. +# The image will be loaded with the RGB color mode, with the categorical class +# mode for the Y_training data, with a batch size of 16. Finally, shuffle the +# data. -''' -The ImageDataGenerator will make an X_training data from a directory. -The sub-directory in that directory will be used as a class for each object. -The image will be loaded with the RGB color mode, with the categorical class -mode for the Y_training data, with a batch size of 16. Finally, shuffle the -data. -''' train_datagen = ImageDataGenerator(validation_split=0.3, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) train_generator = train_datagen.flow_from_directory( - directory=train_path, - target_size=(image_size,image_size), - batch_size=batch_size, + directory=TRAIN_PATH, + target_size=(IMAGE_SIZE,IMAGE_SIZE), + batch_size=BATCH_SIZE, class_mode='categorical', color_mode='rgb', shuffle=True) -''' -Let's see our images randomly by plotting them with matplotlib -''' -x_batch, y_batch = train_generator.next() + +# Let's see our images randomly by plotting them with matplotlib +# x_batch, y_batch = train_generator.next() +x_batch, y_batch = next(train_generator) fig=plt.figure() -columns = 4 -rows = 4 -for i in range(1, columns*rows): - num = np.random.randint(batch_size) + +COLUMNS = 4 +ROWS = 4 + +for i in range(1, COLUMNS*ROWS): + num = np.random.randint(BATCH_SIZE) image = x_batch[num].astype(np.int) - fig.add_subplot(rows, columns, i) + fig.add_subplot(ROWS, COLUMNS, i) plt.imshow(image) plt.show() ### Creating model -import keras -from keras.models import Model, load_model -from keras.layers import Activation, Dropout, Flatten, Dense -from keras.preprocessing.image import ImageDataGenerator -from keras.applications.vgg16 import VGG16 - -''' -Let's create our network model from VGG16 with imageNet pre-trained weight. -We will freeze these layers so that the layers are not trainable to help us -reduce the computation time. -''' +# Let's create our network model from VGG16 with imageNet pre-trained weight. +# We will freeze these layers so that the layers are not trainable to help us +# reduce the computation time. # Load the VGG model -base_model = VGG16(weights='imagenet', include_top=False, input_shape=(image_size, image_size, 3)) +base_model = VGG16(weights='imagenet', include_top=False, input_shape=(IMAGE_SIZE, IMAGE_SIZE, 3)) print(base_model.summary()) -# Freeze the layers +# Freeze the layers for layer in base_model.layers: layer.trainable = False - + # Create the model model = keras.models.Sequential() # Add the vgg convolutional base model model.add(base_model) - + # Add new layers model.add(Flatten()) model.add(Dense(1024, activation='relu')) model.add(Dense(1024, activation='relu')) -model.add(Dense(num_class, activation='softmax')) - -# Show a summary of the model. Check the number of trainable parameters +model.add(Dense(NUM_CLASSES, activation='softmax')) + +# Show a summary of the model. Check the number of trainable parameters print(model.summary()) input("Press Enter to continue...") -''' -As you can see, the summary of our network model. From an input from -VGG16 Layers, then we add 2 Fully Connected Layer which will extract 1024 -features and an output layer that will compute the 8 classes with the softmax -activation. -''' +# As you can see, the summary of our network model. From an input from +# VGG16 Layers, then we add 2 Fully Connected Layer which will extract 1024 +# features and an output layer that will compute the 8 classes with the softmax +# activation. -#### Training +#### Training # Compile the model -from keras.optimizers import SGD +# from keras.optimizers import SGD -model.compile(loss='categorical_crossentropy', - optimizer=SGD(lr=1e-3), - metrics=['accuracy']) +# model.compile(loss='categorical_crossentropy', +# optimizer=SGD(lr=1e-3), +# metrics=['accuracy']) -''' # Start the training process -model.fit(x_train, y_train, validation_split=0.30, batch_size=32, epochs=50, verbose=2) +# model.fit(x_train, y_train, validation_split=0.30, batch_size=32, epochs=50, verbose=2) # Save the model -model.save('catdog.h5') -''' +# model.save('catdog.h5') history = model.fit_generator(train_generator, - steps_per_epoch=train_generator.n/batch_size, + steps_per_epoch=train_generator.n/BATCH_SIZE, epochs=10) - + model.save('fine_tune.h5') -# summarize history for accuracy -import matplotlib.pyplot as plt - +# Summarize history for accuracy plt.plot(history.history['loss']) plt.title('loss') plt.ylabel('loss') @@ -123,8 +118,7 @@ plt.xlabel('epoch') plt.legend(['loss'], loc='upper left') plt.show() -''' -As you can see, our losses are dropped significantly and the accuracy is -almost 100%. For testing our model, we randomly picked images over the internet -and put it on the test folder with a different class to test -''' \ No newline at end of file + +# Our losses are dropped significantly and the accuracy is almost 100%. For +# testing our model, we randomly picked images over the internet and put it on +# the test folder with a different class to test diff --git a/test_model.py b/test_model.py index 910aa3d..efe4892 100644 --- a/test_model.py +++ b/test_model.py @@ -1,5 +1,11 @@ -import keras -from keras.models import Model, load_model +""" +Simple example on how to fine tune models in Keras and how to use them. +Part 1 + +Source: https://www.guru99.com/keras-tutorial.html +""" + +from keras.models import load_model from keras.preprocessing.image import ImageDataGenerator import matplotlib.pyplot as plt import numpy as np @@ -9,40 +15,45 @@ train_datagen = ImageDataGenerator(validation_split=0.3, zoom_range=0.2, horizontal_flip=True) -train_path = 'images/train/' -test_path = 'images/test/' -batch_size = 16 -image_size = 224 -num_class = 8 +TRAIN_PATH = 'images/train/' +TEST_PATH = 'images/test/' +BATCH_SIZE = 16 +IMAGE_SIZE = 224 +NUM_CLASSES = 8 ### Testing our model model = load_model('fine_tune.h5') test_datagen = ImageDataGenerator() train_generator = train_datagen.flow_from_directory( - directory=train_path, - target_size=(image_size,image_size), - batch_size=batch_size, + directory=TRAIN_PATH, + target_size=(IMAGE_SIZE, IMAGE_SIZE), + batch_size=BATCH_SIZE, class_mode='categorical', color_mode='rgb', shuffle=True) test_generator = test_datagen.flow_from_directory( - directory=test_path, - target_size=(image_size, image_size), + directory=TEST_PATH, + target_size=(IMAGE_SIZE, IMAGE_SIZE), color_mode='rgb', shuffle=False, class_mode='categorical', batch_size=1) -filenames = test_generator.filenames +filenames = test_generator.filenames nb_samples = len(filenames) -fig=plt.figure() -columns = 4 -rows = 4 -for i in range(1, columns*rows -1): - x_batch, y_batch = test_generator.next() +fig = plt.figure() + +COLUMNS = 4 +ROWS = 4 + +# And our test is as given below! Only 1 image is predicted wrong from a test of +# 14 images! + +for i in range(1, COLUMNS*ROWS -1): + x_batch, y_batch = next(test_generator) name = model.predict(x_batch) name = np.argmax(name, axis=-1) @@ -55,12 +66,7 @@ for i in range(1, columns*rows -1): true_value = [label_map[k] for k in true_name] image = x_batch[0].astype(np.int) - fig.add_subplot(rows, columns, i) + fig.add_subplot(ROWS, COLUMNS, i) plt.title(str(predictions[0]) + ':' + str(true_value[0])) plt.imshow(image) plt.show() - -''' -And our test is as given below! Only 1 image is predicted wrong from a test of -14 images! -''' \ No newline at end of file