最近、Google Colabの使用を開始し、最初のConvolutional NNをトレーニングしたいと考えました。 here と答えたおかげで、Googleドライブから画像をインポートしました。
次に、CNNをColabに作成するためのコードを貼り付けて、プロセスを開始しました。完全なコードは次のとおりです。
(パート1は、 here からコピーされます。
ステップ1:
!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse Fuse
ステップ2:
from google.colab import auth
auth.authenticate_user()
ステップ3:
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}
ステップ4:
!mkdir -p drive
!google-drive-ocamlfuse drive
ステップ5:
print('Files in Drive:')
!ls drive/
UdemyコースのチュートリアルでこのCNNを作成しました。バックエンドとしてtensorflowを使用してkerasを使用します。簡単にするために、私は本当に簡単なバージョンをアップロードしました。これは私の問題を表示するのに十分です
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
from keras.layers import Dropout
from keras.optimizers import Adam
from keras.preprocessing.image import ImageDataGenerator
パラメーター
imageSize=32
batchSize=64
epochAmount=50
CNN
classifier=Sequential()
classifier.add(Conv2D(32, (3, 3), input_shape = (imageSize, imageSize, 3), activation = 'relu')) #convolutional layer
classifier.add(MaxPooling2D(pool_size = (2, 2))) #pooling layer
classifier.add(Flatten())
ANN
classifier.add(Dense(units=64, activation='relu')) #hidden layer
classifier.add(Dense(units=1, activation='sigmoid')) #output layer
classifier.compile(optimizer = "adam", loss = 'binary_crossentropy', metrics = ['accuracy']) #training method
画像の前処理
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set = train_datagen.flow_from_directory('drive/School/sem-2-2018/BSP2/UdemyCourse/CNN/dataset/training_set',
target_size = (imageSize, imageSize),
batch_size = batchSize,
class_mode = 'binary')
test_set = test_datagen.flow_from_directory('drive/School/sem-2-2018/BSP2/UdemyCourse/CNN/dataset/test_set',
target_size = (imageSize, imageSize),
batch_size = batchSize,
class_mode = 'binary')
classifier.fit_generator(training_set,
steps_per_Epoch = (8000//batchSize),
epochs = epochAmount,
validation_data = test_set,
validation_steps = (2000//batchSize))
まず、私が使用したトレーニングセットは、さまざまな解像度の10000匹の犬と猫の写真を含むデータベースです。 (8000 training_set、2000 test_set)
私はこのCNNをGoogle Colab(GPUサポートが有効)とPC(GTX 1060のtensorflow-gpu)で実行しました
これは私のPCからの中間結果です:
Epoch 2/50
63/125 [==============>...............] - ETA: 2s - loss: 0.6382 - acc: 0.6520
そして、これはColabから:
Epoch 1/50
13/125 [==>...........................] - ETA: 1:00:51 - loss: 0.7265 - acc: 0.4916
なぜ私の場合、Google Colabが非常に遅いのですか?
個人的には、ドライブから画像を取得して読み取ることで構成されるボトルネックが疑われますが、データベースをインポートする別の方法を選択する以外、これを解決する方法がわかりません。
Googleドライブからファイルを読み取るのは非常に遅いです。
たとえば、1つの大きなファイル(39GB)があります。
'!cp drive/big.file/content /'を実行すると、10分以上かかります。
ファイルを共有し、GoogleドライブからURLを取得した後。実行するのに5分かかりました '! wget -c -O big.file http://share.url.from.drive 'ダウンロード速度は最大130MB/sです。
ColabのGPUが少なくともローカルPCと同じくらい長くかかっているように見えるのと同じ質問があるので、私はそこでは助けにはなりません。しかし、そうは言っても、データをローカルで使用しようとすると、次のプロセスがcolabで提供されているアップロード機能を使用するよりもはるかに高速であることがわかりました。
1.)Googleドライブをマウントする
# Run this cell to mount your Google Drive.
from google.colab import drive
drive.mount('/content/drive')
2.)データを保存するGoogleドライブフォルダーの外にフォルダーを作成します
3.)次のコマンドを使用して、Googleドライブの目的のフォルダーから作成したフォルダーにコンテンツをコピーします
!ln -s "/content/drive/My Drive/path_to_folder_desired" "/path/to/the_folder/you created"
(これは (別のstackoverflow 同様の問題の解決策を見つけるために使用した応答から参照されます)
4.)これで、パス「/ path/to/the_folder/you created」でデータを使用できるようになりました。
データをnumpy配列(.npy形式)としてロードし、flow_from_directoryの代わりにflowメソッドを使用できます。 Colabは25GB RAMを提供しているので、大きなデータセットでもデータ全体をメモリにロードできます。同じデータ生成ステップで速度が2.5倍になりました!!! (colabローカルディスクに保存されているデータ、つまり '/ content'またはgoogleドライブよりも高速です。
ColabはシングルコアCPU(コアあたり2スレッド)のみを提供するため、特に重い前処理またはデータ増強のためにデータジェネレーターを使用する場合、CPU-GPUデータ転送(たとえばK80またはT4 GPU)にボトルネックがあるようです。また、fit_generatorメソッドの「workers」、「use_multiprocessing」、「max_queue_size」などのパラメーターに異なる値を設定してみることもできます...