Model trained on google collab not saving to my drive

Question:

I am building a model for face mask detection on Google collab. I’m unable to save the model to my drive. I ran the following code on Google Collab:

!echo 'Installing required software'
!apt-get install -y -qq software-properties-common module-init-tools 2>&1 > /dev/null
!echo 'Add apt-repository with Google.Drive Fuse'
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!echo 'Updating packages...'
!apt-get update -y -qq
!echo 'Installing google-drive-ocamlfuse fuse...'
!apt-get install -y -qq google-drive-ocamlfuse fuse
!echo 'Authenticate Fuse in Google.Drive...'
from google.colab import auth
from oauth2client.client import GoogleCredentials
import getpass
auth.authenticate_user()
creds = GoogleCredentials.get_application_default()
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass('Enter auth code here: ')
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}

#Mount the google drive
import os
from google.colab import drive
drive.mount('/content/drive')
Dataset='/content/drive/MyDrive/data'
Data_Dir=os.listdir(Dataset)
print(Data_Dir)

#Import necessary libraries
import cv2
import numpy as np
from tensorflow.keras.utils import to_categorical
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split

img_rows, img_cols = 112, 112

images = []
labels = []

for category in Data_Dir:
  folder_path = os.path.join(Dataset, category)
  for img in os.listdir(folder_path):
    img_path = os.path.join(folder_path, img)
    img=cv2.imread(img_path)
    
    try:
      grayscale_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
      resized_img = cv2.resize(grayscale_img,(img_rows, img_cols))
      images.append(resized_img)
      labels.append(category)
    except Exception as e:
      print('Exception:',e)

images = np.array(images)/255.0
images = np.reshape(images,(images.shape[0],img_rows, img_cols,1))

lb = LabelBinarizer()
labels = lb.fit_transform(labels)
labels = to_categorical(labels)
labels = np.array(labels)

(train_X, test_X, train_y, test_y) = train_test_split(images, labels, test_size=0.25, random_state=0)

# Import Necessary Keras Libraries

from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten, Dropout
from keras.layers import Conv2D,MaxPooling2D

# Define model paramters

num_classes = 2
batch_size=32

# Build CNN model using Sequential API 
model=Sequential()

