【问题标题】:What may be the cause of pretty slow training speed for CNN (transfer learning)?CNN(迁移学习)训练速度相当慢的原因可能是什么?
【发布时间】:2020-10-21 14:44:56
【问题描述】:

我使用 GPU 来训练具有 Inception v3 迁移学习的模型。 权重='imagenet'。卷积基础被冻结,顶部的密集层用于 MNIST 数字识别的 10 类分类。 代码如下:

from keras.preprocessing import image
datagen=ImageDataGenerator(
    #rescale=1./255,
    preprocessing_function=tf.keras.applications.inception_v3.preprocess_input,
    featurewise_center=False,  # set input mean to 0 over the dataset
    samplewise_center=False,  # set each sample mean to 0
    featurewise_std_normalization=False,  # divide inputs by std of the dataset
    samplewise_std_normalization=False,  # divide each input by its std
    zca_whitening=False,  # apply ZCA whitening
    rotation_range=10,  # randomly rotate images in the range (degrees, 0 to 180)
    zoom_range = 0.1, # Randomly zoom image 
    width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)
    height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)
    horizontal_flip=False,  # randomly flip images
    vertical_flip=False) 
train_generator=datagen.flow_from_directory(
train_path,
target_size=(224, 224),
color_mode="rgb",
class_mode="categorical",
batch_size=86,
interpolation="bilinear",
)

test_generator=datagen.flow_from_directory(
test_path,
target_size=(224, 224),
color_mode="rgb",
class_mode="categorical",
batch_size=86,
interpolation="bilinear",
)
#Import pre-trained model InceptionV3
from keras.applications import InceptionV3

#Instantiate convolutional base
conv_base = InceptionV3(weights='imagenet', 
                    include_top=False,
                    input_shape=(224, 224, 3))  # 3 = number of channels in RGB pictures
#Forbid training of conv part
 conv_base.trainable=False
#Build model
 model=Sequential()
 model.add(conv_base)
 model.add(Flatten())
 model.add(Dense(256,activation='relu'))
 model.add(BatchNormalization())
 model.add(Dropout(0.5))
 model.add(Dense(10, activation='softmax'))

 # Define the optimizer
 optimizer = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)

 # Compile the model
 model.compile(optimizer=optimizer,loss="categorical_crossentropy",metrics=['accuracy'] ) 

 history = model.fit_generator(train_generator,
                          epochs = 1, validation_data = test_generator,
                          verbose = 2, steps_per_epoch=60000 // 86)
                          #, callbacks=[learning_rate_reduction])

当我对数据生成器使用 rescale=1./255 时,获得的训练速率为 1 epoch/hour(即使在将 lr 降低到 0.001 后)。

在寻找答案后,我发现原因我的输入格式不合适。

当我尝试使用 preprocessing_function=tf.keras.applications.inception_v3.preprocess_input 时, 训练 30 分钟后,我收到一条消息:

Epoch 1/1
/usr/local/lib/python3.6/dist-packages/keras/utils/data_utils.py:616: UserWarning: The input 1449 could not be retrieved. It could be because a worker has died.
  UserWarning)
/usr/local/lib/python3.6/dist-packages/keras/utils/data_utils.py:616: UserWarning: The input 614 could not be retrieved. It could be because a worker has died.
  UserWarning)

模型有什么问题? 提前致谢。

【问题讨论】:

    标签: tensorflow keras deep-learning gpu conv-neural-network


    【解决方案1】:

    学习率不影响训练率。

    您训练模型的速度取决于您的 gpu、cpu 和驱动器上的 IO,其他条件不变。

    首先,检查您的 gpu 是否用于训练。

    from keras import backend as K
    K.tensorflow_backend._get_available_gpus()
    

    接下来,你的 GPU 可以处理的最大 batch_size 是 32 吗?尝试增加 batch_size 直到出现 OOM 错误。

    或者您可以监控您的 gpu 和 cpu 使用情况。

    如果 gpu 和 cpu 使用率没有达到最大值,可能会受到驱动器 IO 速度的限制。

    【讨论】:

    • 谢谢@Isaac Ng。在执行我的代码之前,我会检查 GPU 的使用情况。有用。关于 batch_size:当我在本地机器上尝试代码时,即使将 batch_size 减少到 8,我也会遇到 OOM 错误。现在我正在 Google colab(使用 GPU)上进行试验并获得描述的结果。
    • 那么您使用的是 GPU 吗?顺便说一句,您每个时期的步数应该是 num_examples/batch_size。
    • 是的,GPU 已在所有尝试中使用。
    • 如果 32 的 batch_size 有效,较小的 batch_size 不应该给出 OOM 错误。您是否更改了代码中的其他任何内容?
    • 在我的本地机器上 32 不起作用,在 colab 上起作用。我有 60000 个样本并设置了 batch_size=86,因此 steps_per_epoch=60000 // 86。我仍然得到:Epoch 1/1 /usr/local/lib/python3.6/dist-packages/keras/utils/data_utils.py :616: 用户警告:无法检索输入 573。这可能是因为一名工人已经死亡。用户警告)
    【解决方案2】:

    模型没有问题。

    要提高 epoch 的速度,请尝试以下操作:

    1. 开启 XLA。
    import tensorflow as tf
    
    tf.config.optimizer.set_jit(True)
    
    1. 使用混合精度
    from tensorflow.keras.mixed_precision import experimental as mixed_precision
    policy = mixed_precision.Policy('mixed_float16')
    mixed_precision.set_policy(policy)
    

    【讨论】:

    • 降低学习率如何增加 epochs 的时间?
    • @Abhishek Verma,从某种意义上说,这有助于我在运行代码后立即收到警告。之前是 30 分钟之后。
    猜你喜欢
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2022-09-27
    • 2017-08-24
    • 1970-01-01
    • 2020-03-24
    • 2019-06-15
    • 2021-04-17
    相关资源
    最近更新 更多