我试图了解如何实现神经网络。所以我制作了自己的数据集。 Xtrain是numpy.random浮动。 Ytrain是标志(罪(1 / x ^ 3)。 尝试实现神经网络给了我很差的结果。 30%的准确率。有100棵树的随机森林占97%。但我听说NN可以近似任何功能。我的理解有什么问题?
import numpy as np
import keras
import math
from sklearn.ensemble import RandomForestClassifier as RF
train = np.random.rand(100000)
test = np.random.rand(100000)
def g(x):
if math.sin(2*3.14*x) > 0:
if math.cos(2*3.14*x) > 0:
return 0
else:
return 1
else:
if math.cos(2*3.14*x) > 0:
return 2
else:
return 3
def f(x):
x = (1/x) ** 3
res = [0, 0, 0, 0]
res[g(x)] = 1
return res
ytrain = np.array([f(x) for x in train])
ytest = np.array([f(x) for x in test])
train = np.array([[x] for x in train])
test = np.array([[x] for x in test])
from keras.models import Sequential
from keras.layers import Dense, Activation, Embedding, LSTM
model = Sequential()
model.add(Dense(100, input_dim=1))
model.add(Activation('sigmoid'))
model.add(Dense(100))
model.add(Activation('sigmoid'))
model.add(Dense(100))
model.add(Activation('sigmoid'))
model.add(Dense(4))
model.add(Activation('softmax'))
model.compile(optimizer='sgd',
loss='categorical_crossentropy',
metrics=['accuracy'])
P.S。我尝试了很多层,激活函数,损失函数和优化器,但从未达到超过30%的准确度:(
答案 0 :(得分:2)
我怀疑30%的准确度是小学习率设置和小训练步骤设置的组合。
我使用model.fit(train, ytrain, nb_epoch=5, batch_size=32)
运行了您的代码段,经过5个时期的培训后,它的准确率达到了约28%。使用相同的设置但将训练步骤增加到nb_epoch=50
,损失降至~1.157 ish,准确度提高到40%。进一步增加培训步骤应该使模型进一步趋同。除此之外,您还可以尝试使用更大的学习速率设置来配置模型,这可以使融合更快:
model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.1, momentum=0.9, nesterov=True), metrics=['accuracy'])
虽然要小心,不要将学习率设置得太大,否则你的损失可能会爆发。
编辑: NN以具有建模极其复杂功能的潜力而着称,然而,模型是否实际产生良好性能取决于模型的设计,培训以及与特定应用相关的许多其他事项。
答案 1 :(得分:0)
中宇光的回答是正确的,说明你可能需要更长时间或不同的学习率训练。
我补充说,您的网络越深,您在收敛之前需要培训的时间越长。对于像sign(sin(1 / x ^ 3))这样的相对简单的函数,你可以使用比你正在使用的网络更小的网络。
此外,softmax可能不是最好的输出层。你只需要得到-1或1.单个tanh
单位似乎会很好。当您想要学习有限集上的概率分布时,通常使用softmax。 (出于类似的原因,您可能希望将误差函数从交叉熵切换为均方误差。)
尝试使用一个sigmoidal隐藏层和一个只有一个tanh单位的输出层的网络。然后玩图层大小和学习率。如果你不能只用一个来获得结果,也许可以添加第二个隐藏图层,但如果没有必要,我不会感到惊讶。
附录:在这种方法中,您将直接计算目标函数而不是您当前使用的单热矢量来替换f(x)。