Adr*_*o10 3 python neural-network theano keras
我在keras中构建了一个ANN,它有1个输入层(3个输入),1个输出层(1个输出)和2个隐藏层,分别有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)
Run Code Online (Sandbox Code Playgroud)
排序输出csv文件如下所示:
所以在150个时代后我得到:损失:0.6932 - acc:0.5000 - val_loss:0.6970 - val_acc:0.1429
我的问题是:如何修改我的NN以获得更高的准确度?
您可以尝试以下方法.我大致按重要性顺序写了这个 - 也就是说我会尝试修复你看到的准确性问题的顺序:
规范化输入数据.通常,您将获取训练数据的平均值和标准差,并使用它们来偏移+缩放所有其他输入.为此,sklearn中有一个标准的规范化功能.记得以相同的方式处理您的测试数据(使用训练数据中的mean和std,而不是重新计算)
培养更多时代.对于少量功能和有限训练集大小的问题,您通常必须在网络收敛之前运行数千个时期.您应该绘制训练和验证损失值,以查看网络是否仍在学习,或者尽可能地融合.
对于您的简单数据,我会避免重新激活.您可能听说过他们在某种程度上"最好",但是像大多数NN选项一样,他们有很多类型的问题,他们运作良好,有些则不是最佳选择.我认为你会在隐藏层中为你的问题进行tanh或sigmoid激活会更好.保存relu用于非常深的网络和/或图像/音频的卷积问题.
使用更多培训数据.不清楚你喂了多少,但NN最适合大量的训练数据.
如果您已经拥有大量的训练数据 - 增加隐藏层的大小.更复杂的关系需要更多隐藏的神经元(有时更多的层),以使NN能够表达决策表面的"形状".这是一个方便的基于浏览器的网络,允许您玩这个想法,并感受它.
在隐藏层之后添加一个或多个dropout图层或添加一些其他正则化.网络可能过度拟合(虽然训练精度为0.5,我怀疑它不是).与relu不同,使用dropout非常接近解决NN问题的灵丹妙药 - 它在许多情况下改善了泛化.少量的丢失(~0.2)可能有助于解决您的问题,但与大多数超参数一样,您需要搜索最佳值.
最后,您想要找到的允许您从X预测Y的关系总是可能不存在.在这种情况下,从NN得到的正确结果并不比猜测Y更好.
| 归档时间: |
|
| 查看次数: |
1197 次 |
| 最近记录: |