我最近开始使用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。它使用带有张量流的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)
我在Google Colab上启用了这个CNN(启用了GPU支持)和我的PC(GTX 1060上的tensorflow-gpu)
这是我个人电脑的中间结果:
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在我的案例中这么慢?
我个人怀疑是一个瓶颈,包括拉动然后从我的驱动器中读取图像,但除了选择不同的方法导入数据库之外,我不知道如何解决这个问题。
答案 0 :(得分:5)
从谷歌硬盘中读取文件的速度非常慢。
例如,我有一个大文件(39GB)。
当我执行'!cp drive / big.file / content /'时,花费超过10分钟。>
我分享了我的文件后,从谷歌驱动器获取了网址。当我执行时,它花了5分钟! wget -c -O big.file http://share.url.from.drive'。下载速度最高可达130MB / s。
答案 1 :(得分:4)
@@ Feng已经指出,从驱动器读取文件非常慢。 This教程建议使用某种类型的内存映射文件,例如hdf5或lmbd,以解决此问题。这样,I \ O操作会更快(有关hdf5格式的速度增益的完整说明,请参见this)。
答案 2 :(得分:2)
对于为什么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"
(这是我曾经用来解决类似问题的another stackoverflow响应中引用的内容)
4。)现在,您可以在“ / path / to / the_folder /您创建的”路径中使用数据
答案 3 :(得分:1)
您可以将数据加载为numpy数组(.npy格式),并使用flow方法代替flow_from_directory。 Colab提供25GB RAM,因此即使是大数据集,您也可以将整个数据加载到内存中。发现加速速度约为2.5倍,并且具有相同的数据生成步骤!!! (比存储在colab本地磁盘(即“ / content”或Google驱动器中的数据)还要快。
由于colab仅提供一个核心CPU(每个核心2个线程),因此似乎存在CPU-GPU数据传输(例如K80或T4 GPU)的瓶颈,尤其是如果您使用数据生成器进行繁重的预处理或数据扩充时。 您还可以尝试在fit_generator方法中为'workers','use_multiprocessing','max_queue_size'等参数设置不同的值...
答案 4 :(得分:1)
从Google驱动器读取文件会减慢您的培训过程。解决方案是将zip文件上传到colab并在那里解压缩。希望对你来说很清楚。
答案 5 :(得分:1)
我遇到了同样的问题,这就是我解决的方法。
首先,请转到运行时->更改运行时类型,然后选择GPU作为硬件加速器,以确保已启用GPU(因为默认情况下未启用GPU)。
然后,如here所示,您可以使用cache()和prefetch()函数来优化性能。示例:
# Load dataset
train_ds = keras.preprocessing.image_dataset_from_directory('Data/train',labels="inferred")
val_ds = keras.preprocessing.image_dataset_from_directory('Data/test',labels="inferred")
# Standardize data (optional)
from tensorflow.keras import layers
normalization_layer = keras.layers.experimental.preprocessing.Rescaling(1./255)
train_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))
val_ds = val_ds.map(lambda x, y: (normalization_layer(x), y))
# Cache to RAM (optional)
from tensorflow import data
AUTOTUNE = data.experimental.AUTOTUNE
train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
# Train
model.fit(train_ds, validation_data=val_ds, epochs=3)
答案 6 :(得分:1)
我遇到了同样的问题。这是我解决它的方法:-
它对我有用。我不知道确切的原因,但由于 colab 访问其本地目录的速度比访问已安装的驱动器目录的速度快,因此这可能是问题的要点。
答案 7 :(得分:0)
如果要处理kaggle中的数据集,请检查this
记住:在Google colab Linux内部,通过在命令前加上'!'
例如:
!mkdir ~/.kaggle/kaggle.json
!ls !unzip -q downloaded_file.zip
答案 8 :(得分:-2)
Google Colab 实例使用的内存比 Google Drive 快。当您从谷歌驱动器访问文件时(访问时间更长),因此速度变慢。首先将文件复制到 colab 实例,然后训练您的网络。