簡體   English   中英

如何為自定義圖像回歸問題構建Keras模型?

[英]How do I structure a Keras model for a custom image regression problem?

我正在嘗試使用Tensorflow 2和keras API(使用png圖像的自定義數據集)開發回歸模型。 但是,我不確定我應該使用哪些層以及如何使用。 我以我認為非常簡單的模型作為起點,但是當我嘗試訓練模型時,輸出的損失和准確性值始終為0。這使我相信我的損失計算沒有用,但我不知道為什么。 以下是我的源代碼片段,可以在這里找到完整的項目:

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,該BPM被200除以產生0到1之間的值作為標簽。

如前所述,此代碼可以成功運行,但是在每個訓練步驟之后,輸出的損失和准確性值始終精確地為0.00000,並且不會發生變化。

還值得注意的是,我實際上希望我的模型預測多個值,而不僅僅是單個BPM值,但這是一個單獨的問題,因此,我在此處對此發布了一個單獨的問題。

無論如何尋找答案。 回歸模型需要相關的損失函數,例如“ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM