[PYTHON] Verwenden Sie Colab nur als externe GPU-Umgebung (ab 2020.6 / Mac-Umgebung).

Ich werde darüber schreiben, wie Colab nur als externe GPU-Umgebung und nicht als Editor verwendet wird.

Vorteile von Colab

Für MACs, die Cuda (GPU) nicht verwenden können, ist Google Colaboratory eine der netten Optionen, hat aber auch Nachteile.

Fehler

Lösung

――So verschieben Sie die Datei nach dem Codieren auf dem lokalen Computer nach Colab und lassen Sie Colab sie nur auf der GPU ausführen. ――Für Projekte, die eine lange Berechnungszeit erfordern, ist das Hochladen der Datei selbst nicht so aufwändig und daher überraschend effektiv.

Verfahren

from google.colab import drive 
drive.mount('/content/drive')

Die Google Drive-Ordner werden wie unten gezeigt im linken Bereich angezeigt. image.png


import os
os.chdir('/content/drive/My Drive/colab/face_detection/')

Alternativ können Sie in der Befehlszeile Folgendes ausführen: (Beachten Sie, dass Sie, wenn Sie "cd" in der Colab-Befehlszeile verwenden, "%" hinzufügen und den Pfad in Anführungszeichen setzen müssen.)

%cd "content/drive/My drive/colab/face_detection/"

Wenn Sie es überprüfen, wurde es ordnungsgemäß geändert.


!pwd
/content/drive/My Drive/colab/face_age_detection

Führen Sie die Python-Datei aus.

!python main.py

Prüfung

Ich habe es im Keras-Projekt versucht, das Gesichtsausdrücke erkennt. (Wenn Sie auf dem Colab-Bildschirm auf die .py-Datei doppelklicken, wird der Editor-Bildschirm auf der rechten Seite angezeigt, sodass Sie den Quellcode direkt bearbeiten können.) Bei diesem Projekt gibt es ungefähr 20.000 100 * 100 Bilder, Conv hat 3 Ebenen, Dense hat 2 Ebenen und es ist eine etwas schwere Verarbeitung.


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, #Zufälliger Samen. Wenn es 0 ist, ist es jedes Mal zufällig. Konstanter Zufall, wenn mit einer ganzen Zahl gesetzt.
    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, #Die Reihenfolge der Daten wird gemischt.
    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()) #In einen eindimensionalen Vektor konvertieren
    model.add(Dense(64, activation='relu'))        
    model.add(Dense(1))
    model.compile(loss='mse',optimizer='Adam',metrics=['mae'])
    return model

#Funktionen zur Visualisierung des Lernprozesses
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()

Wenn ich es tatsächlich laufen lasse,

Lokale Maschine(CPU 2.4Ghz 8-Core Core i9)116 Minuten
Colab(GPU)28 Minuten

Es war ungefähr das 2,5-fache der Leistung der CPU.

Recommended Posts

Verwenden Sie Colab nur als externe GPU-Umgebung (ab 2020.6 / Mac-Umgebung).
GPU ~ Implementierung von PlaidML auf Mac ~ (Stand Mai 2020)
PFAD bei Verwendung der virtuellen ANACONDA-Umgebung mit Pycharm (ab Mac 2020/10/03)
Erstellen einer Umgebung für Python3.8 auf einem Mac
[Python] Erstellen einer Umgebung mit Anaconda [Mac]
Verwenden von virtualenv, einer unabhängigen Ausführungsumgebung für Python
Verwenden Sie Ghost.py als Alternative zu PhantomJS