2016-09-16 76 views
3

我已经在keras中构建了一个ANN,它有1个输入层(3个输入),1个输出层(1个输出)和2个分别具有12个和3个节点的隐藏层。神经网络准确性优化

enter image description here

我构建和培养我的网络的方式是:

from keras.models import Sequential 
from keras.layers import Dense 
from sklearn.cross_validation import train_test_split 
import numpy 
# fix random seed for reproducibility 
seed = 7 
numpy.random.seed(seed) 

dataset = numpy.loadtxt("sorted output.csv", delimiter=",") 
# split into input (X) and output (Y) variables 
X = dataset[:,0:3] 
Y = dataset[:,3] 
# split into 67% for train and 33% for test 
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed) 
# create model 
model = Sequential() 
model.add(Dense(12, input_dim=3, init='uniform', activation='relu')) 
model.add(Dense(3, init='uniform', activation='relu')) 
model.add(Dense(1, init='uniform', activation='sigmoid')) 
# Compile model 
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 
# Fit the model 
model.fit(X_train, y_train, validation_data=(X_test,y_test), nb_epoch=150, batch_size=10) 

排序输出CSV文件看起来像:

enter image description here

所以后150个时代,我得到:损失:0.6932 - acc:0.5000 - val_loss:0.6970 - val_acc:0.1429

我的问题是:我如何修改我的NN以获得更高的准确性?

回答

3

Neil Slater已经提供了很多有用的一般性建议。

在您的具体实例中,规范化是重要的。如果添加以下几行代码

... 
X = dataset[:,0:3] 
from sklearn.preprocessing import StandardScaler 
scaler = StandardScaler() 
X = scaler.fit_transform(X) 

你会得到你的玩具数据100%的准确度,甚至更简单的网络结构。没有规范化,优化器将无法工作。

+0

我收到一个错误:No module named preprocessig – Adriano10

+0

@ Adriano10:答案缺少'n',试着从sklearn.preprocessing导入StandardScaler' –

+0

@NeilSlater:谢谢,纠正了错字 – Tobias

5

你可以尝试以下的事情。我粗略地按重要性顺序写入这一点 - 即为了我想尝试的东西来解决准确性问题,您看到:

  1. 规范化输入数据。通常你会采用训练数据的平均值和标准差,并用它们来抵消+缩放所有进一步的输入。这里有一个standard normalising function in sklearn。请记住以相同的方式处理您的测试数据(使用训练数据的平均值和标准偏差,而不是重新计算)

  2. 训练更多的时代。对于少量特征和有限训练集大小的问题,在网络收敛之前,您经常需要运行数千个时代。您应该绘制训练和验证损失值,以查看网络是否仍在学习,或者尽可能最佳地收敛。

  3. 对于您的简单数据,我会避免relu激活。你可能听说他们是某种“最好的”,但是像大多数NN选项一样,他们有很好的问题类型,有些问题他们不是最好的选择。我认为你的问题隐藏层的tanh或sigmoid激活会更好。保存非常深的网络和/或图像/音频的卷积问题。

  4. 使用更多培训数据。不清楚你喂食它多少,但神经网络在大量训练数据中效果最好。

  5. 假设您已经有很多训练数据 - 增加隐藏层的大小。更复杂的关系需要更多隐藏的神经元(有时更多层)以使NN能够表达决策表面的“形状”。 Here is a handy browser-based network allowing you to play with that idea and get a feel for it

  6. 在隐藏图层后添加一个或多个dropout layers或添加其他正则化。网络可能过于合适(尽管训练准确性为0.5,我怀疑它不是)。与relu不同的是,使用dropout几乎可以解决更严格的NN问题 - 在很多情况下它可以提高泛化能力。少量退出(〜0.2)可能有助于解决您的问题,但像大多数超参数一样,您需要搜索最佳值。

最后,你想找到的关系总是有可能让你从X预测Y并不是真的存在。在这种情况下,从神经网络获得的正确结果并不比猜测Y好。

+0

我试图增加训练数据,但我注意到当我增加它的准确性下降。为何会发生这种情况? – Adriano10

+0

@ Adriano10:如果没有深入介入这个问题,实在不可能说。然而,这可能是随机波动(准确率<50%很可能是其他地方首先破损)。我按照我会尝试的方式编写答案。所以你应该先看看规范化 - 你输入的那些高正数会阻止任何NN正常工作。 –

+0

非常感谢!这个答案很棒!如果你不介意,我有一个相关的问题。不过,我相信这是另一个问题的原因。关于第二种选择,你能否澄清我们如何看待网络融合还是仍然在学习? –