ValueError:目标数据丢失。你的模型是用 loss=<keras.losses.MeanSquaredError ... in regression task

问题描述 投票:0回答:1

我对神经网络/keras 很陌生,所以我可能遗漏了一些明显的东西。这样做的目的是放入一个时间序列,然后预测下一个值。 数据集构建如下:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import tensorflow_probability as tfp
import numpy as np

train_dataset, test_dataset = test_train_split(data['ma'], 20)

train_dataset = np.array(train_dataset)
train_dataset = [np.reshape(train_dataset, (train_dataset.shape[0], 1))]
test_dataset = np.array(test_dataset)
test_dataset = [np.reshape(test_dataset, (test_dataset.shape[0], 1))]

test_train_split(data['ma'], 20)
函数返回 2 个浮点值列表。所以最后
train_dataset
是一个np.array的列表,如果形状(380,1)和大小(20,1)之一的```test_dataset``。

现在我定义了一个贝叶斯神经网络:

hidden_units = [8, 8] #length is how many layers and the number is how many units per layer
train_size = train_dataset[0].shape[0]
inputs = layers.Input(shape=(1,))
features = inputs
for units in hidden_units:
        features = tfp.layers.DenseVariational(
            units=units,
            make_prior_fn=prior,
            make_posterior_fn=posterior,
            kl_weight=1 / train_size,
            activation="sigmoid",
        )(features)
outputs = layers.Dense(units=1)(features)
bnn_model = keras.Model(inputs=inputs, outputs=outputs)

现在我编译:

mse_loss = keras.losses.MeanSquaredError()
bnn_model.compile(
        optimizer=keras.optimizers.Adam(learning_rate=0.001),
        loss=mse_loss,
        metrics=[keras.metrics.RootMeanSquaredError()],
        )

最后我尝试像这样使用

model.fit()
函数:

bnn_model.fit(train_dataset, validation_data=test_dataset, epochs = 100)

但这给了我以下错误:

ValueError: Target data is missing. Your model was compiled with loss=<keras.losses.MeanSquaredError object at 0x0000020A67D56610>, and therefore expects target data to be provided in `fit()`.

我尝试在网上搜索,但对我来说仍然没有意义。我怀疑这与我构建数据集的方式有关,但我不确定如何。如果我需要提供更多信息,请告诉我,感谢您的帮助!

python tensorflow keras deep-learning
1个回答
0
投票

fit() 方法签名读取

fit(
    x=None,
    y=None,
    batch_size=None,
    epochs=1,
    verbose='auto',
    callbacks=None,
    validation_split=0.0,
    validation_data=None,
    shuffle=True,
    class_weight=None,
    sample_weight=None,
    initial_epoch=0,
    steps_per_epoch=None,
    validation_steps=None,
    validation_batch_size=None,
    validation_freq=1,
    max_queue_size=10,
    workers=1,
    use_multiprocessing=False
)

参考文档

您需要做的就是将输入数据拆分为 X(输入)和 y(目标)。

所以

bnn_model.fit(train_dataset[:,:-1],train_dataset[:,-1],validation_data=(test_dataset[:,:-1],test_dataset[:,-1]), epochs = 100)

应该适合你

编辑

在 AlexK 发表评论后,我意识到我遗漏了一些重要信息。在上面的示例中,我假设标签或目标是数据中的最后一列。如果不是这种情况,则必须通过拼接选择正确的列。

© www.soinside.com 2019 - 2024. All rights reserved.