Tensorflow预测二进制字符串

时间:2017-05-22 12:56:05

标签: tensorflow binary conv-neural-network

我正在尝试创建一个卷积神经网络,它预测是否要出售水电大坝,我遇到的问题是输出。我输入两个输入,价格(标准化浮点数)和waterinflow(此时为1或0)。

我的问题是运行这个并尝试将答案作为一组操作0/1,给我一些除了将输出设置为相应的数字而不是一组操作之外没有任何意义的浮点数。当行动量很小时,这很好,但是当行动的数量延长时会很糟糕。

有没有人知道我是如何做到的,以便它将动作输出为0或1,而不是看起来确定预测的浮动。

如果有4个动作,并且正确的答案是0,1,0,1,则表示预测应采用相同的形式(4个动作0或1)

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

标准化概率的二进制输出

您正在寻找的是将归一化概率输出转换为二进制概率输出的方法。

这在Tensorflow中非常直接,并且增加了 tf.round 功能。诀窍是确保在训练中不使用输出 tf.round 。使用工作代码示例可以最好地证明这一点。

工作代码示例

此代码使用神经网络计算XOR函数。输出为y_out (概率输出)和y_binary (将概率输出转换为二进制)

### imports
import tensorflow as tf
import numpy as np

### constant data
x  = [[0.,0.],[1.,1.],[1.,0.],[0.,1.]]
y_ = [[1.,0.],[1.,0.],[0.,1.],[0.,1.]]

### induction
# 1x2 input -> 2x3 hidden sigmoid -> 3x1 sigmoid output

# Layer 0 = the x2 inputs
x0 = tf.placeholder( dtype=tf.float32 , shape=[None,2] )
y0 = tf.placeholder( dtype=tf.float32 , shape=[None,2] )

# Layer 1 = the 2x3 hidden sigmoid
m1 = tf.Variable( tf.random_uniform( [2,3] , minval=0.1 , maxval=0.9 , dtype=tf.float32  ))
b1 = tf.Variable( tf.random_uniform( [3]   , minval=0.1 , maxval=0.9 , dtype=tf.float32  ))
h1 = tf.sigmoid( tf.matmul( x0,m1 ) + b1 )

# Layer 2 = the 3x2 softmax output
m2 = tf.Variable( tf.random_uniform( [3,2] , minval=0.1 , maxval=0.9 , dtype=tf.float32  ))
b2 = tf.Variable( tf.random_uniform( [2]   , minval=0.1 , maxval=0.9 , dtype=tf.float32  ))
y_logit = tf.matmul( h1,m2 ) + b2
y_out = tf.nn.softmax( y_logit )
y_binary = tf.round( y_out )

### loss

# loss : a loss function that uses y_logit or y_out , but NOT y_binary
loss = tf.reduce_sum( tf.square( y0 - y_out ) )

# training step
train = tf.train.GradientDescentOptimizer(1.0).minimize(loss)


### training
# run 500 times using all the X and Y
# print out the loss and any other interesting info
with tf.Session() as sess:
  sess.run( tf.global_variables_initializer() )

  print "\nloss"
  for step in range(500) :
    sess.run(train, feed_dict={x0:x,y0:y_})
    if (step + 1) % 100 == 0 :
      print sess.run(loss, feed_dict={x0:x,y0:y_})

  y_out_value , y_binary_value = sess.run([y_out,y_binary], feed_dict={x0:x,y0:y_})
  print "\nThe expected output is :"
  print np.array(y_)
  print "\nThe softmax output is :"
  print np.array(y_out_value)
  print "\nThe binary output is :"
  print np.array(y_binary_value)

print ""

输出

The expected output is :
[[ 1.  0.]
 [ 1.  0.]
 [ 0.  1.]
 [ 0.  1.]]

The softmax output is :
[[ 0.96538627  0.03461381]
 [ 0.81609273  0.18390732]
 [ 0.11534476  0.88465524]
 [ 0.0978259   0.90217412]]

The binary output is :
[[ 1.  0.]
 [ 1.  0.]
 [ 0.  1.]
 [ 0.  1.]]

正如您所看到的,您可以检索概率输出或转换为二进制的概率,并且仍然具有经典logits的所有好处。

干杯。

答案 1 :(得分:0)

我想重要的是要注意神经网络的输出实际上是对存在的类的每个元素计算的后验概率---对于典型的分类问题。 返回的数字告诉您在给定输入x的情况下输出为A,B,C的可能性有多大。所以你不能指望永远得到0或1。

#An example would be if I get 
Output = [0.5,0.2,0.3] given input x. 
#I predict the class should be A because it has posterior of 0.5
(the    highest value of the 3 values returned).
Class = A (0.5)
# Or I might as well round it up. Tensor flow can do this for you

所以我猜你应该得到输出并应用适合你模型的概率假设,比如说返回预测中的最高值给它所属的类。 等待绝对一次或零预测可能并不容易。

小心我上面写的这个事实。这是一个常见的错误。请阅读下面的论文。一旦你有了后代,你就可以在它们上面添加和构建模型。你可以实现的目标没有限制!

例如,您可以在输出上应用高斯混合模型/马尔可夫模型/构建决策Tress / Combine专家系统,这些都是优雅和科学的方法。

阅读本文以获取更多信息。 http://www.ee.iisc.ac.in/people/faculty/prasantg/downloads/NeuralNetworksPosteriors_Lippmann1991.pdf

希望它有所帮助!