如何为自定义图像回归问题构建 Keras 模型?
How do I structure a Keras model for a custom image regression problem?
我正在尝试使用 Tensorflow 2 和 keras API 使用 png 图像的自定义数据集开发回归模型。但是,我不完全确定我应该使用哪些层以及如何使用。我把我认为是一个非常简单的模型放在一起作为起点,但是当我尝试训练模型时,打印出的损失和准确度值始终为 0。这让我相信我的损失计算不起作用,但我不知道为什么。下面是我的源代码片段,可以找到完整的项目 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 像素 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
我正在尝试使用 Tensorflow 2 和 keras API 使用 png 图像的自定义数据集开发回归模型。但是,我不完全确定我应该使用哪些层以及如何使用。我把我认为是一个非常简单的模型放在一起作为起点,但是当我尝试训练模型时,打印出的损失和准确度值始终为 0。这让我相信我的损失计算不起作用,但我不知道为什么。下面是我的源代码片段,可以找到完整的项目 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 像素 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