#First layer group containing Convolution, Relu and MaxPooling layers 
model.add(Conv2D(64,(3,3), input_shape=(img_rows, img_cols, 1))) 
model.add(Activation ('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

#Second layer group containing Convolution, Relu and MaxPooling layers 
model.add(Conv2D(128, (3,3)))
model.add(Activation ('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

#Flatten and Dropout Layer to stack the output convolutions above as well as cater overfitting

model.add(Flatten()) 
model.add(Dropout(0.5))

model.add(Dense(64,activation = 'relu'))
model.add(Dense(num_classes, activation = 'softmax'))

print(model.summary())

from keras.utils.vis_utils import plot_model
plot_model(model, to_file = 'face_mask_detection_arch.png')

from keras.optimizers import Adam

epochs = 45
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(lr=0.001),
              metrics=['accuracy'])

fitted_model=model.fit(
    train_X,
    train_y,
    epochs=epochs, 
    validation_split=0.25)

from matplotlib import pyplot as plt

# Plot Training and Validation Loss

plt.plot(fitted_model.history['loss'], 'r',label='training loss')
plt.plot(fitted_model.history['val_loss'], label='validation loss')
plt.xlabel('Number of Epochs') 
plt.ylabel('Loss Value')
plt.legend()
plt.show()

# Plot Training and Validation Accuracy

plt.plot(fitted_model.history['accuracy'], 'r',label='training accuracy') 
plt.plot(fitted_model.history['val_accuracy'], label='validation accuracy') 
plt.xlabel('Number of Epochs')
plt.ylabel('Accuracy Value') 
plt.legend() 
plt.show()

#Save or Serialize the model
model.save('face_mask_detection_alert_system.h5')

There is no error when i run the last cell for saving the model, however the model isn’t getting saved.
Source Code: https://theaiuniversity.com/courses/face-mask-detection-alert-system/

Asked By: NARAYANI VINKE

||

Answers:

Change your directory to Google drive and perform model.save()

Add %cd /content/drive/MyDrive/ to change your directory inside drive.

Another option is to give the full path while using model.save()
Like this model.save('/content/drive/MyDrive/face_mask_detection_alert_system.h5')

Full code

!echo 'Installing required software'
!apt-get install -y -qq software-properties-common module-init-tools 2>&1 > /dev/null
!echo 'Add apt-repository with Google.Drive Fuse'
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!echo 'Updating packages...'
!apt-get update -y -qq
!echo 'Installing google-drive-ocamlfuse fuse...'
!apt-get install -y -qq google-drive-ocamlfuse fuse
!echo 'Authenticate Fuse in Google.Drive...'
from google.colab import auth
from oauth2client.client import GoogleCredentials
import getpass
auth.authenticate_user()
creds = GoogleCredentials.get_application_default()
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass('Enter auth code here: ')
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}

#Mount the google drive
import os
from google.colab import drive
drive.mount('/content/drive')
Dataset='/content/drive/MyDrive/data'
%cd /content/drive/MyDrive/
Data_Dir=os.listdir(Dataset)
print(Data_Dir)

#Import necessary libraries
import cv2
import numpy as np
from tensorflow.keras.utils import to_categorical
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split

img_rows, img_cols = 112, 112

images = []
labels = []

for category in Data_Dir:
  folder_path = os.path.join(Dataset, category)
  for img in os.listdir(folder_path):
    img_path = os.path.join(folder_path, img)
    img=cv2.imread(img_path)
    
    try:
      grayscale_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
      resized_img = cv2.resize(grayscale_img,(img_rows, img_cols))
      images.append(resized_img)
      labels.append(category)
    except Exception as e:
      print('Exception:',e)

images = np.array(images)/255.0
images = np.reshape(images,(images.shape[0],img_rows, img_cols,1))

lb = LabelBinarizer()
labels = lb.fit_transform(labels)
labels = to_categorical(labels)
labels = np.array(labels)

(train_X, test_X, train_y, test_y) = train_test_split(images, labels, test_size=0.25, random_state=0)

# Import Necessary Keras Libraries

from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten, Dropout
from keras.layers import Conv2D,MaxPooling2D

# Define model paramters

num_classes = 2
batch_size=32

# Build CNN model using Sequential API 
model=Sequential()

#First layer group containing Convolution, Relu and MaxPooling layers 
model.add(Conv2D(64,(3,3), input_shape=(img_rows, img_cols, 1))) 
model.add(Activation ('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

#Second layer group containing Convolution, Relu and MaxPooling layers 
model.add(Conv2D(128, (3,3)))
model.add(Activation ('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

#Flatten and Dropout Layer to stack the output convolutions above as well as cater overfitting

model.add(Flatten()) 
model.add(Dropout(0.5))

model.add(Dense(64,activation = 'relu'))
model.add(Dense(num_classes, activation = 'softmax'))

print(model.summary())

from keras.utils.vis_utils import plot_model
plot_model(model, to_file = 'face_mask_detection_arch.png')

from keras.optimizers import Adam

epochs = 45
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(lr=0.001),
              metrics=['accuracy'])

fitted_model=model.fit(
    train_X,
    train_y,
    epochs=epochs, 
    validation_split=0.25)

from matplotlib import pyplot as plt

# Plot Training and Validation Loss

plt.plot(fitted_model.history['loss'], 'r',label='training loss')
plt.plot(fitted_model.history['val_loss'], label='validation loss')
plt.xlabel('Number of Epochs') 
plt.ylabel('Loss Value')
plt.legend()
plt.show()

# Plot Training and Validation Accuracy

plt.plot(fitted_model.history['accuracy'], 'r',label='training accuracy') 
plt.plot(fitted_model.history['val_accuracy'], label='validation accuracy') 
plt.xlabel('Number of Epochs')
plt.ylabel('Accuracy Value') 
plt.legend() 
plt.show()

#Save or Serialize the model
model.save('face_mask_detection_alert_system.h5')
Answered By: Prakash Dahal