Как мне структурировать модель Keras для решения проблемы с регрессией изображения? - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь разработать регрессионную модель, используя Tensorflow 2 и API-интерфейс keras, используя пользовательский набор данных изображений 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, который делится на 200, чтобы получить значение от 0 до 1. В качестве метки.

Как указано выше, этот код работает успешно, но после каждого шага обучения выводятся значения потерь и точности.всегда равны 0,00000 и не меняются.

Стоит также отметить, что я действительно хочу, чтобы моя модель предсказывала несколько значений, а не только одно значение BPM, но это отдельная проблема, и поэтому я опубликовалотдельный вопрос для этого здесь .

1 Ответ

1 голос
/ 28 апреля 2019

В любом случае за ответ. Для регрессионной модели требуются функции, связанные с потерями, например, «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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...