我对神经网络/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()`.
我尝试在网上搜索,但对我来说仍然没有意义。我怀疑这与我构建数据集的方式有关,但我不确定如何。如果我需要提供更多信息,请告诉我,感谢您的帮助!
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 发表评论后,我意识到我遗漏了一些重要信息。在上面的示例中,我假设标签或目标是数据中的最后一列。如果不是这种情况,则必须通过拼接选择正确的列。