通过迁移学习,我正在尝试使用Google Colab在Keras中训练VGG16。以下是notebook中的代码:(注意:输出是作为注释编写的)

代码语言:javascript复制 from keras import Sequential

from keras.layers import Dense, Flatten

from keras.applications import vgg16

from keras.applications.vgg16 import preprocess_input as vgg_pi

from keras.preprocessing.image import ImageDataGenerator

from keras.models import Model

base_model = vgg16.VGG16(include_top=False, weights='imagenet',

input_shape=(224, 224, 3))

for layer in base_model.layers:

layer.trainable = False

base_model.summary()

# Total params: 14,714,688

# Trainable params: 0

# Non-trainable params: 14,714,688

x = base_model.output

x = Flatten(name='flatten', input_shape=base_model.output_shape)(x)

x = Dense(10, activation='softmax', name='predictions')(x)

model = Model(inputs=base_model.input, outputs=x)

model.summary()

# Total params: 14,965,578

# Trainable params: 250,890

# Non-trainable params: 14,714,688

model.compile(optimizer='adam',

loss='categorical_crossentropy',

metrics=['accuracy'])

train_datagen = ImageDataGenerator(

rescale=1./255,

rotation_range=40,

width_shift_range=0.2,

height_shift_range=0.2,

shear_range=0.2,

zoom_range=0.2,

fill_mode='nearest',

)

validation_datagen = ImageDataGenerator(

rescale=1./255,

)

train_generator = train_datagen.flow_from_directory(

'/content/drive/My Drive/Colab Notebooks/domat/solo-dataset/train/',

target_size=(224, 224),

batch_size=32,

class_mode='categorical',

)

validation_generator = validation_datagen.flow_from_directory(

'/content/drive/My Drive/Colab Notebooks/domat/solo-dataset/validation/',

target_size=(224, 224),

batch_size=32,

class_mode='categorical',

)

# Found 11614 images belonging to 10 classes.

# Found 2884 images belonging to 10 classes.

# check if GPU is running

import tensorflow as tf

device_name = tf.test.gpu_device_name()

if device_name != '/device:GPU:0':

raise SystemError('GPU device not found')

print('Found GPU at: {}'.format(device_name))

# Found GPU at: /device:GPU:0

t_steps = 11614 // 32

v_steps = 2884 // 32

history = model.fit_generator(train_generator,

epochs=500,

steps_per_epoch=t_steps,

validation_data=validation_generator,

validation_steps=v_steps,

)

# Epoch 1/500

# 8/362 [..............................] - ETA: 41:02 - loss: 2.9058 - acc: 0.2383所以,由于某些原因,一个时期需要大约40分钟,我真的不明白为什么它这么慢。

之前,我尝试了不同的参数(添加更多完全连接的层),每个时期大约在3分钟内完成,尽管它显然是过度拟合的,因为有14mil的参数是免费的,并且数据集要小得多。

有谁知道如何处理这个问题吗?我已经尝试了上百万种方法,但都太慢了。我甚至无法返回到原始配置来查看我之前正在做的事情,以便每个时期在大约3分钟内完成。