Недавно я начал использовать Google Colab и хотел обучить свою первую сверточную сетевую сеть. Я импортировал изображения со своего Google Диска благодаря ответу, который получил здесь.
Затем я вставил свой код для создания CNN в Colab и начал процесс. Вот полный код:
Часть 1. Настройка Colab для импорта изображения с моего Диска
(часть 1 скопирована из здесь, поскольку он работал как ожидалось для меня
Шаг 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/
Часть 2: Скопируйте, вставив мой CNN
Я создал этот CNN с помощью руководств по курсу Udemy. Он использует керасы с тензорным потоком в качестве бэкэнда. Для простоты я загрузил действительно простую версию, которой достаточно, чтобы показать мои проблемы.
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())
АННА
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 наборов тренировок, набор тестов 2000)
Я запустил этот CNN в Google Colab (с включенной поддержкой графического процессора) и на своем ПК (tensorflow-gpu на GTX 1060).
Это промежуточный результат с моего ПК:
Epoch 2/50
63/125 [==============>...............] - ETA: 2s - loss: 0.6382 - acc: 0.6520
А это от Колаба:
Epoch 1/50
13/125 [==>...........................] - ETA: 1:00:51 - loss: 0.7265 - acc: 0.4916
Почему в моем случае Google Colab такой медленный?
Лично я подозреваю, что узкое место состоит в извлечении и последующем чтении изображений с моего Диска, но я не знаю, как решить эту проблему, кроме выбора другого метода для импорта базы данных.