Python 在keras中使用动态输入形状

Python 在keras中使用动态输入形状,python,tensorflow,keras,deep-learning,lstm,Python,Tensorflow,Keras,Deep Learning,Lstm,我正在处理一些数据,这些数据包含一些连续几天的功能,每个数据的数组形状如下所示: (天数,1,功能数量) 每个数据中的要素数量不同。 我想分别将这些数据提供给我的lstm模型。所以我想以一种输入形状是动态的方式实现我的模型。 我使用了以下代码: model=Sequential() add(LSTM(4,返回_序列=True,输入_形状=(1,无))) model.add(LSTM(256,辍学=0.2,经常性辍学=0.2,返回序列=True)) model.add(LSTM(256,辍学

我正在处理一些数据,这些数据包含一些连续几天的功能,每个数据的数组形状如下所示:
(天数,1,功能数量)

每个数据中的要素数量不同。
我想分别将这些数据提供给我的lstm模型。所以我想以一种输入形状是动态的方式实现我的模型。

我使用了以下代码:

model=Sequential()
add(LSTM(4,返回_序列=True,输入_形状=(1,无)))
model.add(LSTM(256,辍学=0.2,经常性辍学=0.2,返回序列=True))
model.add(LSTM(256,辍学=0.2,经常性辍学=0.2,返回序列=True))
model.add(LSTM(128,dropout=0.2,returnal\u dropout=0.2,return\u sequences=True))
型号.添加(LSTM(128))
model.add(密集型(1,激活='sigmoid'))
model.compile(
损失=‘均方误差’,
优化器=keras.optimizers.Adam(0.001)
)
第一层中的
None
表示功能的数量。但是,当我开始在(X\u-train和y\u-train)上拟合模型时,该层会出现此错误:

TypeError:不支持+:'NoneType'和'int'的操作数类型

我使用的是tensorflow版本“2.3.0-tf”


你能帮我修复这个错误吗?

在这种情况下,
pad\u sequences
函数将很有用

例如,
输入序列
具有不同数量的
功能
,如下所示:

sequences = [
    [1, 2, 3, 4],
       [1, 2, 3],
             [1]
    ]
padded = pad_sequences(sequences)
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)
我们可以使用
pad_序列
使所有
功能
长度相等,如下所示:

sequences = [
    [1, 2, 3, 4],
       [1, 2, 3],
             [1]
    ]
padded = pad_sequences(sequences)
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)
这将使
输入序列

[[1 2 3 4]
 [0 1 2 3]
 [0 0 0 1]]
也就是说,它将用
填充其他
特征
,并将所有样本的
特征
数量设为4(其中最大)

通过调整参数“Padding”(填充),可以在
开始处或
结束处用
零填充
。有关此功能的更多详细信息,请参阅此

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

sequences = [
    [1, 2, 3, 4],
       [1, 2, 3],
             [1]
    ]
padded = pad_sequences(sequences)
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)
上述代码的输出为:

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

(1, 3, 4)

(1, 3)

1/1 [==============================] - 0s 1ms/step - loss: 0.2601

希望这有帮助。学习愉快

谢谢你的帮助,但我有个问题。当我们用零填充数组时,这个零不会影响模型的结果吗?在这种情况下,您可以使用
掩蔽
。有关更多详细信息,请参阅链接。