如何在Colab中检查预处理时间/速度?

2024-06-09 14:52:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在谷歌Colab GPU上训练神经网络。因此,我将输入图像(总共180k,105k用于培训,76k用于验证)与我的Google Drive同步。然后我装上谷歌硬盘,从那里开始。 我在GoogleColab中加载一个带有图像路径和标签的csv文件,并将其存储为数据帧。 之后,我使用图像路径和标签列表

我使用此函数对标签进行onehot编码,因为每个标签需要一个特殊的输出形状(7, 35),这是现有默认函数无法完成的:

#One Hot Encoding der Labels, Zielarray hat eine Shape von (7,35)
from numpy import argmax
# define input string

def my_onehot_encoded(label):
    # define universe of possible input values
    characters = '0123456789ABCDEFGHIJKLMNPQRSTUVWXYZ'
    # define a mapping of chars to integers
    char_to_int = dict((c, i) for i, c in enumerate(characters))
    int_to_char = dict((i, c) for i, c in enumerate(characters))
    # integer encode input data
    integer_encoded = [char_to_int[char] for char in label]
    # one hot encode
    onehot_encoded = list()
    for value in integer_encoded:
        character = [0 for _ in range(len(characters))]
        character[value] = 1
        onehot_encoded.append(character)

    return onehot_encoded

之后,我使用一个定制的DataGenerator将数据批量输入到我的模型中。x_set是指向我的图像的图像路径列表,y_set是一个热编码标签:

class DataGenerator(Sequence):

    def __init__(self, x_set, y_set, batch_size):
        self.x, self.y = x_set, y_set
        self.batch_size = batch_size

    def __len__(self):
        return math.ceil(len(self.x) / self.batch_size)

    def __getitem__(self, idx):
        batch_x = self.x[idx*self.batch_size : (idx + 1)*self.batch_size]
        batch_x = np.array([resize(imread(file_name), (224, 224)) for file_name in batch_x])
        batch_x = batch_x * 1./255
        batch_y = self.y[idx*self.batch_size : (idx + 1)*self.batch_size]
        batch_y = np.array(batch_y)

        return batch_x, batch_y

使用此代码,我将DataGenerator应用于我的数据:

training_generator = DataGenerator(X_train, y_train, batch_size=32)
validation_generator = DataGenerator(X_val, y_val, batch_size=32)

当我现在训练我的模型时,一个纪元持续25-40分钟,非常长

model.fit_generator(generator=training_generator,
                    validation_data=validation_generator,
                    steps_per_epoch = num_train_samples // 16,
                    validation_steps = num_val_samples // 16,
                    epochs = 10, workers=6, use_multiprocessing=True)

我现在想知道如何测量预处理时间,因为我不认为这是由于模型的大小,因为我已经用较少的参数对模型进行了实验,但训练时间没有显著减少。。。所以,我怀疑预处理


Tags: in图像selfforsizedefbatch标签
1条回答
网友
1楼 · 发布于 2024-06-09 14:52:47

要在Colab中测量时间,可以使用thisautotime包:

!pip install ipython-autotime

%load_ext autotime

此外,对于评测,您可以使用前面提到的here

一般来说,为了确保generator运行得更快,建议您将数据从gdrive复制到该colab的本地主机,否则它可能会变慢。

如果您正在使用Tensorflow 2.0,原因可能是this错误

解决办法是:

  • 在代码开头调用tf.compat.v1.disable_eager_execution()
  • 使用model.fit而不是model.fit_generator。前者无论如何都支持发电机
  • 降级到TF 1.14

无论Tensorflow版本如何,都要限制您的磁盘访问量,这通常是一个瓶颈

注意,似乎确实存在一个issue,生成器在TF中运行缓慢 1.13.22.0.1(至少)。

相关问题 更多 >