【问题标题】:Zero accuracy training a neural network in Keras在 Keras 中训练神经网络的零精度
【发布时间】:2017-06-08 17:40:39
【问题描述】:

我在 Keras 中训练了一个回归问题的神经网络。 为什么输出只有一维,每个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 [=============================>.] - ETA:0s - 损失:0.0055 - acc:0.0000 e+00

199000/199873 [============================>.] - ETA:0s - 损失:0.0055 - acc:0.0000 e+00

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

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]]

【问题讨论】:

    标签: python-3.x


    【解决方案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'))
    

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

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

    如果要实现这样的模型,请

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

    例如,

    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'))
    

    【讨论】:

    • 谢谢您的答案,但它仍然显示ACC:0.0000E + 00。 span>
    【解决方案2】:

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

    要么摆脱作为指标的准确度并切换到完全回归,要么将您的问题变成分类问题,使用 loss='categorical_crossentropy'activation='softmax'

    这和你的问题类似:Link

    更多信息请见:StackExchange

    【讨论】:

    • 我在同样的情况下使用 loss = 'mean_squared_error' 但仍然有同样的情况。丢失在变化,而准确度停留在 0。
    【解决方案3】:

    只是对已发布的优秀答案的快速补充。

    以下 sn-p 是一个自定义指标,将显示您的 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])
    

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题,在尝试了所有建议但都没有奏效后,我认为其他地方一定有问题。

      查看我的数据分布后,我意识到我并没有打乱我的数据。所以我的训练数据是一个类的大部分,而我的测试数据是 100% 的另一个类。数据打乱后,准确率不再是0.0000e+00,而是更有意义的东西。

      【讨论】:

      • 你是如何洗牌的?我对此有点陌生,而且我得到了同样的准确度分数。
      【解决方案5】:

      您的模型可能存在一些问题,请检查并修复

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

      【讨论】:

        猜你喜欢
        • 2020-06-07
        • 2020-05-07
        • 2023-01-01
        • 2017-11-27
        • 1970-01-01
        • 2019-12-17
        • 2011-04-07
        • 1970-01-01
        • 2019-10-12
        相关资源
        最近更新 更多