简体   繁体   English

TensorFlow:网络输出未达到预期的形状

[英]TensorFlow: Network output has not expected shape

I am implementing a network using TensorFlow. 我正在使用TensorFlow实施网络。 The network take as input a binary feature vector, and it should predict a float value as output. 网络将二进制特征向量作为输入,并且应该将浮点值作为输出进行预测。 I am expecting a (1,1) tensor object as output for my function multilayer_perceptron() , instead, when running pred , it returns a vector of the same length of my input data (X,1). 我期望一个(1,1)张量对象作为我的函数multilayer_perceptron()输出,相反,当运行pred ,它返回一个与我输入数据(X,1)相同长度的向量。

Since i am new to this framework I expect the error to be very trivial. 由于我是这个框架的新手,所以我希望错误会变得非常微不足道。 What am I doing wrong? 我究竟做错了什么?

import tensorflow as tf

print "**** Defining parameters..."
# Parameters
learning_rate = 0.001 
training_epochs = 15
batch_size = 1
display_step = 1

print "**** Defining Network..."
# Network Parameters
n_hidden_1 = 10 # 1st layer num features
n_hidden_2 = 10 # 2nd layer num features
n_input = Xa.shape[1] # data input(feature vector length) 
n_classes = 1 # total classes (IC50 value)

# tf Graph input
x = tf.placeholder("int32", [batch_size, None])
y = tf.placeholder("float", [None, n_classes])

# Create model
def multilayer_perceptron(_X, _weights, _biases):
  lookup_h1 = tf.nn.embedding_lookup(_weights['h1'], _X)
  layer_1 = tf.nn.relu(tf.add(tf.reduce_sum(lookup_h1, 0), _biases['b1'])) #Hidden layer with RELU activation
  layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1, _weights['h2']), _biases['b2'])) #Hidden layer with RELU activation
  pred = tf.matmul(layer_2, _weights['out']) + _biases['out']

  return pred

# Store layers weight & bias
weights = {
          'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
          'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
          'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes]))
          }
biases = {
      'b1': tf.Variable(tf.random_normal([n_hidden_1])),
      'b2': tf.Variable(tf.random_normal([n_hidden_2])),
      'out': tf.Variable(tf.random_normal([n_classes]))
}

# Construct model
pred = multilayer_perceptron(x, weights, biases)

# Define loss and optimizer
cost = tf.reduce_mean(tf.square(tf.sub(pred, y))) # MSE
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #Gradient descent

# Evaluate model
correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

# Initializing the variables
init = tf.initialize_all_variables()

print "**** Launching the graph..."
# Launch the graph
with tf.Session() as sess:
  sess.run(init)

  print "**** Training..."
  # Training cycle
  for epoch in range(training_epochs):
    avg_cost = 0.
    total_batch = int(Xa.tocsc().shape[0]/batch_size)
    # Loop over all batches
    for i in range(total_batch):
      # Extract sample
      batch_xs = Xa.tocsc()[i,:].tocoo()
      batch_ys = np.reshape(Ya.tocsc()[i,0], (batch_size,1))
      #****************************************************************************
      # Extract sparse indeces from input matrix (They will be used as actual input)
      ids = batch_xs.nonzero()[1]
      # Fit training using batch data
      sess.run(optimizer, feed_dict={x: ids, y: batch_ys})
      # Compute average loss
      avg_cost += sess.run(cost, feed_dict={x: ids, y: batch_ys})/total_batch
      # Display logs per epoch step
    if epoch % display_step == 0:
      print "Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(avg_cost)
  print "Optimization Finished!"

Your pred should be of shape [n_input, n_class] because you define weights['out'] and biases['out'] in that way. 您的pred应该为[n_input, n_class]形状[n_input, n_class]因为您以这种方式定义了weights['out'][n_input, n_class] biases['out'] The only way you get a (1,1) tensor from pred is your n_class = 1 ... pred获得(1,1)张量的唯一方法是n_class = 1 ...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM