我写了一个简单的神经网络/ MLP,我得到了一些奇怪的准确值,想要仔细检查一下。
这是我的预期设置:具有913个样本和192个特征(913,192)的特征矩阵。我正在对2个结果进行分类,所以我的标签是二元的并且有形状(913,1)。 1个隐藏层,100个单位(现在)。所有激活都将使用tanh,所有损失都使用l2正则化,并使用SGD进行优化
代码如下。它是使用Keras框架(http://keras.io/)在python中编写的,但我的问题不是特定于Keras
input_size = 192
hidden_size = 100
output_size = 1
lambda_reg = 0.01
learning_rate = 0.01
num_epochs = 100
batch_size = 10
model = Sequential()
model.add(Dense(input_size, hidden_size, W_regularizer=l2(lambda_reg), init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(hidden_size, output_size, W_regularizer=l2(lambda_reg), init='uniform'))
model.add(Activation('tanh'))
sgd = SGD(lr=learning_rate, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mean_squared_error', optimizer=sgd, class_mode="binary")
history = History()
model.fit(features_all, labels_all, batch_size=batch_size, nb_epoch=num_epochs, show_accuracy=True, verbose=2, validation_split=0.2, callbacks=[history])
score = model.evaluate(features_all, labels_all, show_accuracy=True, verbose=1)
我有两个问题:
这是我第一次使用Keras,所以我想仔细检查我编写的代码实际上是否符合我对参数及其值等选择的要求。
使用上面的代码,我得到的训练和测试集精度徘徊在50-60%左右。也许我只是使用不好的功能,但我想测试看看可能出错的地方,所以我手动将所有标签和功能设置为可预测的内容:
labels_all[:500] = 1
labels_all[500:] = 0
features_all[:500] = np.ones(192)*500
features_all[500:] = np.ones(192)
因此,我将前500个样本设置为标签为1,其他所有标记为0.我将前500个样本中的每个样本的所有功能手动设置为500,以及所有其他功能(对于其余样本)得到1
当我运行时,我的训练准确率约为65%,验证准确率约为0%。我期待两种精度都非常高/近乎完美 - 这是不正确的?我的想法是,具有极高值的功能都具有相同的标签(1),而具有低值的功能获得0标签
大多数情况下,我只是想知道我的代码/模型是否不正确或我的逻辑是否错误
谢谢!
答案 0 :(得分:3)
我不知道那个库,所以我不能告诉你这是否正确实现,但看起来是合法的。
我认为你的问题在于激活功能 - tanh(500)= 1和tanh(1)= 0.76。这种差异对我来说似乎太小了。尝试使用-1而不是500进行测试,并将实际数据标准化为[-2,2]。如果您需要完整的实数范围,请尝试使用线性激活功能。如果您只关心实数的正半数,我建议使用softplus或ReLU。我已经检查过,所有这些功能都是用Keras提供的。
您也可以尝试对输出进行阈值处理 - 当期望为0时回答0.75,当期望0有效时回答0.25,但可能会影响您的准确性。
另外,尝试调整参数。我可以(根据我自己的经验)建议您使用:
我会说学习率,时代数,动量和lambda是这里最重要的因素 - 从最重要到最不重要。
PS。我刚刚发现你正在均匀地初始化你的重量(即使是一个词?我不是母语人士......)。我不能告诉你为什么,但我的直觉告诉我这是一个坏主意。我会选择随机的初始权重。