Keras LSTM无值输出形状

xvw2m8pv  于 2023-02-08  发布在  其他
关注(0)|答案(1)|浏览(155)

这是我为形状(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值?是不是有问题?或者应该是这样的?它改变了什么?怎么改变?
我将感激任何帮助,谢谢!

djmepvbi

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,以便在第一个时期计算所有批次时了解它。

相关问题