3 回答

TA贡献1829条经验 获得超13个赞
好吧,我认为@blue-phoenox 的答案中建议的规范化方案是有缺陷的。那是因为你永远不应该独立地标准化测试数据(即使用不同的统计数据)。相反,您应该使用在训练数据标准化期间计算的统计数据来标准化测试数据。所以它必须是这样的:
mms = preprocessing.MinMaxScaler()
X_train = mms.fit_transform(X_train)
X_test = mms.transform(X_test) # you should not use fit_transform
这是有道理的,因为考虑以下场景,您已经训练了模型并将其部署到生产中以供实际使用。现在,用户使用一个新样本来喂食它。您需要首先标准化这个新样本,但如何标准化?您不能单独缩放其值,因为它只是一个样本(即,如果使用最小-最大缩放器,则所有这些值将为1或0)。相反,您将使用(在使用 min-max 缩放器的情况下)在训练数据上计算的“min”和“max”值来规范化这个新的测试数据。
这在图像模型中很常见,如下所示:
X_train /= 255.
X_test /= 255.
注意,我们将训练数据和测试数据除以相同的数字(即255)。或更复杂的标准化方案:
X_mean = X_train.mean(axis=0)
X_std = X_train.std(axis=0)
X_train -= X_mean
X_train /= X_std + 1e-8 # add a small constant to prevent division by zero
# Now to normalize test data we use the same X_mean and X_std already computed
X_test -= X_mean
X_test /= X_std + 1e-8
旁注(正如我在评论中提到的):如果您在 GPU 上运行训练,那么您可以考虑使用CuDNNGRU代替GRU(或CuDNNLSTM代替LSTM),因为它专门针对 GPU 进行了优化并加快了训练过程。
添加回答
举报