【问题标题】:very low accuracy in Neural networks using keras and validation accuracy 0.0000e+00使用 keras 和验证准确度 0.0000e+00 的神经网络中的准确度非常低
【发布时间】:2018-04-23 07:31:46
【问题描述】:

下面是我正在使用的代码。请让我知道为什么我的验证和训练准确度如此之低? 验证准确度仅为 0.0000e+00,训练准确度约为 37%。 可能出了什么问题? 我的训练集有 10500 行和 172 列 我的测试集有 3150 行和 172 列 我的第一列是响应(类),因此我仅将其用作 Y,其余列用作 X。 我的回答是 3 类:默认、LF 和 RF

from __future__ import print_function
import numpy as np
import pandas
from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.optimizers import SGD
from keras.utils import np_utils
from sklearn.preprocessing import LabelEncoder
np.random.seed(1671)
NB_EPOCH = 5
BATCH_SIZE = 128
VERBOSE = 1
NB_CLASSES = 3
OPTIMIZER = SGD()
N_HIDDEN = 128
VALIDATION_SPLIT=0.1
RESHAPED = 171
dataframe_train = pandas.read_csv("TrainingEdgesToAction.csv", header=None)
dataset_train = dataframe_train.values
X_train = dataset_train[1:,1:172].astype(float)
#X_train = dataset_train[1:,0:172]
Y_train = dataset_train[1:,0]

dataframe_test = pandas.read_csv("TestingEdgesToAction.csv", header=None)
dataset_test = dataframe_test.values
X_test = dataset_test[1:,1:172].astype(float)
#X_test = dataset_test[1:,0:172]
Y_test = dataset_test[1:,0]

X_train = X_train.reshape(10500,RESHAPED)
X_test = X_test.reshape(3150,RESHAPED)
X_train /= 255
X_test /= 255
print(X_train.shape[0],'train samples')
print(X_test.shape[0],'test samples')

encoder = LabelEncoder()
encoder.fit(Y_train)
encoded_Y_train = encoder.transform(Y_train)
# convert integers to dummy variables (i.e. one hot encoded)
dummy_y_train = np_utils.to_categorical(encoded_Y_train)
print(dummy_y_train)

encoder = LabelEncoder()
encoder.fit(Y_test)
encoded_Y_test = encoder.transform(Y_test)
# convert integers to dummy variables (i.e. one hot encoded)
dummy_y_test = np_utils.to_categorical(encoded_Y_test)
print(dummy_y_test)

#Y_train = np_utils.to_categorical(Y_train,NB_CLASSES)
#Y_test = np_utils.to_categorical(Y_test, NB_CLASSES)

model = Sequential()
model.add(Dense(N_HIDDEN,input_shape=(RESHAPED,)))
model.add(Activation('relu'))
model.add(Dense(N_HIDDEN))
model.add(Activation('relu'))
model.add(Dense(NB_CLASSES))
model.add(Activation('softmax'))
model.summary()
model.compile(loss='categorical_crossentropy',optimizer=OPTIMIZER,metrics=
['accuracy'])
history = model.fit(X_train,dummy_y_train,batch_size=BATCH_SIZE,epochs=NB_EPOCH,shuffle=True,verbose=VERBOSE,validation_split=VALIDATION_SPLIT)
score = model.evaluate(X_test,dummy_y_test,verbose=VERBOSE)

print("\nTest score:",score[0])
print("Test accuracy:",score[1])

