首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在keras多变量神经网络中获取nan训练成本

在keras多变量神经网络中获取nan训练成本
EN

Stack Overflow用户
提问于 2018-08-04 02:26:44
回答 1查看 54关注 0票数 0

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

代码语言:javascript
复制
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)

每次我运行这个命令都会得到如下输出

代码语言:javascript
复制
Training--------
train cost:  6670.4097
train cost:  nan
train cost:  nan
train cost:  nan
train cost:  nan

第一次培训的成本通常在2,000- 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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-04 02:51:43

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

不需要扩展:

代码语言:javascript
复制
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)

以输出形式给出:

代码语言:javascript
复制
Training--------
train cost:  6834.277
train cost:  nan
train cost:  nan
train cost:  nan
train cost:  nan

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

代码语言:javascript
复制
features = pd.DataFrame(np.random.rand(1000, 6), dtype=np.float64)

这是输出:

代码语言:javascript
复制
Training--------
train cost:  1.1240386
train cost:  0.09793612
train cost:  0.08868038
train cost:  0.084703445
train cost:  0.0826226

您可以从scikit StandardScaler -learn to scale your data查看一下。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51678213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档