神经网络精度优化

时间:2016-09-16 06:51:05

标签: python neural-network theano keras

我在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以获得更高的准确度?

2 个答案:

答案 0 :(得分:5)

您可以尝试以下方法。我大致按重要性顺序写了这个 - 也就是说我会尝试修复你看到的准确性问题的顺序:

  1. 规范化您的输入数据。通常,您将获取训练数据的平均值和标准差,并使用它们来偏移+缩放所有其他输入。这有一个standard normalising function in sklearn。请记住以相同的方式处理您的测试数据(使用训练数据中的mean和std,而不是重新计算)

  2. 培养更多时代。对于少量功能和有限训练集大小的问题,您通常必须在网络收敛之前运行数千个时期。您应该绘制训练和验证损失值,以查看网络是否仍在学习,或者尽可能地融合。

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

  4. 使用更多培训数据。不清楚你喂多少钱,但NN最适合大量的训练数据。

  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)可能有助于解决您的问题,但与大多数超参数一样,您需要搜索最佳值。

  7. 最后,您想要找到的允许您从X预测Y的关系总是可能不存在。在这种情况下,NN的正确结果并不比猜测Y更好。

答案 1 :(得分:3)

Neil Slater已经提供了一长串有用的一般建议。

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

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

即使网络结构更简单,您的玩具数据也能100%准确。如果没有规范化,优化器就无法工作。