在keras中使用动态输入形状

时间:2020-06-06 20:26:16

标签: python tensorflow keras deep-learning lstm

我正在处理一些包含某些功能的数据,这些数据会持续几天,并且每个数据的数组形状如下:
(number of days, 1, number of features)

每个这些数据中的特征数量都不相同。
我想将这些数据分别提供给我的lstm模型。因此,我想以一种动态的输入形状来实现模型。

我使用了以下代码:

model = Sequential()
model.add(LSTM(4, return_sequences=True, input_shape=(1, None)))
model.add(LSTM(256, dropout=0.2,recurrent_dropout=0.2, return_sequences=True))
model.add(LSTM(256, dropout=0.2,recurrent_dropout=0.2, return_sequences=True))
model.add(LSTM(128, dropout=0.2,recurrent_dropout=0.2, return_sequences=True))
model.add(LSTM(128))
model.add(Dense(1, activation='sigmoid'))

model.compile (
    loss='mean_squared_error',
    optimizer=keras.optimizers.Adam(0.001)
)

第一层中的None用于功能数量。但是,当我开始在(X_train和y_train)上拟合模型时,我在该层收到此错误:

TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

我正在使用tensorflow版本'2.3.0-tf'

您能帮我解决此错误吗?

1 个答案:

答案 0 :(得分:1)

函数pad_sequences在这种情况下将很有用。

例如,Input Sequences具有不同数量的Features,如下所示:

sequences = [
    [1, 2, 3, 4],
       [1, 2, 3],
             [1]
    ]

我们可以使用Features制作所有长度相等的pad_sequences,如下所示:

padded = pad_sequences(sequences)

这将使Input Sequence

[[1 2 3 4]
 [0 1 2 3]
 [0 0 0 1]]

也就是说,它将用Features填充另一个Zeros,并使所有样本的Features的数量为4(其中最大数量)。

带有Padding的{​​{1}}可以在Zerosstart处通过调整参数'padding'来完成。有关此功能的更多详细信息,请参阅此Tensorflow Documentation

具有可变数量功能的完整工作代码如下所示:

end

以上代码的输出为:

from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
import tensorflow as tf
import numpy as np


# define sequences
sequences = [
    [1, 2, 3, 4],
       [1, 2, 3],
             [1]
    ]

# pad sequence
padded = pad_sequences(sequences)
print(padded)
X = np.expand_dims(padded, axis = 0)
print(X.shape) # (1, 3, 4)

y = np.array([1,0,1])
y = y.reshape(1,-1)
print(y.shape) # (1, 3)

model = Sequential()
model.add(LSTM(4, return_sequences=False, input_shape=(None, X.shape[2])))
model.add(Dense(1, activation='sigmoid'))

model.compile (
    loss='mean_squared_error',
    optimizer=tf.keras.optimizers.Adam(0.001))

model.fit(x = X, y = y)

希望这会有所帮助。学习愉快!