【问题标题】:How do I structure a Keras model for a custom image regression problem?如何为自定义图像回归问题构建 Keras 模型?
【发布时间】:2019-04-28 00:55:28
【问题描述】:

我正在尝试使用 Tensorflow 2 和使用 png 图像的自定义数据集的 keras API 开发回归模型。但是,我不完全确定应该使用哪些层以及如何使用。我将我认为是一个非常简单的模型作为起点,但是当我尝试训练模型时,输出的损失和准确度值始终为 0。这让我相信我的损失计算不起作用,但我不知道为什么。下面是我的源代码的 sn-p,完整的项目可以在here找到:

import tensorflow as tf
import os
import random
import pathlib

AUTOTUNE = tf.data.experimental.AUTOTUNE
TRAINING_DATA_DIR = r'specgrams'

def gen_model():
    model = tf.keras.models.Sequential([
      tf.keras.layers.Flatten(input_shape=(256, 128, 3)),
      tf.keras.layers.Dense(64, activation='relu'),
      tf.keras.layers.Dense(1)
    ])

    model.compile(optimizer=tf.keras.optimizers.Adam(),
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

    return model


def fetch_batch(batch_size=1000):
    all_image_paths = []
    all_image_labels = []

    data_root = pathlib.Path(TRAINING_DATA_DIR)
    files = data_root.iterdir()

    for file in files:
        file = str(file)
        all_image_paths.append(os.path.abspath(file))
        label = file[:-4].split('-')[2:3]
        label = float(label[0]) / 200
        all_image_labels.append(label)

    def preprocess_image(path):
        img_raw = tf.io.read_file(path)
        image = tf.image.decode_png(img_raw, channels=3)
        image = tf.image.resize(image, [256, 128])
        image /= 255.0
        return image

    def preprocess(path, label):
        return preprocess_image(path), label

    path_ds = tf.data.Dataset.from_tensor_slices(all_image_paths)
    image_ds = path_ds.map(preprocess_image, num_parallel_calls=AUTOTUNE)
    label_ds = tf.data.Dataset.from_tensor_slices(all_image_labels)
    ds = tf.data.Dataset.zip((image_ds, label_ds))
    ds = ds.shuffle(buffer_size=len(os.listdir(TRAINING_DATA_DIR)))
    ds = ds.repeat()
    ds = ds.batch(batch_size)
    ds = ds.prefetch(buffer_size=AUTOTUNE)

    return ds

ds = fetch_batch()
model = gen_model()
model.fit(ds, epochs=1, steps_per_epoch=10)

上面的代码应该读取一些存储为 256 x 128 px png 文件的频谱图,将它们转换为张量并拟合它们,以便使用回归模型来预测一个值(在这种情况下,音乐的 BPM 用于生成谱图)。图像文件名包含 BPM,它除以 200 以产生一个介于 0 和 1 之间的值作为标签。

如前所述,此代码确实运行成功,但在每个训练步骤之后,打印输出的损失和准确度值始终为 0.00000 并且不会改变。

还值得注意的是,我实际上希望我的模型预测多个值,而不仅仅是单个 BPM 值,但这是一个单独的问题,因此我针对 here 发布了一个单独的问题。

【问题讨论】:

  • 是的。您需要另一个损失函数来进行回归,例如mean_squared_error。如果您让我知道标签是什么,我想我可以给出更好的答案。我想确定您的问题是否需要regression model
  • @yaho cho 我试图预测一段音乐的节奏,正如我在底部所说的那样,我实际上试图用几个值标记每个项目,但试图简化这一点作为我的调试过程的一部分,将其转换为单个值。理想情况下,我想预测一个 BPM(每分钟节拍数)值,通常在 70-180 范围内,精确到小数点后 2 位,以及一个 Inizio 值(直到第一个节拍的毫秒数,通常是 0 到 1000 之间的整数) .
  • 我明白了。无论如何,尝试mean_squared_error 进行回归。但是,我认为准确度可能很低,因为很难从图像中找到任何线性规则。在我自己执行之前我不确定。
  • 如果我遇到这个问题,我会尝试使用直方图而不是真实图像。或者,我将尝试使用按节奏范围分类的 y 标签创建分类模型。这只是我的假设。请尝试多种方法。
  • @yahocho 谢谢你的建议。使用 MSE,我确实开始看到损失值在下降!但是,正如您所怀疑的那样,准确性存在问题,我从来没有看到它从 0 开始上升。确切地,如何处理输入以及使用哪些模型层是我关于这个项目的论文的主题。非常感谢您对改进此方法的任何想法!

标签: python tensorflow keras tensorflow2.0


【解决方案1】:

无论如何,答案。回归模型需要损失函数相关,例如'mean_squared_error'、'mean_absolut_error'、'mean_absolute_percentage_error'和'mean_squared_logarithmic_error。

def gen_model():
    model = tf.keras.models.Sequential([
      tf.keras.layers.Flatten(input_shape=(256, 128, 3)),
      tf.keras.layers.Dense(512, activation='relu'),
      tf.keras.layers.Dense(512, activation='relu'),        
      tf.keras.layers.Dense(1)
    ])

    model.compile(optimizer=tf.keras.optimizers.Adam(),
                  loss='mean_squared_error',
                  metrics=['accuracy'])

    return model

【讨论】:

  • 谢谢!我的主要问题是使用了错误的损失指标,现在我使用了 mse,我取得了更大的成功。
猜你喜欢
  • 2021-01-02
  • 2022-11-07
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多