我有一个多标签分类问题。 我写了这个自定义生成器。 它从磁盘读取图像和输出标签,并以32的大小批量返回它们。

def get_input(img_name):
    path = os.path.join("images", img_name)
    img = image.load_img(path, target_size=(224, 224))

    return img


def get_output(img_name, file_path):
    data = pd.read_csv(file_path, delim_whitespace=True, header=None)

    img_id = img_name.split(".")[0]
    img_id = img_id.lstrip("0")
    img_id = int(img_id)

    labels = data.loc[img_id - 1].values
    labels = labels[1:]

    labels = list(labels)
    label_arrays = []
    for i in range(20):
        val = np.zeros((1))
        val[0] = labels[i]
        label_arrays.append(val)

    return label_arrays


def preprocess_input(img_name):
    img = get_input(img_name)
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)    
    return x

def train_generator(batch_size):
    file_path = "train.txt"
    data = pd.read_csv(file_path, delim_whitespace=True, header=None)

    while True:
        for i in range(math.floor(8000/batch_size)):
            x_batch = np.zeros(shape=(32, 224, 224, 3))
            y_batch = np.zeros(shape=(32, 20))
            for j in range(batch_size):
                img_name = data.loc[i * batch_size + j].values
                img_name = img_name[0]
                x = preprocess_input(img_name)
                y = get_output(img_name, file_path)
                x_batch[j, :, :, :] = x
                y_batch[j] = y

            ys = []
            for i in range(20):
              ys.append(y_batch[:,i])

            yield(x_batch, ys)

标签返回模型有一个小问题,并在以下问题中得到解决: 训练多输出keras模型

我在单个输出问题上测试了此生成器。 此自定义生成器非常慢。 使用此自定义生成器的单个时间段的预计到达时间约为27小时,而内置生成器(使用flow_from_directory)单个时间段则需要25分钟。 我究竟做错了什么?

除使用的发电机外,两个测试的训练过程相同。 验证生成器类似于训练生成器。 我知道我无法达到Keras内置发电机的效率,但是这种速度差异太大。

编辑

我阅读了一些有关创建自定义生成器的指南。

编写定制的Keras生成器

fit_generator()的自定义生成器,生成具有不同形状的多个输入

#1楼 票数:0

也许内置的生成器会在您的gpu上处理数据,而您的自定义生成器则在cpu上运行,这会大大降低速度。

另一个猜测是因为Keras在后台使用数据集 您的实现可能使用feed-dict ,这是将信息传递给TensorFlow的最慢方法。 将数据输入模型的最好方法是使用输入管道,以确保GPU永远不必等待新的东西进入。

  ask by james translate from so

未解决问题?本站智能推荐:

2回复

拟合生成器在Keras中输出的精度与手动计算的精度不同

当我使用fit时,它工作正常,但是当我使用fit_generator时,出现了问题。 我使用了回调方法来在每个火车时期结束时找到混淆矩阵。 但是,从混淆矩阵获得的精度与从喀拉拉输出的验证精度不同。 我的代码如下。 Valid check是我的回调方法。 no_decoder_gen
2回复

如何将Python数据生成器转换为Tensorflow张量?

我有一个数据生成器,我正在从中生成训练图像。 我想通过使用这个Python数据生成器将数据提供给Tensorflow模型,但我无法弄清楚如何将生成器转换为Tensorflow张量。 我正在寻找类似于Keras'fit_generator()函数的东西。 谢谢!
1回复

在 Python 中使用生成器输入 Keras model.fit_generator

我正在学习如何在 Python 中使用生成器并将其输入 Keras model.fit_generator。 我在./mnist文件夹中有 2 ./mnist文件夹,对应于我数据集中的每个类。 我创建了一个 Dataframe,其中包含每个图像的路径和标签(即相应子文件夹的名称)。 我创建了G
1回复

如何为keras使用自定义损失函数

我最近遇到了Focal 损失函数,听说它主要用于不平衡数据集。 所以我只是通过使用我在网上找到的这个简单的 Focal 损失函数(对于 Keras)在 Cifar10 数据集上进行了尝试。 我一直面临一个我在最后提到的错误。 我尝试了几种方法来解决它,但没有运气。 请注意,我非常感谢您的帮助。 谢谢
1回复

在 keras 中创建自定义激活函数

我正在尝试在 keras 中创建自己的自定义激活函数,如果 x < 0 则返回 0,如果 x >= 0 则返回 1 它给了我这个错误 我该如何解决?
1回复

关于带有TensorFlow后端的Keras的自定义损失功能的问题

我正在尝试将三类分类问题的损失函数定义如下: 我的y看起来像这样: [[1,0,0], [0,1,0], [1,0,0], [0,0,1], ...] 直观地讲,我的三类标签是“ -1”,“ 0”和“ +1”类的一键编码。 我想最大化“ +/- 1”的正确标签,最小化“ +/-
1回复

使用自定义数据生成器为Keras模型拟合大量数据

我正在努力使我的Keras模型适合大量数据。 为此,我使用自定义数据生成器和model.fit_generator函数。 但是,我似乎无法理解我是否正确地这样做了。 这就是我所拥有的: 我的数据集由名称如下的图像组成: cat.[number].jpg ,即
2回复

Keras 自定义损失函数:访问当前输入模式

在 Keras(带有 Tensorflow 后端)中,当前输入模式是否可用于我的自定义损失函数? 当前输入模式被定义为用于产生预测的输入向量。 例如,考虑以下内容: X_train, X_test, y_train, y_test = train_test_split(X, y, test_siz