具有连续/浮点输出的张量流神经网络?

时间:2016-07-12 04:11:15

标签: tensorflow

我正在尝试在tensorflow中创建一个简单的神经网络来学习输入和输出之间的一些简单关系(例如,y = -x),其中输入和输出是浮点值(意思是,没有使用softmax)输出)。

我觉得这应该很容易,但我必须搞砸到某个地方。想知道是否有任何类似的教程或示例。我查看了现有的tensorflow教程并没有看到这样的内容,并查看了我通过谷歌搜索找到的其他几个张量流示例来源,但没看到我在寻找什么。

这是我一直在尝试的精简版。在这个特定的版本中,我注意到我的重量和偏差似乎总是停留在零。也许这是由于我的单输入和单输出?

我已经好好改变雾的例子用于各种恶意目的,但是我已经成功工作的所有东西都在输出上使用softmax进行分类。如果我能弄清楚如何从神经网络中生成原始浮点输出,那么我想用它做几个有趣的项目。

任何人都能看到我所缺少的东西?提前致谢! - J.

  # Trying to define the simplest possible neural net where the output layer of the neural net is a single
  # neuron with a "continuous" (a.k.a floating point) output.  I want the neural net to output a continuous
  # value based off one or more continuous inputs.  My real problem is more complex, but this is the simplest
  # representation of it for explaining my issue.  Even though I've oversimplified this to look like a simple
  # linear regression problem (y=m*x), I want to apply this to more complex neural nets.  But if I can't get
  # it working with this simple problem, then I won't get it working for anything more complex.

  import tensorflow as tf
  import random
  import numpy as np


  INPUT_DIMENSION  = 1
  OUTPUT_DIMENSION = 1
  TRAINING_RUNS    = 100
  BATCH_SIZE       = 10000
  VERF_SIZE        = 1


  # Generate two arrays, the first array being the inputs that need trained on, and the second array containing outputs.
  def generate_test_point():
    x = random.uniform(-8, 8)

    # To keep it simple, output is just -x.  
    out = -x

    return ( np.array([ x ]), np.array([ out ]) )

  # Generate a bunch of data points and then package them up in the array format needed by
  # tensorflow
  def generate_batch_data( num ):
     xs = []
     ys = []

     for i in range(num):
       x, y = generate_test_point()

       xs.append( x )
       ys.append( y )

     return (np.array(xs), np.array(ys) )

  # Define a single-layer neural net.  Originally based off the tensorflow mnist for beginners tutorial

  # Create a placeholder for our input variable
  x = tf.placeholder(tf.float32, [None, INPUT_DIMENSION])

  # Create variables for our neural net weights and bias
  W = tf.Variable(tf.zeros([INPUT_DIMENSION, OUTPUT_DIMENSION]))
  b = tf.Variable(tf.zeros([OUTPUT_DIMENSION]))

  # Define the neural net.  Note that since I'm not trying to classify digits as in the tensorflow mnist
  # tutorial, I have removed the softmax op.  My expectation is that 'net' will return a floating point
  # value.
  net = tf.matmul(x, W) + b

  # Create a placeholder for the expected result during training
  expected = tf.placeholder(tf.float32, [None, OUTPUT_DIMENSION])

  # Same training as used in mnist example
  cross_entropy = -tf.reduce_sum(expected*tf.log(tf.clip_by_value(net,1e-10,1.0)))
  train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

  sess = tf.Session()

  init = tf.initialize_all_variables()
  sess.run(init)

  # Perform our training runs

  for i in range( TRAINING_RUNS ):
    print "trainin run: ", i,

    batch_inputs, batch_outputs = generate_batch_data( BATCH_SIZE )

    # I've found that my weights and bias values are always zero after training, and I'm not sure why.
    sess.run( train_step, feed_dict={x: batch_inputs, expected: batch_outputs})

    # Test our accuracy as we train...  I am defining my accuracy as the error between what I 
    # expected and the actual output of the neural net.
    #accuracy = tf.reduce_mean(tf.sub( expected, net))  
    accuracy = tf.sub( expected, net) # using just subtract since I made my verification size 1 for debug

    # Uncomment this to debug
    #import pdb; pdb.set_trace()

    batch_inputs, batch_outputs = generate_batch_data( VERF_SIZE )
    result = sess.run(accuracy, feed_dict={x: batch_inputs, expected: batch_outputs})

    print "    progress: "
    print "      inputs: ", batch_inputs
    print "      outputs:", batch_outputs
    print "      actual: ", result

3 个答案:

答案 0 :(得分:9)

您的损失应该是输出和真实值的平方差异:

loss = tf.reduce_mean(tf.square(expected - net))

通过这种方式,网络学会优化这种损失并使输出更接近实际结果。交叉熵只应用于0到1之间的输出值,即用于分类。

答案 1 :(得分:3)

如果有人有兴趣,我可以使用这个例子。这是代码:

# Trying to define the simplest possible neural net where the output layer of the neural net is a single
# neuron with a "continuous" (a.k.a floating point) output.  I want the neural net to output a continuous
# value based off one or more continuous inputs.  My real problem is more complex, but this is the simplest
# representation of it for explaining my issue.  Even though I've oversimplified this to look like a simple
# linear regression problem (y=m*x), I want to apply this to more complex neural nets.  But if I can't get
# it working with this simple problem, then I won't get it working for anything more complex.

import tensorflow as tf
import random
import numpy as np

INPUT_DIMENSION = 1
OUTPUT_DIMENSION = 1
TRAINING_RUNS = 100
BATCH_SIZE = 10000
VERF_SIZE = 1


# Generate two arrays, the first array being the inputs that need trained on, and the second array containing outputs.
def generate_test_point():
    x = random.uniform(-8, 8)

    # To keep it simple, output is just -x.
    out = -x

    return (np.array([x]), np.array([out]))


# Generate a bunch of data points and then package them up in the array format needed by
# tensorflow
def generate_batch_data(num):
    xs = []
    ys = []

    for i in range(num):
        x, y = generate_test_point()

        xs.append(x)
        ys.append(y)

    return (np.array(xs), np.array(ys))


# Define a single-layer neural net.  Originally based off the tensorflow mnist for beginners tutorial

# Create a placeholder for our input variable
x = tf.placeholder(tf.float32, [None, INPUT_DIMENSION])

# Create variables for our neural net weights and bias
W = tf.Variable(tf.zeros([INPUT_DIMENSION, OUTPUT_DIMENSION]))
b = tf.Variable(tf.zeros([OUTPUT_DIMENSION]))

# Define the neural net.  Note that since I'm not trying to classify digits as in the tensorflow mnist
# tutorial, I have removed the softmax op.  My expectation is that 'net' will return a floating point
# value.
net = tf.matmul(x, W) + b

# Create a placeholder for the expected result during training
expected = tf.placeholder(tf.float32, [None, OUTPUT_DIMENSION])

# Same training as used in mnist example
loss = tf.reduce_mean(tf.square(expected - net))
# cross_entropy = -tf.reduce_sum(expected*tf.log(tf.clip_by_value(net,1e-10,1.0)))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

sess = tf.Session()

init = tf.initialize_all_variables()
sess.run(init)

# Perform our training runs

for i in range(TRAINING_RUNS):
    print("trainin run: ", i, )

    batch_inputs, batch_outputs = generate_batch_data(BATCH_SIZE)

    # I've found that my weights and bias values are always zero after training, and I'm not sure why.
    sess.run(train_step, feed_dict={x: batch_inputs, expected: batch_outputs})

    # Test our accuracy as we train...  I am defining my accuracy as the error between what I
    # expected and the actual output of the neural net.
    # accuracy = tf.reduce_mean(tf.sub( expected, net))
    accuracy = tf.subtract(expected, net)  # using just subtract since I made my verification size 1 for debug
    # tf.subtract()
    # Uncomment this to debug
    # import pdb; pdb.set_trace()
    print("W=%f, b=%f" % (sess.run(W), sess.run(b)))

    batch_inputs, batch_outputs = generate_batch_data(VERF_SIZE)
    result = sess.run(accuracy, feed_dict={x: batch_inputs, expected: batch_outputs})

    print("    progress: ")
    print("      inputs: ", batch_inputs)
    print("      outputs:", batch_outputs)
    print("      actual: ", result)

答案 2 :(得分:0)

当使用内置的、简单的构建神经网络的方法时,我使用了

@XmlElementWrapper