ebay-ml-lister/Shoe Classifier_Xception.ipynb

839 lines
56 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "572dc7fb",
"metadata": {},
"outputs": [],
"source": [
"from matplotlib import pyplot as plt\n",
"from matplotlib.image import imread\n",
"import pandas as pd\n",
"from collections import Counter\n",
"import json\n",
"import os\n",
"import re\n",
"import tempfile\n",
"import numpy as np\n",
"from os.path import exists\n",
"from imblearn.under_sampling import RandomUnderSampler\n",
"from PIL import ImageFile\n",
"import sklearn as sk\n",
"from sklearn.model_selection import train_test_split, StratifiedShuffleSplit\n",
"import tensorflow as tf\n",
"import tensorflow.keras\n",
"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
"from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Dropout, Flatten, Activation\n",
"from tensorflow.keras.models import Sequential\n",
"from tensorflow.keras.optimizers import Adam\n",
"# custom modules\n",
"import image_faults\n",
"\n",
"ImageFile.LOAD_TRUNCATED_IMAGES = True"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "a5c72863",
"metadata": {},
"outputs": [],
"source": [
"#image_faults.faulty_images() # removes faulty images\n",
"df = pd.read_csv('expanded_class.csv', index_col=[0], low_memory=False)\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def dict_pics_jup():\n",
" '''\n",
" {source:target} dict used to replace source urls with image location as input\n",
" '''\n",
" target_dir = os.getcwd() + os.sep + \"training_images\"\n",
" with open('temp_pics_source_list.txt') as f:\n",
" temp_pics_source_list = json.load(f)\n",
" \n",
" dict_pics = {}\n",
" for k in temp_pics_source_list:\n",
" try:\n",
" \n",
" patt_1 = re.search(r'[^/]+(?=/\\$_|.(\\.jpg|\\.jpeg|\\.png))', k, re.IGNORECASE)\n",
" patt_2 = re.search(r'(\\.jpg|\\.jpeg|\\.png)', k, re.IGNORECASE)\n",
" if patt_1 and patt_2 is not None:\n",
" tag = patt_1.group() + patt_2.group().lower()\n",
" file_name = target_dir + os.sep + tag\n",
" dict_pics.update({k:file_name})\n",
" except TypeError:\n",
" print(k)\n",
" print(\"{source:target} dictionary created @ \" + target_dir)\n",
" return dict_pics\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "1057a442",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"nan\n",
"{source:target} dictionary created @ /tf/training_images\n"
]
}
],
"source": [
"dict_pics = dict_pics_jup()\n",
"\n",
"with open('women_cat_list.txt') as f:\n",
" women_cats = json.load(f)\n",
"with open('men_cat_list.txt') as f:\n",
" men_cats = json.load(f)\n",
" \n",
"with open('temp_pics_source_list.txt') as f:\n",
" tempics = json.load(f)\n",
"# list of image urls that did not get named properly which will be removed from the dataframe\n",
"drop_row_vals = []\n",
"for pic in tempics:\n",
" try:\n",
" dict_pics[pic]\n",
" except KeyError:\n",
" drop_row_vals.append(pic)\n",
"\n",
"df['PrimaryCategoryID'] = df['PrimaryCategoryID'].astype(str) # pandas thinks ids are ints\n",
"ddf = df[df.PictureURL.isin(drop_row_vals)==False] # remove improperly named image files\n",
"df = ddf[ddf.PrimaryCategoryID.isin(men_cats)==False] # removes rows of womens categories\n",
"\n",
"blah = pd.Series(df.PictureURL)\n",
"df = df.drop(labels=['PictureURL'], axis=1)\n",
"\n",
"blah = blah.apply(lambda x: dict_pics[x])\n",
"df = pd.concat([blah, df],axis=1)\n",
"df = df.groupby('PrimaryCategoryID').filter(lambda x: len(x)>25) # removes cat outliers"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "7a6146e6",
"metadata": {},
"outputs": [],
"source": [
"df=df.sample(frac=1)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "114cc3c0",
"metadata": {},
"outputs": [],
"source": [
"undersample = RandomUnderSampler(sampling_strategy='auto')\n",
"train, y_under = undersample.fit_resample(df, df['PrimaryCategoryID'])\n",
"#print(Counter(train['PrimaryCategoryID']))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "506aa5cf",
"metadata": {},
"outputs": [],
"source": [
"train, test = train_test_split(train, test_size=0.1, random_state=42)\n",
"# stratify=train['PrimaryCategoryID']\n",
"# train['PrimaryCategoryID'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "4d72eb90",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Found 17660 validated image filenames belonging to 7 classes.\n",
"Found 4414 validated image filenames belonging to 7 classes.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.8/dist-packages/keras_preprocessing/image/dataframe_iterator.py:279: UserWarning: Found 1 invalid image filename(s) in x_col=\"PictureURL\". These filename(s) will be ignored.\n",
" warnings.warn(\n"
]
}
],
"source": [
"datagen = ImageDataGenerator(rescale=1./255., \n",
" validation_split=.2,\n",
" #samplewise_std_normalization=True,\n",
" #horizontal_flip= True,\n",
" #vertical_flip= True,\n",
" #width_shift_range= 0.2,\n",
" #height_shift_range= 0.2,\n",
" #rotation_range= 90,\n",
" preprocessing_function=tf.keras.applications.xception.preprocess_input)\n",
"\n",
"train_generator=datagen.flow_from_dataframe(\n",
" dataframe=train[:len(train)],\n",
" directory='./training_images',\n",
" x_col='PictureURL',\n",
" y_col='PrimaryCategoryID',\n",
" batch_size=64,\n",
" seed=42,\n",
" shuffle=True,\n",
" target_size=(299,299),\n",
" subset='training'\n",
" )\n",
"validation_generator=datagen.flow_from_dataframe(\n",
" dataframe=train[:len(train)], # is using train right?\n",
" directory='./training_images',\n",
" x_col='PictureURL',\n",
" y_col='PrimaryCategoryID',\n",
" batch_size=64,\n",
" seed=42,\n",
" shuffle=True,\n",
" target_size=(299,299),\n",
" subset='validation'\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "7b70f37f",
"metadata": {},
"outputs": [],
"source": [
"imgs, labels = next(train_generator)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "1ed54bf5",
"metadata": {},
"outputs": [],
"source": [
"def plotImages(images_arr):\n",
" fig, axes = plt.subplots(1, 10, figsize=(20,20))\n",
" axes = axes.flatten()\n",
" for img, ax in zip( images_arr, axes):\n",
" ax.imshow(img)\n",
" ax.axis('off')\n",
" plt.tight_layout()\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "85934565",
"metadata": {},
"outputs": [],
"source": [
"#plotImages(imgs)\n",
"#print(labels)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "6322bcad",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1\n"
]
}
],
"source": [
"physical_devices = tf.config.list_physical_devices('GPU')\n",
"print(len(physical_devices))\n",
"tf.config.experimental.set_memory_growth(physical_devices[0], True)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "07fd25c6",
"metadata": {},
"outputs": [],
"source": [
"# see https://www.kaggle.com/dmitrypukhov/cnn-with-imagedatagenerator-flow-from-dataframe for train/test/val split \n",
"# example\n",
"\n",
"# may need to either create a test dataset from the original dataset or just download a new one"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "b31af79e",
"metadata": {},
"outputs": [],
"source": [
"base_model = tf.keras.applications.xception.Xception(include_top=False, weights='imagenet', pooling='avg')\n",
"#base_model.summary()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "fe06f2bf",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: \"model\"\n",
"__________________________________________________________________________________________________\n",
" Layer (type) Output Shape Param # Connected to \n",
"==================================================================================================\n",
" input_1 (InputLayer) [(None, None, None, 0 [] \n",
" 3)] \n",
" \n",
" block1_conv1 (Conv2D) (None, None, None, 864 ['input_1[0][0]'] \n",
" 32) \n",
" \n",
" block1_conv1_bn (BatchNormaliz (None, None, None, 128 ['block1_conv1[0][0]'] \n",
" ation) 32) \n",
" \n",
" block1_conv1_act (Activation) (None, None, None, 0 ['block1_conv1_bn[0][0]'] \n",
" 32) \n",
" \n",
" block1_conv2 (Conv2D) (None, None, None, 18432 ['block1_conv1_act[0][0]'] \n",
" 64) \n",
" \n",
" block1_conv2_bn (BatchNormaliz (None, None, None, 256 ['block1_conv2[0][0]'] \n",
" ation) 64) \n",
" \n",
" block1_conv2_act (Activation) (None, None, None, 0 ['block1_conv2_bn[0][0]'] \n",
" 64) \n",
" \n",
" block2_sepconv1 (SeparableConv (None, None, None, 8768 ['block1_conv2_act[0][0]'] \n",
" 2D) 128) \n",
" \n",
" block2_sepconv1_bn (BatchNorma (None, None, None, 512 ['block2_sepconv1[0][0]'] \n",
" lization) 128) \n",
" \n",
" block2_sepconv2_act (Activatio (None, None, None, 0 ['block2_sepconv1_bn[0][0]'] \n",
" n) 128) \n",
" \n",
" block2_sepconv2 (SeparableConv (None, None, None, 17536 ['block2_sepconv2_act[0][0]'] \n",
" 2D) 128) \n",
" \n",
" block2_sepconv2_bn (BatchNorma (None, None, None, 512 ['block2_sepconv2[0][0]'] \n",
" lization) 128) \n",
" \n",
" conv2d (Conv2D) (None, None, None, 8192 ['block1_conv2_act[0][0]'] \n",
" 128) \n",
" \n",
" block2_pool (MaxPooling2D) (None, None, None, 0 ['block2_sepconv2_bn[0][0]'] \n",
" 128) \n",
" \n",
" batch_normalization (BatchNorm (None, None, None, 512 ['conv2d[0][0]'] \n",
" alization) 128) \n",
" \n",
" add (Add) (None, None, None, 0 ['block2_pool[0][0]', \n",
" 128) 'batch_normalization[0][0]'] \n",
" \n",
" block3_sepconv1_act (Activatio (None, None, None, 0 ['add[0][0]'] \n",
" n) 128) \n",
" \n",
" block3_sepconv1 (SeparableConv (None, None, None, 33920 ['block3_sepconv1_act[0][0]'] \n",
" 2D) 256) \n",
" \n",
" block3_sepconv1_bn (BatchNorma (None, None, None, 1024 ['block3_sepconv1[0][0]'] \n",
" lization) 256) \n",
" \n",
" block3_sepconv2_act (Activatio (None, None, None, 0 ['block3_sepconv1_bn[0][0]'] \n",
" n) 256) \n",
" \n",
" block3_sepconv2 (SeparableConv (None, None, None, 67840 ['block3_sepconv2_act[0][0]'] \n",
" 2D) 256) \n",
" \n",
" block3_sepconv2_bn (BatchNorma (None, None, None, 1024 ['block3_sepconv2[0][0]'] \n",
" lization) 256) \n",
" \n",
" conv2d_1 (Conv2D) (None, None, None, 32768 ['add[0][0]'] \n",
" 256) \n",
" \n",
" block3_pool (MaxPooling2D) (None, None, None, 0 ['block3_sepconv2_bn[0][0]'] \n",
" 256) \n",
" \n",
" batch_normalization_1 (BatchNo (None, None, None, 1024 ['conv2d_1[0][0]'] \n",
" rmalization) 256) \n",
" \n",
" add_1 (Add) (None, None, None, 0 ['block3_pool[0][0]', \n",
" 256) 'batch_normalization_1[0][0]'] \n",
" \n",
" block4_sepconv1_act (Activatio (None, None, None, 0 ['add_1[0][0]'] \n",
" n) 256) \n",
" \n",
" block4_sepconv1 (SeparableConv (None, None, None, 188672 ['block4_sepconv1_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block4_sepconv1_bn (BatchNorma (None, None, None, 2912 ['block4_sepconv1[0][0]'] \n",
" lization) 728) \n",
" \n",
" block4_sepconv2_act (Activatio (None, None, None, 0 ['block4_sepconv1_bn[0][0]'] \n",
" n) 728) \n",
" \n",
" block4_sepconv2 (SeparableConv (None, None, None, 536536 ['block4_sepconv2_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block4_sepconv2_bn (BatchNorma (None, None, None, 2912 ['block4_sepconv2[0][0]'] \n",
" lization) 728) \n",
" \n",
" conv2d_2 (Conv2D) (None, None, None, 186368 ['add_1[0][0]'] \n",
" 728) \n",
" \n",
" block4_pool (MaxPooling2D) (None, None, None, 0 ['block4_sepconv2_bn[0][0]'] \n",
" 728) \n",
" \n",
" batch_normalization_2 (BatchNo (None, None, None, 2912 ['conv2d_2[0][0]'] \n",
" rmalization) 728) \n",
" \n",
" add_2 (Add) (None, None, None, 0 ['block4_pool[0][0]', \n",
" 728) 'batch_normalization_2[0][0]'] \n",
" \n",
" block5_sepconv1_act (Activatio (None, None, None, 0 ['add_2[0][0]'] \n",
" n) 728) \n",
" \n",
" block5_sepconv1 (SeparableConv (None, None, None, 536536 ['block5_sepconv1_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block5_sepconv1_bn (BatchNorma (None, None, None, 2912 ['block5_sepconv1[0][0]'] \n",
" lization) 728) \n",
" \n",
" block5_sepconv2_act (Activatio (None, None, None, 0 ['block5_sepconv1_bn[0][0]'] \n",
" n) 728) \n",
" \n",
" block5_sepconv2 (SeparableConv (None, None, None, 536536 ['block5_sepconv2_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block5_sepconv2_bn (BatchNorma (None, None, None, 2912 ['block5_sepconv2[0][0]'] \n",
" lization) 728) \n",
" \n",
" block5_sepconv3_act (Activatio (None, None, None, 0 ['block5_sepconv2_bn[0][0]'] \n",
" n) 728) \n",
" \n",
" block5_sepconv3 (SeparableConv (None, None, None, 536536 ['block5_sepconv3_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block5_sepconv3_bn (BatchNorma (None, None, None, 2912 ['block5_sepconv3[0][0]'] \n",
" lization) 728) \n",
" \n",
" add_3 (Add) (None, None, None, 0 ['block5_sepconv3_bn[0][0]', \n",
" 728) 'add_2[0][0]'] \n",
" \n",
" block6_sepconv1_act (Activatio (None, None, None, 0 ['add_3[0][0]'] \n",
" n) 728) \n",
" \n",
" block6_sepconv1 (SeparableConv (None, None, None, 536536 ['block6_sepconv1_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block6_sepconv1_bn (BatchNorma (None, None, None, 2912 ['block6_sepconv1[0][0]'] \n",
" lization) 728) \n",
" \n",
" block6_sepconv2_act (Activatio (None, None, None, 0 ['block6_sepconv1_bn[0][0]'] \n",
" n) 728) \n",
" \n",
" block6_sepconv2 (SeparableConv (None, None, None, 536536 ['block6_sepconv2_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block6_sepconv2_bn (BatchNorma (None, None, None, 2912 ['block6_sepconv2[0][0]'] \n",
" lization) 728) \n",
" \n",
" block6_sepconv3_act (Activatio (None, None, None, 0 ['block6_sepconv2_bn[0][0]'] \n",
" n) 728) \n",
" \n",
" block6_sepconv3 (SeparableConv (None, None, None, 536536 ['block6_sepconv3_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block6_sepconv3_bn (BatchNorma (None, None, None, 2912 ['block6_sepconv3[0][0]'] \n",
" lization) 728) \n",
" \n",
" add_4 (Add) (None, None, None, 0 ['block6_sepconv3_bn[0][0]', \n",
" 728) 'add_3[0][0]'] \n",
" \n",
" block7_sepconv1_act (Activatio (None, None, None, 0 ['add_4[0][0]'] \n",
" n) 728) \n",
" \n",
" block7_sepconv1 (SeparableConv (None, None, None, 536536 ['block7_sepconv1_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block7_sepconv1_bn (BatchNorma (None, None, None, 2912 ['block7_sepconv1[0][0]'] \n",
" lization) 728) \n",
" \n",
" block7_sepconv2_act (Activatio (None, None, None, 0 ['block7_sepconv1_bn[0][0]'] \n",
" n) 728) \n",
" \n",
" block7_sepconv2 (SeparableConv (None, None, None, 536536 ['block7_sepconv2_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block7_sepconv2_bn (BatchNorma (None, None, None, 2912 ['block7_sepconv2[0][0]'] \n",
" lization) 728) \n",
" \n",
" block7_sepconv3_act (Activatio (None, None, None, 0 ['block7_sepconv2_bn[0][0]'] \n",
" n) 728) \n",
" \n",
" block7_sepconv3 (SeparableConv (None, None, None, 536536 ['block7_sepconv3_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block7_sepconv3_bn (BatchNorma (None, None, None, 2912 ['block7_sepconv3[0][0]'] \n",
" lization) 728) \n",
" \n",
" add_5 (Add) (None, None, None, 0 ['block7_sepconv3_bn[0][0]', \n",
" 728) 'add_4[0][0]'] \n",
" \n",
" block8_sepconv1_act (Activatio (None, None, None, 0 ['add_5[0][0]'] \n",
" n) 728) \n",
" \n",
" block8_sepconv1 (SeparableConv (None, None, None, 536536 ['block8_sepconv1_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block8_sepconv1_bn (BatchNorma (None, None, None, 2912 ['block8_sepconv1[0][0]'] \n",
" lization) 728) \n",
" \n",
" block8_sepconv2_act (Activatio (None, None, None, 0 ['block8_sepconv1_bn[0][0]'] \n",
" n) 728) \n",
" \n",
" block8_sepconv2 (SeparableConv (None, None, None, 536536 ['block8_sepconv2_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block8_sepconv2_bn (BatchNorma (None, None, None, 2912 ['block8_sepconv2[0][0]'] \n",
" lization) 728) \n",
" \n",
" block8_sepconv3_act (Activatio (None, None, None, 0 ['block8_sepconv2_bn[0][0]'] \n",
" n) 728) \n",
" \n",
" block8_sepconv3 (SeparableConv (None, None, None, 536536 ['block8_sepconv3_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block8_sepconv3_bn (BatchNorma (None, None, None, 2912 ['block8_sepconv3[0][0]'] \n",
" lization) 728) \n",
" \n",
" add_6 (Add) (None, None, None, 0 ['block8_sepconv3_bn[0][0]', \n",
" 728) 'add_5[0][0]'] \n",
" \n",
" block9_sepconv1_act (Activatio (None, None, None, 0 ['add_6[0][0]'] \n",
" n) 728) \n",
" \n",
" block9_sepconv1 (SeparableConv (None, None, None, 536536 ['block9_sepconv1_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block9_sepconv1_bn (BatchNorma (None, None, None, 2912 ['block9_sepconv1[0][0]'] \n",
" lization) 728) \n",
" \n",
" block9_sepconv2_act (Activatio (None, None, None, 0 ['block9_sepconv1_bn[0][0]'] \n",
" n) 728) \n",
" \n",
" block9_sepconv2 (SeparableConv (None, None, None, 536536 ['block9_sepconv2_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block9_sepconv2_bn (BatchNorma (None, None, None, 2912 ['block9_sepconv2[0][0]'] \n",
" lization) 728) \n",
" \n",
" block9_sepconv3_act (Activatio (None, None, None, 0 ['block9_sepconv2_bn[0][0]'] \n",
" n) 728) \n",
" \n",
" block9_sepconv3 (SeparableConv (None, None, None, 536536 ['block9_sepconv3_act[0][0]'] \n",
" 2D) 728) \n",
" \n",
" block9_sepconv3_bn (BatchNorma (None, None, None, 2912 ['block9_sepconv3[0][0]'] \n",
" lization) 728) \n",
" \n",
" add_7 (Add) (None, None, None, 0 ['block9_sepconv3_bn[0][0]', \n",
" 728) 'add_6[0][0]'] \n",
" \n",
" block10_sepconv1_act (Activati (None, None, None, 0 ['add_7[0][0]'] \n",
" on) 728) \n",
" \n",
" block10_sepconv1 (SeparableCon (None, None, None, 536536 ['block10_sepconv1_act[0][0]'] \n",
" v2D) 728) \n",
" \n",
" block10_sepconv1_bn (BatchNorm (None, None, None, 2912 ['block10_sepconv1[0][0]'] \n",
" alization) 728) \n",
" \n",
" block10_sepconv2_act (Activati (None, None, None, 0 ['block10_sepconv1_bn[0][0]'] \n",
" on) 728) \n",
" \n",
" block10_sepconv2 (SeparableCon (None, None, None, 536536 ['block10_sepconv2_act[0][0]'] \n",
" v2D) 728) \n",
" \n",
" block10_sepconv2_bn (BatchNorm (None, None, None, 2912 ['block10_sepconv2[0][0]'] \n",
" alization) 728) \n",
" \n",
" block10_sepconv3_act (Activati (None, None, None, 0 ['block10_sepconv2_bn[0][0]'] \n",
" on) 728) \n",
" \n",
" block10_sepconv3 (SeparableCon (None, None, None, 536536 ['block10_sepconv3_act[0][0]'] \n",
" v2D) 728) \n",
" \n",
" block10_sepconv3_bn (BatchNorm (None, None, None, 2912 ['block10_sepconv3[0][0]'] \n",
" alization) 728) \n",
" \n",
" add_8 (Add) (None, None, None, 0 ['block10_sepconv3_bn[0][0]', \n",
" 728) 'add_7[0][0]'] \n",
" \n",
" block11_sepconv1_act (Activati (None, None, None, 0 ['add_8[0][0]'] \n",
" on) 728) \n",
" \n",
" block11_sepconv1 (SeparableCon (None, None, None, 536536 ['block11_sepconv1_act[0][0]'] \n",
" v2D) 728) \n",
" \n",
" block11_sepconv1_bn (BatchNorm (None, None, None, 2912 ['block11_sepconv1[0][0]'] \n",
" alization) 728) \n",
" \n",
" block11_sepconv2_act (Activati (None, None, None, 0 ['block11_sepconv1_bn[0][0]'] \n",
" on) 728) \n",
" \n",
" block11_sepconv2 (SeparableCon (None, None, None, 536536 ['block11_sepconv2_act[0][0]'] \n",
" v2D) 728) \n",
" \n",
" block11_sepconv2_bn (BatchNorm (None, None, None, 2912 ['block11_sepconv2[0][0]'] \n",
" alization) 728) \n",
" \n",
" block11_sepconv3_act (Activati (None, None, None, 0 ['block11_sepconv2_bn[0][0]'] \n",
" on) 728) \n",
" \n",
" block11_sepconv3 (SeparableCon (None, None, None, 536536 ['block11_sepconv3_act[0][0]'] \n",
" v2D) 728) \n",
" \n",
" block11_sepconv3_bn (BatchNorm (None, None, None, 2912 ['block11_sepconv3[0][0]'] \n",
" alization) 728) \n",
" \n",
" add_9 (Add) (None, None, None, 0 ['block11_sepconv3_bn[0][0]', \n",
" 728) 'add_8[0][0]'] \n",
" \n",
" block12_sepconv1_act (Activati (None, None, None, 0 ['add_9[0][0]'] \n",
" on) 728) \n",
" \n",
" block12_sepconv1 (SeparableCon (None, None, None, 536536 ['block12_sepconv1_act[0][0]'] \n",
" v2D) 728) \n",
" \n",
" block12_sepconv1_bn (BatchNorm (None, None, None, 2912 ['block12_sepconv1[0][0]'] \n",
" alization) 728) \n",
" \n",
" block12_sepconv2_act (Activati (None, None, None, 0 ['block12_sepconv1_bn[0][0]'] \n",
" on) 728) \n",
" \n",
" block12_sepconv2 (SeparableCon (None, None, None, 536536 ['block12_sepconv2_act[0][0]'] \n",
" v2D) 728) \n",
" \n",
" block12_sepconv2_bn (BatchNorm (None, None, None, 2912 ['block12_sepconv2[0][0]'] \n",
" alization) 728) \n",
" \n",
" block12_sepconv3_act (Activati (None, None, None, 0 ['block12_sepconv2_bn[0][0]'] \n",
" on) 728) \n",
" \n",
" block12_sepconv3 (SeparableCon (None, None, None, 536536 ['block12_sepconv3_act[0][0]'] \n",
" v2D) 728) \n",
" \n",
" block12_sepconv3_bn (BatchNorm (None, None, None, 2912 ['block12_sepconv3[0][0]'] \n",
" alization) 728) \n",
" \n",
" add_10 (Add) (None, None, None, 0 ['block12_sepconv3_bn[0][0]', \n",
" 728) 'add_9[0][0]'] \n",
" \n",
" block13_sepconv1_act (Activati (None, None, None, 0 ['add_10[0][0]'] \n",
" on) 728) \n",
" \n",
" block13_sepconv1 (SeparableCon (None, None, None, 536536 ['block13_sepconv1_act[0][0]'] \n",
" v2D) 728) \n",
" \n",
" block13_sepconv1_bn (BatchNorm (None, None, None, 2912 ['block13_sepconv1[0][0]'] \n",
" alization) 728) \n",
" \n",
" block13_sepconv2_act (Activati (None, None, None, 0 ['block13_sepconv1_bn[0][0]'] \n",
" on) 728) \n",
" \n",
" block13_sepconv2 (SeparableCon (None, None, None, 752024 ['block13_sepconv2_act[0][0]'] \n",
" v2D) 1024) \n",
" \n",
" block13_sepconv2_bn (BatchNorm (None, None, None, 4096 ['block13_sepconv2[0][0]'] \n",
" alization) 1024) \n",
" \n",
" conv2d_3 (Conv2D) (None, None, None, 745472 ['add_10[0][0]'] \n",
" 1024) \n",
" \n",
" block13_pool (MaxPooling2D) (None, None, None, 0 ['block13_sepconv2_bn[0][0]'] \n",
" 1024) \n",
" \n",
" batch_normalization_3 (BatchNo (None, None, None, 4096 ['conv2d_3[0][0]'] \n",
" rmalization) 1024) \n",
" \n",
" add_11 (Add) (None, None, None, 0 ['block13_pool[0][0]', \n",
" 1024) 'batch_normalization_3[0][0]'] \n",
" \n",
" block14_sepconv1 (SeparableCon (None, None, None, 1582080 ['add_11[0][0]'] \n",
" v2D) 1536) \n",
" \n",
" block14_sepconv1_bn (BatchNorm (None, None, None, 6144 ['block14_sepconv1[0][0]'] \n",
" alization) 1536) \n",
" \n",
" block14_sepconv1_act (Activati (None, None, None, 0 ['block14_sepconv1_bn[0][0]'] \n",
" on) 1536) \n",
" \n",
" block14_sepconv2 (SeparableCon (None, None, None, 3159552 ['block14_sepconv1_act[0][0]'] \n",
" v2D) 2048) \n",
" \n",
" block14_sepconv2_bn (BatchNorm (None, None, None, 8192 ['block14_sepconv2[0][0]'] \n",
" alization) 2048) \n",
" \n",
" block14_sepconv2_act (Activati (None, None, None, 0 ['block14_sepconv2_bn[0][0]'] \n",
" on) 2048) \n",
" \n",
" global_average_pooling2d (Glob (None, 2048) 0 ['block14_sepconv2_act[0][0]'] \n",
" alAveragePooling2D) \n",
" \n",
" dense (Dense) (None, 7) 14343 ['global_average_pooling2d[0][0]'\n",
" ] \n",
" \n",
"==================================================================================================\n",
"Total params: 20,875,823\n",
"Trainable params: 20,821,295\n",
"Non-trainable params: 54,528\n",
"__________________________________________________________________________________________________\n"
]
}
],
"source": [
"for layer in base_model.layers:\n",
" layer.trainable = True\n",
" \n",
"output = Dense(7, activation='softmax')(base_model.output)\n",
"model = tf.keras.Model(base_model.input, output)\n",
"#model = add_regularization(model)\n",
"model.summary()\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "fd5d1246",
"metadata": {},
"outputs": [],
"source": [
"model.compile(optimizer=Adam(learning_rate=.0001), loss='categorical_crossentropy',\n",
" metrics=['accuracy'])\n",
"# sparse_categorical_crossentropy"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "9cd2ba27",
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/6\n",
"276/276 [==============================] - 254s 903ms/step - loss: 0.9800 - accuracy: 0.6524 - val_loss: 1.3301 - val_accuracy: 0.5258\n",
"Epoch 2/6\n",
"276/276 [==============================] - 246s 891ms/step - loss: 0.4296 - accuracy: 0.8554 - val_loss: 0.8291 - val_accuracy: 0.7175\n",
"Epoch 3/6\n",
"276/276 [==============================] - 245s 885ms/step - loss: 0.1091 - accuracy: 0.9716 - val_loss: 0.9532 - val_accuracy: 0.7288\n",
"Epoch 4/6\n",
"276/276 [==============================] - 248s 895ms/step - loss: 0.0216 - accuracy: 0.9971 - val_loss: 1.0324 - val_accuracy: 0.7331\n",
"Epoch 5/6\n",
"276/276 [==============================] - 249s 900ms/step - loss: 0.0072 - accuracy: 0.9993 - val_loss: 1.1318 - val_accuracy: 0.7295\n",
"Epoch 6/6\n",
"276/276 [==============================] - 249s 899ms/step - loss: 0.0032 - accuracy: 0.9997 - val_loss: 1.1304 - val_accuracy: 0.7388\n"
]
},
{
"data": {
"text/plain": [
"<keras.callbacks.History at 0x7fd5404d6580>"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.fit(x=train_generator,\n",
" steps_per_epoch=len(train_generator),\n",
" validation_data=validation_generator,\n",
" validation_steps=len(validation_generator),\n",
" epochs=6,\n",
" verbose=1)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "63f791af",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.8/dist-packages/keras/engine/functional.py:1410: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument.\n",
" layer_config = serialize_layer_fn(layer)\n"
]
}
],
"source": [
"model.save(\"Model_1.h5\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}