神经网络精度优化


问题内容

我在喀拉拉邦构造了一个ANN,它具有1个输入层(3个输入),一个输出层(1个输出)和两个分别具有12和3个节点的隐藏层。

在此处输入图片说明

我构建和训练网络的方式是:

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文件如下所示:

在此处输入图片说明

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

我的问题是:我如何修改我的神经网络以获得更高的准确性?


问题答案:

尼尔·斯莱特(Neil Slater)已经提供了一长串有用的一般建议。

在您的特定示例中,规范化很重要。如果将以下行添加到代码中

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

即使使用更简单的网络结构,您的玩具数据也将获得100%的准确性。没有规范化,优化器将无法工作。