【问题标题】:Getting nan training cost in keras multivariate NN在 keras 多元神经网络中获得 nan 培训成本
【发布时间】:2018-08-03 18:26:44
【问题描述】:

我正在训练一个神经网络,使其具有 6 个输入和 2 个输出。我正在使用带有 Tensorflow 后端的 Keras。预处理后,这是我的代码:

training_examples = features.head(2584)
training_targets = targets.head(2584)

validation_examples = features.tail(650)
validation_targets = targets.tail(650)

model = Sequential()
model.add(Dense(12, input_dim=6))
model.add(Dense(8))
model.add(Dense(8))
model.add(Dense(2))
model.compile(loss='mse', optimizer='sgd')
print("Training--------")
for step in range(500):
  cost = model.train_on_batch(training_examples, training_targets)
  if step % 100 == 0:
    print('train cost: ', cost)

每次我运行它都会产生类似的输出

Training--------
train cost:  6670.4097
train cost:  nan
train cost:  nan
train cost:  nan
train cost:  nan

第一次训练成本通常在 2000 到 14000 之间变化。特征和目标在数值上都小于 100。我不确定为什么会这样。

编辑:我添加了features.info()targets.info() 来检查空值,数据框中没有空值。

<class 'pandas.core.frame.DataFrame'> Int64Index: 3231 entries, 0 to 3230 Data columns (total 6 columns): TBRG_Rain_infield 3231 non-null float64 numRange_infield 3231 non-null float64 Air_T_edge 3231 non-null float64 RH_edge 3231 non-null float64 TBRG_Rain_edge 3231 non-null float64 numRange_edge 3231 non-null float64 dtypes: float64(6) memory usage: 176.7 KB <class 'pandas.core.frame.DataFrame'> Int64Index: 3231 entries, 0 to 3230 Data columns (total 2 columns): Air_T 3231 non-null float64 RH 3231 non-null float64 dtypes: float64(2) memory usage: 75.7 KB

【问题讨论】:

  • 您的示例是熊猫数据框吗?你在那里检查过任何 NaN 吗?
  • 我的例子是数据框。 featurestargets 中没有 NaN

标签: python pandas tensorflow keras


【解决方案1】:

您的数据框看起来是正确的,但您可能应该将输入特征缩放到 0 和 1 之间,或者具有均值 0 和单位方差。我试图重现你的例子,一次有缩放,一次没有缩放。

没有缩放:

from keras.models import Sequential
from keras.layers import Dense
import pandas as pd
import numpy as np

features = pd.DataFrame(np.random.randint(0, 100, size=(1000, 6)).astype(float))
targets = pd.DataFrame(np.random.rand(1000, 2), dtype=np.float64)

training_examples = features.head(100)  
training_targets = targets.tail(100)

model = Sequential()
model.add(Dense(12, input_dim=6))
model.add(Dense(8))
model.add(Dense(8))
model.add(Dense(2))
model.compile(loss='mse', optimizer='sgd')
print("Training--------")
for step in range(500):
    cost = model.train_on_batch(training_examples, training_targets)
    if step % 100 == 0:
        print('train cost: ', cost)

作为输出:

Training--------
train cost:  6834.277
train cost:  nan
train cost:  nan
train cost:  nan
train cost:  nan

如果我将特征初始化为介于 0 和 1 之间:

features = pd.DataFrame(np.random.rand(1000, 6), dtype=np.float64)

这是输出:

Training--------
train cost:  1.1240386
train cost:  0.09793612
train cost:  0.08868038
train cost:  0.084703445
train cost:  0.0826226

您可以查看来自 scikit-learn 的 StandardScaler 来扩展您的数据。

【讨论】:

  • 感谢您的回答!我现在正在研究 StandardScaler
  • 那行得通。但是,我如何将这些值重新缩放以获得应该的真实预测?
  • StandardScaler 有一个inverse_transform 方法。见here :)
猜你喜欢
  • 2018-05-10
  • 2019-12-17
  • 1970-01-01
  • 2017-12-05
  • 2020-10-17
  • 2017-06-08
  • 2017-11-27
  • 2018-08-04
  • 2016-10-10
相关资源
最近更新 更多