cha*_*l-f 9 python neural-network jupyter-notebook google-colaboratory
我最近开始使用Google Colab,并想训练我的第一个Convolutional NN.由于我在这里的答案,我从Google云端硬盘导入了图片.
然后我粘贴了我的代码,将CNN创建到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
Run Code Online (Sandbox Code Playgroud)
第2步:
from google.colab import auth
auth.authenticate_user()
Run Code Online (Sandbox Code Playgroud)
第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}
Run Code Online (Sandbox Code Playgroud)
第4步:
!mkdir -p drive
!google-drive-ocamlfuse drive
Run Code Online (Sandbox Code Playgroud)
第5步:
print('Files in Drive:')
!ls drive/
Run Code Online (Sandbox Code Playgroud)
我用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
Run Code Online (Sandbox Code Playgroud)
参数
imageSize=32
batchSize=64
epochAmount=50
Run Code Online (Sandbox Code Playgroud)
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())
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
图像预处理
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))
Run Code Online (Sandbox Code Playgroud)
首先,我使用的训练集是一个包含10000种不同分辨率的狗和猫图片的数据库.(8000 training_set,2000 test_set)
我在谷歌Colab(支持GPU支持)和我的PC(GTX 1060上的tensorflow-gpu)上运行了这个CNN
这是我的PC的中间结果:
Epoch 2/50
63/125 [==============>...............] - ETA: 2s - loss: 0.6382 - acc: 0.6520
Run Code Online (Sandbox Code Playgroud)
这来自Colab:
Epoch 1/50
13/125 [==>...........................] - ETA: 1:00:51 - loss: 0.7265 - acc: 0.4916
Run Code Online (Sandbox Code Playgroud)
为什么Google Colab在我的案例中这么慢?
我个人怀疑是一个瓶颈,包括拉动然后从我的驱动器读取图像,但除了选择不同的方法导入数据库之外,我不知道如何解决这个问题.
从谷歌硬盘读取文件非常慢.
例如,我有一个大文件(39GB).
我执行'!cp drive/big.file/content /'时花费超过10分钟.
我分享了我的文件后,从谷歌驱动器获取了网址.当我执行时,它花了5分钟!wget -c -O big.file http://share.url.from.drive '.下载速度可达130MB/s.
我遇到了同样的问题,这就是我解决的方法。
首先,通过转到“运行时”->“更改运行时类型”并选择 GPU 作为硬件加速器,确保启用 GPU(因为默认情况下不是)。
然后,如此处所示,您可以使用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)
Run Code Online (Sandbox Code Playgroud)
我面临着同样的问题。我是这样解决的:-
这对我有用。我不知道确切的原因,但由于 colab 访问其本地目录的速度比访问已安装的驱动器目录的速度快,这可能恰好是问题的要点。