零精度训练在Keras的神经网络

时间:2017-01-24 03:18:28

标签: python-3.x

我在Keras训练回归问题的神经网络。 为什么输出只有一个Dimension,每个Epoch的精度始终显示为acc:0.0000e + 00?

像这样:

1000/199873 [..............................] - ETA:5s - 损失:0.0057 - acc:0.0000 E + 00

2000/199873 [..............................] - ETA:4s - 损失:0.0058 - acc:0.0000 E + 00

3000/199873 [..............................] - ETA:3s - 损失:0.0057 - acc:0.0000 E + 00

4000/199873 [..............................] - ETA:3s - 损失:0.0060 - acc: 0.0000E + 00 ...

198000/199873 [============================&gt ;.] - ETA:0s - 损失:0.0055 - acc: 0.0000E + 00

199000/199873 [============================&gt ;.] - ETA:0s - 损失:0.0055 - acc: 0.0000E + 00

199873/199873 [==============================] - 4s - 损失:0.0055 - acc:0.0000e + 00 - val_loss:0.0180 - val_acc:0.0000e + 00

Epoch 50/50

但如果输出是二维或更高,则准确性没有问题。

我的模型如下:`

input_dim = 14
batch_size = 1000
nb_epoch = 50
lrelu = LeakyReLU(alpha = 0.1)

model = Sequential()
model.add(Dense(126, input_dim=input_dim)) #Dense(output_dim(also hidden wight), input_dim = input_dim)
model.add(lrelu) #Activation

model.add(Dense(252))
model.add(lrelu)
model.add(Dense(1))
model.add(Activation('linear'))

model.compile(loss= 'mean_squared_error', optimizer='Adam', metrics=['accuracy'])
model.summary()
history = model.fit(X_train_1, y_train_1[:,0:1],
                    batch_size=batch_size,
                    nb_epoch=nb_epoch,
                    verbose=1,
                    validation_split=0.2)

loss = history.history.get('loss')
acc = history.history.get('acc')
val_loss = history.history.get('val_loss')
val_acc = history.history.get('val_acc')

'''saving model'''
from keras.models import load_model
model.save('XXXXX')
del model

'''loading model'''
model = load_model('XXXXX')

'''prediction'''
pred = model.predict(X_train_1, batch_size, verbose=1)
ans = [np.argmax(r) for r in y_train_1[:,0:1]]

5 个答案:

答案 0 :(得分:8)

问题是您的最终模型输出具有线性激活,使模型成为回归,而不是分类问题。当模型根据类正确地对数据进行分类时,定义“准确度”,但由于其连续属性,“准确性”实际上没有为回归问题定义。

使用loss='categorical_crossentropy'activation='softmax',将精确度作为度量标准去除并切换到完全回归,或将问题转化为分类问题。

这与您的问题类似:Link

有关详细信息,请参阅:StackExchange

答案 1 :(得分:1)

我不确定你的问题是什么,但你的模型对我来说有点奇怪。

这是你的模特:

lrelu = LeakyReLU(alpha = 0.1)
model = Sequential()
model.add(Dense(126, input_dim=15)) #Dense(output_dim(also hidden wight), input_dim = input_dim)
model.add(lrelu) #Activation

model.add(Dense(252))
model.add(lrelu)
model.add(Dense(1))
model.add(Activation('linear'))

,模型的可视化如下所示:

enter image description here

有两个层可以作为模型的输出层,您没有决定哪一个是您的实际输出层。我想这就是你无法做出正确预测的原因。

如果你想像这样实现你的模型,

enter image description here

您应该独立添加激活层,而不是使用相同的激活层。

例如,

model = Sequential()
model.add(Dense(126, input_dim=15)) #Dense(output_dim(also hidden wight), input_dim = input_dim)
model.add(LeakyReLU(alpha = 0.1)) #Activation

model.add(Dense(252))
model.add(LeakyReLU(alpha = 0.1))
model.add(Dense(1))
model.add(Activation('linear'))

答案 2 :(得分:1)

只是已发布的出色答案的快速补充。

以下代码段是一个自定义指标,将显示您的NN预测值与实际值之间的平均百分比差异。

def percentage_difference(y_true, y_pred):
    return K.mean(abs(y_pred/y_true - 1) * 100)

要将其实施到指标中,只需将其添加到模型编译中的“指标”选项中即可。即

model.compile(loss= 'mean_squared_error', 
optimizer='Adam', metrics=['accuracy',percentage_difference])

答案 3 :(得分:1)

在尝试了所有建议之后,我都遇到了类似的问题,但这些建议都没有起作用,我发现其他地方肯定有问题。

查看数据分布后,我意识到我没有在整理数据。因此,我的培训数据是一堂课的大部分,而我的测试数据是另一堂课的100%。整理数据后,精度不再是0.0000e + 00,这更有意义。

答案 4 :(得分:0)

模型可能很少有问题,请检查并修复

  1. 检查您的batch_size是否太大
  2. 检查学习率是太高还是太低
  3. 如果是文本数据集,请检查句子的长度,如果太大,则以平均长度进行修剪
  4. 检查数据集中是否存在NaN值,并进行修正
  5. 检查数据集是否不包含特殊符号或字符
  6. 如果值是连续的,则在将其发送到网络之前对其进行归一化(检查批量归一化)
  7. 尝试正则化技术
  8. 检查激活功能
  9. 随机播放数据