我试图用 Python 和 Tensorflow 2a 创建一个 RNN,但我真的不确定我做了什么......预测结果是常数。您如何看待数据准备?
### Create the data ###
training_data = [[1,2], [4,5], [7,8]...] # here, input_size = 2
training_targets = [3, 6, 9...]
predict_data = [[9,10], [12,13], [15,16]...] # predictions should be [11, 14, 17...]
### Imports ###
import numpy as np
import tensorflow as tf
from tensorflow.python import keras as tfk
### Parameters ###
batch_size = 8
time_steps = 64
### Create the model ###
model = tfk.Sequential()
model.add(tfk.layers.Bidirectional(tfk.layers.LSTM(128, return_sequences=True, input_shape=(time_steps, input_size))))
model.add(tfk.layers.Bidirectional(tfk.layers.LSTM(64, return_sequences=True)))
model.add(tfk.layers.Dropout(rate=0.05))
model.add(tfk.layers.Dense(32, activation='relu'))
model.add(tfk.layers.Dense(1, activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
### Create the training dataset ###
# Separate data in time steps
data = np.array([training_data[i: i + time_steps] for i in range(len(training_data) - time_steps)])
targets = np.array([training_targets[i: i + time_steps] for i in range(len(training_argets) - time_steps)])
# Create the tensors and dataset
data = tf.convert_to_tensor(data)
targets = tf.convert_to_tensor(targets)
dataset = tf.data.Dataset.from_tensor_slices((data, targets))
# Batch data, the data shape is : (batch_size, time_steps, input_size)
dataset = dataset.batch(batch_size)
### Train the model ###
model.fit(dataset, epochs=10, validation_data=validation_dataset, shuffle=False)
### Create the predict data ###
data = np.array([predict_data[i: i + time_steps] for i in range(len(predict_data) - time_steps)])
data = tf.convert_to_tensor(data)
### Try the model ###
results = model.predict(data, steps=time_steps)
预测应该是 [11, 14, 17 ...] 但它就像是恒定的,而且形状很奇怪:
[
[[1], [1], [1], [1] ...],
[[1], [1], [1], [1] ...],
...
]
谢谢你的帮助!
最后一层只有一个神经元。想想看。你的网络所能做的就是返回一个数字,但这个数字毫无意义,因为对于你的所有训练数据,它永远不知道你想要它做什么。问题是当它更适合作为回归问题时,您将其视为分类问题。取出最后一层的softmax,使用MSE作为损失度量。
此外,似乎只有 2 个时间步,但您的代码暗示有 64 个。这对我来说没有意义。
另外,你在哪里定义'input_size'。它不包含在上面的代码中。
多考虑一下这个问题,做出这些改变,希望它会奏效。我会尝试自己运行它,但我不想对您的训练数据和目标做出假设。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句