这是我为形状(7000,2,200)的LSTM准备的数据X_train
[[[0.500858 0. 0.5074856 ... 1. 0.4911533 0. ]
[0.4897923 0. 0.48860878 ... 0. 0.49446714 1. ]]
[[0.52411383 0. 0.52482396 ... 0. 0.48860878 1. ]
[0.4899698 0. 0.48819458 ... 1. 0.4968341 1. ]]
...
[[0.6124623 1. 0.6118705 ... 1. 0.6328777 0. ]
[0.6320492 0. 0.63512635 ... 1. 0.6960175 0. ]]
[[0.6118113 1. 0.6126989 ... 0. 0.63512635 1. ]
[0.63530385 1. 0.63595474 ... 1. 0.69808865 0. ]]]
我创建了我的序列模型
model = Sequential()
model.add(LSTM(units = 50, activation = 'relu', input_shape = (X_train.shape[1], 200)))
model.add(Dropout(0.2))
model.add(Dense(1, activation = 'linear'))
model.compile(loss = 'mean_squared_error', optimizer = 'adam')
然后我拟合我的模型:
history = model.fit(
X_train,
Y_train,
epochs = 20,
batch_size = 200,
validation_data = (X_test, Y_test),
verbose = 1,
shuffle = False,
)
model.summary()
最后我可以看到这样的东西:
Layer (type) Output Shape Param #
=================================================================
lstm_16 (LSTM) (None, 2, 50) 50200
dropout_10 (Dropout) (None, 2, 50) 0
dense_10 (Dense) (None, 2, 1) 51
为什么说输出形状的第一个元素是None
值?是不是有问题?或者应该是这样的?它改变了什么?怎么改变?
我将感激任何帮助,谢谢!
1条答案
按热度按时间djmepvbi1#
TensorFlow中的第一个值始终保留给
batch-size
。您的模型事先并不知道您的batch-size
是多少,因此将其设置为None。如果我们进一步讨论细节,假设您的数据集为1000个样本,而您的**batch-size
为32。因此,1000/32将变为31.25**。如果我们只取下限值,即31。那么,总共将有31个批次,大小为32。但如果您看这里,数据集的总样本大小为1000,但您有31个批次,大小为32,即32 * 31 = 992,其中1000 - 992 = 8,这意味着还将有一批大小为8的产品。但模型事先不知道,那么它会做什么?它在内存中保留了一个空间,在该空间中它不为它定义特定的形状,换句话说,内存对于**batch-size
是动态的。因此,您将在此处看到它None**。因此,模型事先不知道我的batch-size的形状,因此将其设置为None,以便稍后在计算第一个时期时知道它,即计算所有批次。无法更改None值,因为它在Tensorflow中是Dynamic,模型知道它并在您的模型完成其第一个时期时修复它。请始终将其后面的形状设置为**
(2, 200)
。7000是您的模特的样本总数,因此模特事先不知道您的批次是多少-size**,另一个大问题是,大多数情况下,您的batch-size不能被您的数据集中的样本总数整除,因此,模型必须将其设置为None,以便在第一个时期计算所有批次时了解它。