1 year ago
#355089
karl-gardner
Can Someone Validate my RESNET Machine Learning Code with TensorFlow?
I am a PhD student working on a machine learning project with binary classification and RESNET architecture in TensorFlow. I believe I have done everything correctly but I am looking for some validation that the code is correct as I have no one to check my work. I am working in Google Colab with two programs: 1 to split the dataset and 1 to run the model. The first code is splitdataset.ipynb and the second code is classifyimages.ipynb. I know their are easier and other ways to do this but this is how I implemented it. Some of the more important things to check over would be how I implemented the brightness augmentations and how I split the dataset but ideally a whole code validation would be nice.
Thanks,
Karl Gardner
splitdataset.ipynb
import cv2
import os
import shutil
import random
%cd /content/drive/MyDrive/static_CTC_classification
!rm -r data_set
!mkdir data_set
!mkdir data_set/training
!mkdir data_set/validation
!mkdir data_set/testing
!mkdir data_set/training/DU145
!mkdir data_set/training/PC3
!mkdir data_set/validation/DU145
!mkdir data_set/validation/PC3
!mkdir data_set/testing/DU145
!mkdir data_set/testing/PC3
du145 = []
pc3 = []
for image in os.listdir("full_ds/DU145"):
du145.append("full_ds/DU145/" + image)
for image in os.listdir("full_ds/PC3"):
pc3.append("full_ds/PC3/" + image)
images = du145 + pc3
random.shuffle(images)
num_images = len(images)
train_num = int(0.8 * num_images)
val_num = int(0.1 * num_images)
print("train_num: ",train_num)
print("val_num: ",val_num)
train = images[0:train_num]
val = images[train_num:train_num+val_num]
test = images[train_num+val_num:]
for image in train:
if(image[8] == "D"):
im = image[14:]
shutil.copyfile(image, "split_ds/training/DU145/"+im)
if(image[8] == "P"):
im = image[12:]
shutil.copyfile(image, "split_ds/training/PC3/"+im)
for image in val:
if(image[8] == "D"):
im = image[14:]
shutil.copyfile(image, "split_ds/validation/DU145/"+im)
if(image[8] == "P"):
im = image[12:]
shutil.copyfile(image, "split_ds/validation/PC3/"+im)
for image in test:
if(image[8] == "D"):
im = image[14:]
shutil.copyfile(image, "split_ds/testing/DU145/"+im)
if(image[8] == "P"):
im = image[12:]
shutil.copyfile(image, "split_ds/testing/PC3/"+im)
classifyimages.ipynb
import tensorflow as tf
from tensorflow.keras.callbacks import ModelCheckpoint
import tensorflow_datasets as tfds
import numpy as np
import matplotlib.pyplot as plt
image_size = (224,224)
batch_size = 32
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
"/content/drive/MyDrive/static_CTC_classification/split_ds/training",
seed=1337,
color_mode='rgb',
image_size=image_size,
batch_size=batch_size
)
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
"/content/drive/MyDrive/static_CTC_classification/split_ds/validation",
seed=1337,
color_mode='rgb',
image_size=image_size,
batch_size=batch_size
)
test_ds = tf.keras.preprocessing.image_dataset_from_directory(
"/content/drive/MyDrive/static_CTC_classification/split_ds/testing",
seed=1337,
color_mode='rgb',
image_size=image_size,
batch_size=batch_size
)
# from website: https://towardsdatascience.com/writing-a-custom-data-augmentation-layer-in-keras-2b53e048a98
class RandomColorDistortion(tf.keras.layers.Layer):
def __init__(self, contrast_range=[0.5, 1.5],
brightness_delta=[-0.2, 0.2], **kwargs):
super(RandomColorDistortion, self).__init__(**kwargs)
self.contrast_range = contrast_range
self.brightness_delta = brightness_delta
def call(self, images, training=None):
if not training:
return images
contrast = np.random.uniform(
self.contrast_range[0], self.contrast_range[1])
brightness = np.random.uniform(
self.brightness_delta[0], self.brightness_delta[1])
images = tf.image.adjust_contrast(images, contrast)
images = tf.image.adjust_brightness(images, brightness)
images = tf.clip_by_value(images, 0, 1)
return images
augment_and_normalize = tf.keras.Sequential([
RandomColorDistortion(contrast_range=[0.5,1.5], brightness_delta=[-0.15, 0.15]),
tf.keras.layers.RandomFlip("horizontal"),
tf.keras.layers.RandomRotation(0.1),
tf.keras.layers.experimental.preprocessing.Rescaling(1.0 / 255)
], name="augment_and_normalize")
def make_model(input_shape, num_classes):
input = tf.keras.Input(shape=input_shape)
# Entry block
x = augment_and_normalize(input)
feature_extractor = tf.keras.applications.resnet.ResNet50(input_shape=(224, 224, 3),
include_top=False,
weights='imagenet')(x)
x = tf.keras.layers.GlobalAveragePooling2D()(feature_extractor)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dense(1024, activation="relu")(x)
x = tf.keras.layers.Dropout(0.5)(x)
x = tf.keras.layers.Dense(512, activation="relu")(x)
x = tf.keras.layers.Dropout(0.5)(x)
output = tf.keras.layers.Dense(1, activation="sigmoid", name="classification")(x)
return tf.keras.Model(input, output)
model = make_model(input_shape=image_size + (3,), num_classes=2)
tf.keras.utils.plot_model(model)
epochs = 250
model.compile(
optimizer=tf.keras.optimizers.Adam(),
loss="binary_crossentropy",
metrics=["accuracy"],
)
history = model.fit(x=train_ds, epochs=epochs, validation_data=val_ds,
callbacks = [ModelCheckpoint(filepath="weights.{epoch:02d}.ckpt", monitor='val_accuracy',
verbose=0, save_best_only=True,save_weights_only=True, mode='auto', save_freq='epoch',options=None)])
!cp /content/weights.05.ckpt.data-00000-of-00001 /content/drive/MyDrive/static_CTC_classification/
!cp /content/weights.05.ckpt.index /content/drive/MyDrive/static_CTC_classification/
# Then after saving these weights to my google drive I can load them later with the following command
model.load_weights("/content/drive/MyDrive/static_CTC_classification/weights.05.ckpt")
python
tensorflow
computer-vision
resnet
0 Answers
Your Answer