J'écrirai sur la façon d'utiliser Colab uniquement en tant qu'environnement GPU externe, pas en tant qu'éditeur.
Pour les MAC qui ne peuvent pas utiliser Cuda (GPU), Google Colaboratory est l'une des options intéressantes, mais il a aussi ses inconvénients.
Ainsi, après le codage sur la machine locale, déplacez le fichier vers Colab et laissez Colab l'exécuter uniquement sur le GPU. ――Pour les projets qui nécessitent une longue période de calcul, le téléchargement du fichier lui-même n'est pas tellement de travail, il est donc étonnamment efficace.
--Combinez le fichier python principal, le fichier de module et le fichier de données dans un seul dossier.
from google.colab import drive
drive.mount('/content/drive')
Les dossiers Google Drive sont affichés dans le volet gauche, comme indiqué ci-dessous.
import os
os.chdir('/content/drive/My Drive/colab/face_detection/')
Vous pouvez également effectuer les opérations suivantes sur la ligne de commande: (Notez que si vous utilisez cd
sur la ligne de commande Colab, vous devez ajouter%
et mettre le chemin entre guillemets.)
%cd "content/drive/My drive/colab/face_detection/"
Si vous le vérifiez, il a été correctement modifié.
!pwd
/content/drive/My Drive/colab/face_age_detection
Exécutez le fichier Python.
!python main.py
Je l'ai essayé dans le projet Keras qui reconnaît les expressions faciales. (À propos, si vous double-cliquez sur le fichier .py sur l'écran Colab, l'écran de l'éditeur apparaîtra sur le côté droit, vous pouvez donc éditer le code source directement.) Dans le cas de ce projet, il y a environ 20000 images 100 * 100, Conv a 3 couches et Dense a 2 couches, ce qui est un traitement un peu lourd.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os, zipfile, io, re
from PIL import Image
from sklearn.model_selection import train_test_split
import tensorflow.keras
from tensorflow.keras.models import Sequential, Model, load_model
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten
from tensorflow.keras.layers import GlobalAveragePooling2D
from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau
from tensorflow.keras.preprocessing.image import ImageDataGenerator
image_size = 100
X = np.load("data/X_data.npy" )
Y = np.load("data/Y_data.npy")
X_train, X_test, y_train, y_test = train_test_split(
X,
Y,
random_state = 0, #Graine aléatoire. S'il vaut 0, il est aléatoire à chaque fois. Constante aléatoire lorsqu'elle est prédéfinie avec un entier.
test_size = 0.2
)
X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255
X_train, X_val, y_train, y_val = train_test_split(
X_train,
y_train,
random_state = 0, #L'ordre des données est mélangé.
test_size = 0.2
)
def create_model(X, y):
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',input_shape=X.shape[1:], activation='relu'))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
model.add(Flatten()) #Convertir en un vecteur unidimensionnel
model.add(Dense(64, activation='relu'))
model.add(Dense(1))
model.compile(loss='mse',optimizer='Adam',metrics=['mae'])
return model
#Fonctions de visualisation du processus d'apprentissage
def plot_history(history):
plt.plot(history.history['loss'],"o-",label="loss",)
plt.plot(history.history['val_loss'],"o-",label="val_loss")
plt.title('model loss')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(loc='upper right')
plt.show()
# Data Augmentation
datagen = ImageDataGenerator(
featurewise_center = False,
samplewise_center = False,
featurewise_std_normalization = False,
samplewise_std_normalization = False,
zca_whitening = False,
rotation_range = 0,
width_shift_range = 0.1,
height_shift_range = 0.1,
horizontal_flip = True,
vertical_flip = False
)
# EarlyStopping
early_stopping = EarlyStopping(
monitor = 'val_loss',
patience = 10,
verbose = 1
)
# reduce learning rate
reduce_lr = ReduceLROnPlateau(
monitor = 'val_loss',
factor = 0.1,
patience = 3,
verbose = 1
)
model = create_model(X_train, y_train)
history = model.fit_generator(
datagen.flow(X_train, y_train, batch_size = 128),
steps_per_epoch = X_train.shape[0] // 128,
epochs = 50,
validation_data = (X_val, y_val),
callbacks = [early_stopping, reduce_lr],
shuffle = True,
verbose = 1)
model.save('age_prediction.hdf5')
plot_history(history)
model = load_model('age_prediction.hdf5')
preds=model.predict(X_test[0:30])
plt.figure(figsize=(16, 6))
for i in range(30):
plt.subplot(3, 10, i+1)
plt.axis("off")
pred = round(preds[i][0],1)
true = y_test[i]
if abs(pred - true) < 3.0:
plt.title(str(true) + '\n' + str(pred))
else:
plt.title(str(true) + '\n' + str(pred), color = "red")
plt.imshow(X_test[i])
plt.show()
Quand je l'exécute,
Machine locale(CPU 2.4Ghz 8-Core Core i9)116 minutes
Colab(GPU)28 minutes
C'était environ 2,5 fois les performances du processeur.
Recommended Posts