10500 train samples
3150 test samples
[[ 1.  0.  0.]
[ 1.  0.  0.]
[ 1.  0.  0.]
..., 
[ 0.  0.  1.]
[ 0.  0.  1.]
[ 0.  0.  1.]]
[[ 1.  0.  0.]
[ 1.  0.  0.]
[ 1.  0.  0.]
..., 
[ 0.  0.  1.]
[ 0.  0.  1.]
[ 0.  0.  1.]]
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_49 (Dense)             (None, 128)               22016     
_________________________________________________________________
activation_49 (Activation)   (None, 128)               0         
_________________________________________________________________
dense_50 (Dense)             (None, 128)               16512     
_________________________________________________________________
activation_50 (Activation)   (None, 128)               0         
_________________________________________________________________
dense_51 (Dense)             (None, 3)                 387       
_________________________________________________________________
activation_51 (Activation)   (None, 3)                 0         
=================================================================
Total params: 38,915
Trainable params: 38,915
Non-trainable params: 0
_________________________________________________________________
Train on 9450 samples, validate on 1050 samples
Epoch 1/5
9450/9450 [==============================] - 2s - loss: 1.0944 - acc: 0.3618 
- val_loss: 1.1809 - val_acc: 0.0000e+00
Epoch 2/5
9450/9450 [==============================] - 1s - loss: 1.0895 - acc: 0.3704 
- val_loss: 1.2344 - val_acc: 0.0000e+00
Epoch 3/5
9450/9450 [==============================] - 0s - loss: 1.0874 - acc: 0.3704 
- val_loss: 1.2706 - val_acc: 0.0000e+00
Epoch 4/5
9450/9450 [==============================] - 0s - loss: 1.0864 - acc: 0.3878 
- val_loss: 1.2955 - val_acc: 0.0000e+00
Epoch 5/5
9450/9450 [==============================] - 0s - loss: 1.0860 - acc: 0.3761 
- val_loss: 1.3119 - val_acc: 0.0000e+00
2848/3150 [==========================>...] - ETA: 0s
Test score: 1.10844093784
Test accuracy: 0.333333333333

【问题讨论】:

  • 您是否尝试过训练超过 5 个 epoch? 5 epochs 对于训练一个深度网络来说是非常少的,我想说这甚至不足以看到训练精度是否显着提高
  • 尝试“nadam”优化器,将 N_HIDDEN 降低到大约 64
  • @gionni :是的,我尝试了多达 200 个 epoch :(
  • @Paddy:我减少了 N_HIDDEN,训练准确率提高到 83.33%,测试准确率提高到 66.66%。然而,验证准确度仍然显示旧的非常低的值。
  • 所以你得到了令人印象深刻的改进!我还建议您添加 BatchNormalization 或 Dropout 层。 + 尝试使用模型的架构。如果对你有帮助,我会写一个答案。

标签: python-3.x neural-network keras


【解决方案1】:

我决定总结一下我们的“聊天”。

所以,如果您的测试准确率较低(大约 ≈ 0.1%)该怎么办,这里有一些一般性建议:

  • 根据我的经验尝试不同的优化器,Adam 是一个很好的起点。
  • 尝试不同的激活函数;我建议你从“relu”开始,同时尝试“selu”和“elu”。
  • 添加正则化。 Dropout 和 BatchNormalization 可能会提高您的测试准确性。
  • 给您的网络一些时间,训练它更长的时间。
  • 玩转超参数,例如层数、批量大小、时期数、学习率等...
  • 最后,始终规范化您的数据,然后再将其提供给 NN。

【讨论】:

  • 哇。我刚刚添加了一个 BatchNormalization 层,它给我的结果是疯狂的。没有它,我得到了 ~0.0285 的准确度,在添加它之后,我在一个时期内得到了 ~0.5。
  • 你规范化你的数据了吗?
【解决方案2】:

所以对我来说,我一直在寻找一个指标来查看我的回归模型的表现,对我来说,使用 R² 作为我的主要指标时效果最好。 R² 可以描述模型在进行预测方面有多“好”。正如@Paddy 已经提到的,您需要给模型一些时间。在您的情况下至少有 30 个时期。所以现在什么时候:

R² = 0 意味着模型总是无法预测正确的目标变量 R² = 1 意味着模型完美地预测了目标变量。

在代码中它看起来像这样:

def det_coeff(y_true, y_pred):
u = K.sum(K.square(y_true - y_pred))
v = K.sum(K.square(y_true - K.mean(y_true)))
return K.ones_like(v) - (u / v)

这是确定指标的函数。

model.compile(optimizer="SGD", loss="mse", metrics=[det_coeff])

【讨论】:

    【解决方案3】:

    我遇到了类似的问题。请尝试打乱您的数据,这样可以解决您的问题。

    from sklearn.utils import shuffle
    Xtrain, ytrain = shuffle(Xtrain, ytrain)
    

    【讨论】:

      猜你喜欢
      • 2020-08-22
      • 2017-07-05
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 2020-12-01
      相关资源
      最近更新 更多