Created
July 12, 2020 11:21
-
-
Save SphericalKat/ea86858cf9699321f6fe155cb9bcf0ac to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ====================================================================== | |
# There are 5 questions in this exam with increasing difficulty from 1-5. | |
# Please note that the weight of the grade for the question is relative | |
# to its difficulty. So your Category 1 question will score significantly | |
# less than your Category 5 question. | |
# | |
# Don't use lambda layers in your model. | |
# You do not need them to solve the question. | |
# Lambda layers are not supported by the grading infrastructure. | |
# | |
# You must use the Submit and Test button to submit your model | |
# at least once in this category before you finally submit your exam, | |
# otherwise you will score zero for this category. | |
# ====================================================================== | |
# | |
# Computer vision with CNNs | |
# | |
# Create and train a classifier for horses or humans using the provided data. | |
# Make sure your final layer is a 1 neuron, activated by sigmoid as shown. | |
# | |
# The test will use images that are 300x300 with 3 bytes color depth so be sure to | |
# design your neural network accordingly | |
import urllib | |
import tensorflow as tf | |
from tensorflow.keras.applications.inception_v3 import InceptionV3 | |
from tensorflow.keras.callbacks import ModelCheckpoint | |
from tensorflow.keras.layers import Dense, Flatten, Dropout | |
from tensorflow.keras.models import Model | |
from tensorflow.keras.preprocessing.image import ImageDataGenerator | |
physical_devices = tf.config.list_physical_devices('GPU') | |
try: | |
tf.config.experimental.set_memory_growth(physical_devices[0], True) | |
except: | |
pass | |
local_weights_file = './inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5' | |
pre_trained_model = InceptionV3(input_shape=(300, 300, 3), | |
include_top=False, | |
weights=None) | |
pre_trained_model.load_weights(local_weights_file) | |
for layer in pre_trained_model.layers: | |
layer.trainable = False | |
last_layer = pre_trained_model.get_layer('mixed7') | |
print('last layer output shape: ', last_layer.output_shape) | |
last_output = last_layer.output | |
def solution_model(): | |
_TRAIN_URL = "https://storage.googleapis.com/download.tensorflow.org/data/horse-or-human.zip" | |
_TEST_URL = "https://storage.googleapis.com/download.tensorflow.org/data/validation-horse-or-human.zip" | |
urllib.request.urlretrieve(_TRAIN_URL, 'horse-or-human.zip') | |
local_zip = 'horse-or-human.zip' | |
zip_ref = zipfile.ZipFile(local_zip, 'r') | |
zip_ref.extractall('./tmp/horse-or-human/') | |
zip_ref.close() | |
urllib.request.urlretrieve(_TEST_URL, 'validation-horse-or-human.zip') | |
local_zip = 'validation-horse-or-human.zip' | |
zip_ref = zipfile.ZipFile(local_zip, 'r') | |
zip_ref.extractall('./tmp/validation-horse-or-human/') | |
zip_ref.close() | |
train_datagen = ImageDataGenerator( | |
rescale=1. / 255, | |
rotation_range=40, | |
width_shift_range=0.2, | |
height_shift_range=0.2, | |
shear_range=0.2, | |
zoom_range=0.2, | |
horizontal_flip=True, | |
fill_mode='nearest') | |
validation_datagen = ImageDataGenerator(rescale=1 / 255) | |
train_generator = train_datagen.flow_from_directory( | |
'./tmp/horse-or-human/', # This is the source directory for training images | |
target_size=(300, 300), # All images will be resized to 150x150 | |
batch_size=1, | |
# Since we use binary_crossentropy loss, we need binary labels | |
class_mode='binary') | |
validation_generator = validation_datagen.flow_from_directory( | |
'./tmp/validation-horse-or-human/', # This is the source directory for training images | |
target_size=(300, 300), # All images will be resized to 150x150 | |
batch_size=1, | |
# Since we use binary_crossentropy loss, we need binary labels | |
class_mode='binary') | |
x = Flatten()(last_output) | |
x = Dense(1024, activation='relu')(x) | |
x = Dropout(0.2)(x) | |
x = Dense(1, activation='sigmoid')(x) | |
model = Model(pre_trained_model.input, x) | |
model.compile(loss='binary_crossentropy', | |
optimizer='adam', | |
metrics=['accuracy']) | |
model.fit( | |
train_generator, | |
steps_per_epoch=8, | |
epochs=100, | |
verbose=1, | |
validation_data=validation_generator, | |
validation_steps=8, | |
callbacks=[ | |
ModelCheckpoint( | |
filepath='mymodel.h5', | |
monitor='val_accuracy', | |
mode='max', | |
save_best_only=True, | |
save_weights_only=False, | |
verbose=1 | |
) | |
] | |
) | |
return model | |
# NOTE: If training is taking a very long time, you should consider setting the batch size | |
# appropriately on the generator, and the steps per epoch in the model.fit() function. | |
# Note that you'll need to save your model as a .h5 like this. | |
# When you press the Submit and Test button, your saved .h5 model will | |
# be sent to the testing infrastructure for scoring | |
# and the score will be returned to you. | |
if __name__ == '__main__': | |
model = solution_model() | |
model.save("mymodel.bak.h5") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment