使用Tensorflow 2创建RNN

时间:2019-05-08 08:15:24

标签: python tensorflow

我正在尝试使用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] ...],
...
]

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

最后一层中只有一个神经元。想一想。您的网络所能做的就是返回一个数字,但是这个数字是没有意义的,因为对于您的所有训练数据,它永远都不知道您想做什么。问题是当您更适合将其作为回归问题时,您会将其归为分类问题。取出最后一层的softmax,并使用MSE作为损耗指标。

此外,似乎只有2个时间步长,但是您的代码暗示有64个时间步长。这对我来说没有意义。

此外,您在哪里定义“ input_size”。上面的代码中没有包含它。

请多考虑一些问题,进行更改,并希望它会起作用。我会尝试自己运行它,但是我不想对您的训练数据和目标做出假设。