我是Tensorflow的新手,之前曾广泛使用过scikit-learn。作为我尝试过渡到TensorFlow的第一个练习之一,我试图重现我用scikit-learn的MLPClassifier获得的一些结果。
当我使用MLPClassifier主要使用默认设置时,我在测试集上的准确度达到98%。然而,当我在TensorFlow中实现我认为是等效的单层ANN时,我在测试集上的准确度低于90%。我可以让TensorFlow产生类似精度的唯一方法是训练训练集多次(> 50次)。
关于差异可能来自哪里的任何想法?或者在Tensorflow中是否有sklearn MLPClassifier的任何实现,我可以比较我的代码?
就我而言,我使用相同的优化器(Adam),相同的学习速率,具有相同参数的L2正则化,相同的激活函数(ReLU)和输出层的softmax评估。
我对TensorFlow图的实现如下:
n_units = 500
X = tf.placeholder(tf.float32, [None, n_features])
Y = tf.placeholder(tf.float32, [None, n_classes])
# Create weights for all layers
W_input = tf.Variable(tf.truncated_normal([n_features, n_units]))
W_out = tf.Variable(tf.truncated_normal([n_units, n_classes]))
# Create biases for all layers
b_1 = tf.Variable(tf.zeros([n_units]))
b_2 = tf.Variable(tf.zeros(([n_classes])))
# Mount layers
hidden_layer = tf.nn.relu(tf.matmul(X, W_input) + b_1)
logits = tf.matmul(hidden_layer, W_out) + b_2
# Get all weights into a single list
all_weights = tf.concat([tf.reshape(W_input, [-1]), tf.reshape(W_out, [-1])], 0)
# Compute loss function
cross_entropy = tf.reduce_mean(
tf.losses.softmax_cross_entropy(onehot_labels=Y, logits=logits))
# Compute regularization parameter
regularizer = 0.0001*tf.nn.l2_loss(all_weights)
# Train step
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy + regularizer)
# Get number of correct predictions
correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(Y, 1))
# Class prediction
prediction = tf.argmax(tf.nn.softmax(logits), 1)
# Get accuracy
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
我对sklearn模型的实现很简单:
clf = neural_network.MLPClassifier(hidden_layer_sizes = (500,), random_state=42)
MLP分类器是神经网络。实质上,它需要在使用反向传播在隐藏层上学习适当的权重之前对多个迭代(时期)进行训练,之后它可以正确分类。
如果你看看sklearns实现,有一个名为max_iter
的默认参数
max_iter:int,optional,默认值200
最大迭代次数。求解器迭代直到收敛(由'tol'确定)或这个迭代次数。对于随机求解器('sgd','adam'),请注意,这决定了时期的数量(每个数据点的使用次数),而不是梯度步数。
从本质上讲,它可以运行200个时代,然后为您提供0.98的准确度。这就是为什么你需要在tensorflow中运行200次相同的图形(我假设50,因为你已经说明也足够了)来获得完全相同的输出。