使用Tensorflow learn获取OR门相反的输出

给定一个具有2个隐藏层(分别为5和3维)的DNN(多层感知器的简单情况),我正在训练一个模型来识别OR门。

使用tensorflow learn,似乎它给了我相反的输出,我不知道为什么:

from tensorflow.contrib import learnclassifier = learn.DNNClassifier(hidden_units=[5, 3], n_classes=2)or_input = np.array([[0.,0.], [0.,1.], [1.,0.]])or_output = np.array([[0,1,1]]).Tclassifier.fit(or_input, or_output, steps=0.05, batch_size=3)classifier.predict(np.array([ [1., 1.], [1., 0.] , [0., 0.] , [0., 1.]]))

[out]:

array([0, 0, 1, 0])

如果我采用“老派”的方式,不使用tensorflow.learn,如下所示,我得到了预期的答案。

import tensorflow as tf# Parameterslearning_rate = 1.0num_epochs = 1000# Network Parametersinput_dim = 2 # Input dimensions.hidden_dim_1 = 5 # 1st layer number of featureshidden_dim_2 = 3 # 2nd layer number of featuresoutput_dim = 1 # Output dimensions.# tf Graph inputx = tf.placeholder("float", [None, input_dim])y = tf.placeholder("float", [hidden_dim_2, output_dim])# With biases.weights = {    'syn0': tf.Variable(tf.random_normal([input_dim, hidden_dim_1])),    'syn1': tf.Variable(tf.random_normal([hidden_dim_1, hidden_dim_2])),    'syn2': tf.Variable(tf.random_normal([hidden_dim_2, output_dim]))}biases = {    'b0': tf.Variable(tf.random_normal([hidden_dim_1])),    'b1': tf.Variable(tf.random_normal([hidden_dim_2])),    'b2': tf.Variable(tf.random_normal([output_dim]))}# Create a modeldef multilayer_perceptron(X, weights, biases):    # Hidden layer 1  + sigmoid activation function    layer_1 = tf.add(tf.matmul(X, weights['syn0']), biases['b0'])    layer_1 = tf.nn.sigmoid(layer_1)    # Hidden layer 2 + sigmoid activation function    layer_2 = tf.add(tf.matmul(layer_1, weights['syn1']), biases['b1'])    layer_2 = tf.nn.sigmoid(layer_2)    # Output layer    out_layer = tf.matmul(layer_2, weights['syn2']) + biases['b2']    out_layer = tf.nn.sigmoid(out_layer)    return out_layer# Construct modelpred = multilayer_perceptron(x, weights, biases)# Define loss and optimizercost = tf.sub(y, pred) # Or you can use fancy cost like:##tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)init = tf.initialize_all_variables()or_input = np.array([[0.,0.], [0.,1.], [1.,0.]])or_output = np.array([[0.,1.,1.]]).T# Launch the graphwith tf.Session() as sess:    sess.run(init)    # Training cycle    for epoch in range(num_epochs):        batch_x, batch_y = or_input, or_output # Loop over all data points.        # Run optimization op (backprop) and cost op (to get loss value)        _, c = sess.run([optimizer, cost], feed_dict={x: batch_x, y: batch_y})        #print (c)    # Now let's test it on the unknown dataset.    new_inputs = np.array([[1.,1.], [1.,0.]])    feed_dict = {x: new_inputs}    predictions = sess.run(pred, feed_dict)    print (predictions)

[out]:

[[ 0.99998868] [ 0.99998868]]

为什么使用tensorflow.learn时我得到的是相反的输出? 我使用tensorflow.learn时是否做错了什么?

如何使tensorflow.learn代码产生与“老派”tensorflow框架相同的结果?


回答:

如果你为steps指定了正确的参数,你会得到好的结果:

classifier.fit(or_input, or_output, steps=1000, batch_size=3)

结果:

array([1, 1, 0, 1])

steps是如何工作的

steps参数指定了你运行训练操作的次数。让我给你一些例子:

  • batch_size = 16steps = 10时,你将看到总共160个样本
  • 在你的例子中,batch_size = 3steps = 1000,算法将看到3000个样本。实际上,它会1000次看到你提供的相同3个样本

所以,steps不是epochs的数量,而是你运行训练操作的次数,或者是你看到一个新批次的次数。


为什么允许steps = 0.05

tf.learn代码中,他们没有检查steps是否为整数。他们只是运行一个while循环,检查(在这一行):

last_step < max_steps

所以如果max_steps = 0.05,它将表现得与max_steps = 1相同(last_step在循环中递增)。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注