Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么可以';SKT学习MLPC分类预测异或?_Python_Tensorflow_Machine Learning_Scikit Learn_Neural Network - Fatal编程技术网

Python 为什么可以';SKT学习MLPC分类预测异或?

Python 为什么可以';SKT学习MLPC分类预测异或?,python,tensorflow,machine-learning,scikit-learn,neural-network,Python,Tensorflow,Machine Learning,Scikit Learn,Neural Network,理论上,一个只有3个神经元的单隐层MLP足以正确预测xor。它有时可能无法正常会聚,但4个神经元是一个安全的赌注 这是一个 我已经尝试使用sklearn.neural_network.mlpclassizer来重现这一点: from sklearn import neural_network from sklearn.metrics import accuracy_score, precision_score, recall_score import numpy as np x_train

理论上,一个只有3个神经元的单隐层MLP足以正确预测xor。它有时可能无法正常会聚,但4个神经元是一个安全的赌注

这是一个

我已经尝试使用sklearn.neural_network.mlpclassizer来重现这一点:

from sklearn import neural_network
from sklearn.metrics import accuracy_score, precision_score, recall_score
import numpy as np


x_train = np.random.uniform(-1, 1, (10000, 2))
tmp = x_train > 0
y_train = 2 * (tmp[:, 0] ^ tmp[:, 1]) - 1

model = neural_network.MLPClassifier(
    hidden_layer_sizes=(3,), n_iter_no_change=100,
    learning_rate_init=0.01, max_iter=1000
).fit(x_train, y_train)

x_test = np.random.uniform(-1, 1, (1000, 2))
tmp = x_test > 0
y_test = 2 * (tmp[:, 0] ^ tmp[:, 1]) - 1

prediction = model.predict(x_test)
print(f'Accuracy: {accuracy_score(y_pred=prediction, y_true=y_test)}')
print(f'recall: {recall_score(y_pred=prediction, y_true=y_test)}')
print(f'precision: {precision_score(y_pred=prediction, y_true=y_test)}')
我的准确度只有0.75左右,而tensorflow游乐场模型是完美的,你知道有什么不同吗

还尝试使用tensorflow:

model = tf.keras.Sequential(layers=[
    tf.keras.layers.Input(shape=(2,)),
    tf.keras.layers.Dense(4, activation='relu'),
    tf.keras.layers.Dense(1)
])

model.compile(loss=tf.keras.losses.binary_crossentropy)

x_train = np.random.uniform(-1, 1, (10000, 2))
tmp = x_train > 0
y_train = (tmp[:, 0] ^ tmp[:, 1])

model.fit(x=x_train, y=y_train)

x_test = np.random.uniform(-1, 1, (1000, 2))
tmp = x_test > 0
y_test = (tmp[:, 0] ^ tmp[:, 1])

prediction = model.predict(x_test) > 0.5
print(f'Accuracy: {accuracy_score(y_pred=prediction, y_true=y_test)}')
print(f'recall: {recall_score(y_pred=prediction, y_true=y_test)}')
print(f'precision: {precision_score(y_pred=prediction, y_true=y_test)}')
有了这个模型,我得到了与scikit学习模型相似的结果。。。所以这不仅仅是一个scikit学习问题——我是否遗漏了一些重要的超参数

编辑


好的,将损失改为均方误差,而不是交叉熵,现在我得到了tensorflow示例的0.92精度。我想这就是MLPClassizer的问题所在?

提高学习速度和/或最大迭代次数似乎可以让sklearn版本正常工作。可能不同的解算器需要不同的值,我不清楚tf游乐场在使用什么。

1)你不能随意改变损失-损失由问题本身决定;MSE用于回归问题,CE用于分类问题。2) 使用MSE(即回归设置)(所有分类指标相同,即精度、召回率等)。@desertnaut您是对的,CE与分类相关,而MSE与回归相关,这就是为什么我首先使用CE。但由于我在结果上取了一个阈值,所以我在最后还是有一个分类器,因此所有这些度量仍然适用,不管损失如何。显然,MSE在这里做得更好是因为某些原因,我无法理解,即使这是一个分类问题。这可能是一个好主意,也可能不是一个好主意;请参阅自己答案的最后一部分和其中的注释。@desertnaut对,因为数据是对称的,这是Andre Ng在其论点开头所展示的特殊情况,其中线性回归做得很好。@desertnaut实际查看操场代码:(nn和操场是相关的)-他们似乎在使用MSE进行分类损失,在输出上激活tanh:)