Initial commit

This commit is contained in:
Heiko J Schick
2020-10-08 15:32:42 +02:00
parent 08c30724b5
commit a09b362a89
4 changed files with 274 additions and 0 deletions
+42
View File
@@ -0,0 +1,42 @@
.PHONY: help
VENV_NAME?=env
PYTHON=${VENV_NAME}/bin/python3
.DEFAULT: help
help:
@echo "make env"
@echo " create and prepares the environment"
@echo "make clean"
@echo " clean the development environment"
@echo "make data"
@echo " download and unpack the data"
@echo "make lint"
@echo " run pylint and mpy"
data: images
images:
wget https://s3.us-east-2.amazonaws.com/naturalimages02/images.tar.gz
tar -xzf images.tar.gz
env: $(VENV_NAME)/bin/activate images
$(VENV_NAME)/bin/activate:
test -d $(VENV_NAME) || python3 -m venv $(VENV_NAME)
${PYTHON} -m pip install -U pip
${PYTHON} -m pip install --upgrade tensorflow
${PYTHON} -m pip install keras
${PYTHON} -m pip install matplotlib
${PYTHON} -m pip install keras_vggface
${PYTHON} -m pip install pylint
${PYTHON} -m pip install mypy
touch $(VENV_NAME)/bin/activate
lint:
${PYTHON} -m pylint --ignored-modules=tensorflow.keras linear_regression.py
clean:
rm -rf $(VENV_NAME)
rm -rf images
rm -f images.tar.gz
rm -f fine_tune.h5
rm -rf .mypy_cache
+36
View File
@@ -0,0 +1,36 @@
"""
Simple linear regression application.
Source: https://www.guru99.com/keras-tutorial.html
"""
# import tensorflow.keras
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
import matplotlib.pyplot as plt
x = data = np.linspace(1,2,200)
y = x*4 + np.random.randn(*x.shape) * 0.3
model = Sequential()
model.add(Dense(1, input_dim=1, activation='linear'))
model.compile(optimizer='sgd', loss='mse', metrics=['mse'])
weights = model.layers[0].get_weights()
w_init = weights[0][0][0]
b_init = weights[1][0]
print('Linear regression model is initialized with weights w: %.2f, b: %.2f' % (w_init, b_init))
model.fit(x,y, batch_size=1, epochs=30, shuffle=False)
weights = model.layers[0].get_weights()
w_final = weights[0][0][0]
b_final = weights[1][0]
print('Linear regression model is trained to have weight w: %.2f, b: %.2f' % (w_final, b_final))
predict = model.predict(data)
plt.plot(data, predict, 'b', data , y, 'k.')
plt.show()
+130
View File
@@ -0,0 +1,130 @@
# 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
train_path = 'images/train/'
test_path = 'images/test/'
batch_size = 16
image_size = 224
num_class = 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.
'''
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,
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()
fig=plt.figure()
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)
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.
'''
# Load the VGG model
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(image_size, image_size, 3))
print(base_model.summary())
# 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
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.
'''
#### Training
# Compile the model
from keras.optimizers import SGD
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)
# Save the model
model.save('catdog.h5')
'''
history = model.fit_generator(train_generator,
steps_per_epoch=train_generator.n/batch_size,
epochs=10)
model.save('fine_tune.h5')
# summarize history for accuracy
import matplotlib.pyplot as plt
plt.plot(history.history['loss'])
plt.title('loss')
plt.ylabel('loss')
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
'''
+66
View File
@@ -0,0 +1,66 @@
import keras
from keras.models import Model, load_model
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
import numpy as np
train_datagen = ImageDataGenerator(validation_split=0.3,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
train_path = 'images/train/'
test_path = 'images/test/'
batch_size = 16
image_size = 224
num_class = 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,
class_mode='categorical',
color_mode='rgb',
shuffle=True)
test_generator = test_datagen.flow_from_directory(
directory=test_path,
target_size=(image_size, image_size),
color_mode='rgb',
shuffle=False,
class_mode='categorical',
batch_size=1)
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()
name = model.predict(x_batch)
name = np.argmax(name, axis=-1)
true_name = y_batch
true_name = np.argmax(true_name, axis=-1)
label_map = (test_generator.class_indices)
label_map = dict((v,k) for k,v in label_map.items()) #flip k,v
predictions = [label_map[k] for k in name]
true_value = [label_map[k] for k in true_name]
image = x_batch[0].astype(np.int)
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!
'''