您必须为占位符张量值#train_input'提供值。与dtype浮动和形状[1,50000]

时间:2017-11-22 18:38:39

标签: python-2.7 tensorflow

我试图在tensorflow的帮助下实现Restricted Boltzmann模型。我提供的输入是一个大小为1 X 50000的numpy数组。

以下是占位符:

input_data = tf.placeholder(tf.float32, shape=[1,n_features], name="train_input")
pw = tf.placeholder(tf.float32, shape=[n_features,num_hidden], name='weights')
pbh_ = tf.placeholder(tf.float32, shape=[num_hidden],name='hidden_bias')
pbv_ = tf.placeholder(tf.float32, shape=[n_features],name='visible_bias')

当我尝试运行代码时,出现以下错误:

Traceback (most recent call last):
  File "rbm_1.py", line 245, in <module>
    tr_err = train_network()
  File "rbm_1.py", line 197, in train_network
    n_w = sess.run([g['w_upd8']], feed_dict={pw: o_w, pbh_: o_hb, pbv_: o_vb})
  File "/home/wolborg/anaconda2/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 895, in run
    run_metadata_ptr)
  File "/home/wolborg/anaconda2/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1124, in _run
    feed_dict_tensor, options, run_metadata)
  File "/home/wolborg/anaconda2/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1321, in _do_run
    options, run_metadata)
  File "/home/wolborg/anaconda2/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1340, in _do_call
    raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'train_input' with dtype float and shape [1,50000]
     [[Node: train_input = Placeholder[dtype=DT_FLOAT, shape=[1,50000], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

Caused by op u'train_input', defined at:
  File "rbm_1.py", line 244, in <module>
    g = struct_network()
  File "rbm_1.py", line 100, in struct_network
    input_data = tf.placeholder(tf.float32, shape=[1,n_features], name="train_input")
  File "/home/wolborg/anaconda2/lib/python2.7/site-packages/tensorflow/python/ops/array_ops.py", line 1548, in placeholder
    return gen_array_ops._placeholder(dtype=dtype, shape=shape, name=name)
  File "/home/wolborg/anaconda2/lib/python2.7/site-packages/tensorflow/python/ops/gen_array_ops.py", line 2094, in _placeholder
    name=name)
  File "/home/wolborg/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 767, in apply_op
    op_def=op_def)
  File "/home/wolborg/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2630, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "/home/wolborg/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1204, in __init__
    self._traceback = self._graph._extract_stack()  # pylint: disable=protected-access

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'train_input' with dtype float and shape [1,50000]
     [[Node: train_input = Placeholder[dtype=DT_FLOAT, shape=[1,50000], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

我已验证我的numpy数组的维度是1 X 50000.在堆栈溢出时引用了一些较旧的帖子,但无法确定原因。请帮忙。

完整代码:

import tensorflow as tf
import numpy as np

# for taking MFCC and label input
import rnn_input_data
import sound_constants

# for displaying elapsed time
import calendar as cal
import time
import sys
import os

# Training Parameters
num_input = 198 # mfcc data input
n_features = 50000
training_data_size = 150 # determines number of files in training and testing module
testing_data_size = num_input - training_data_size

# Network Parameters
learning_rate = 0.0001 # for large training set, it can be set 0.001
num_hidden = 300 # number of hidden layers
num_classes = 28 # total alphabet classes (a-z) + extra symbols (', ' ')
epoch = 5 # number of iterations
batch_size = 1 # number of batches
gibbs_sampling_steps = 1

#shutting down debug logs
#os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

####################################################################################
mfcc_coeffs, _ = rnn_input_data.mfcc_and_text_encoding()

class DataGenerator:
    def __init__(self, data_size):
    self.ptr = 0
    self.epochs = 0
    self.data_size = data_size

    def next_batch(self):
    if self.ptr > self.data_size:
        self.epochs += 1
        self.ptr = 0

    self.ptr += batch_size

    return mfcc_coeffs[ self.ptr-batch_size : self.ptr]


def sample_hidden_from_visible(visible):

    hprobs = tf.nn.sigmoid(tf.add(tf.matmul((visible),w), bh_))
    #hstates = tf.nn.relu(tf.sign(hprobs - hrand))
    return hprobs


def sample_visible_from_hidden(num_hidden, n_features):
    visible_activation = tf.add(tf.matmul(num_hidden, tf.transpose(w)), bv_)
    vprobs = tf.truncated_normal((1, n_features), mean=visible_activation, stddev=0.1)
    return vprobs



def gibbs_sampling_step(visible, n_features):

    hprobs = sample_hidden_from_visible(visible)
    vprobs = sample_visible_from_hidden(hprobs, n_features)
    hprobs1 = sample_hidden_from_visible(vprobs)


    return hprobs, vprobs, hprobs1        

w = tf.Variable(tf.truncated_normal(shape=[n_features,num_hidden], stddev=0.1), name='weights')
bh_ = tf.Variable(tf.constant(0.1, shape=[num_hidden]),name='hidden_bias')
bv_ = tf.Variable(tf.constant(0.1, shape=[n_features]),name='visible_bias')

pw = tf.placeholder(tf.float32, shape=[n_features,num_hidden], name='weights')
pbh_ = tf.placeholder(tf.float32, shape=[num_hidden],name='hidden_bias')
pbv_ = tf.placeholder(tf.float32, shape=[n_features],name='visible_bias')


#hrand =  np.random.rand(num_hidden,num_hidden)    
#vrand = np.random.rand(n_features, num_hidden)
def struct_network():

    input_data = tf.placeholder(tf.float32, shape=[1,n_features], name="train_input")

    encode = sample_hidden_from_visible(input_data)
    reconstruction = sample_visible_from_hidden(encode, n_features)

    hprob0,vprob,hprob1 = gibbs_sampling_step(input_data, n_features)
    positive = tf.matmul(tf.transpose(input_data), hprob0)


    nn_input = vprob

    for step in range(gibbs_sampling_steps - 1):
    hprob,vprob, hprob1 = gibbs_sampling_step(nn_input, n_features)
    nn_input = vprob

    negative = tf.matmul(tf.transpose(vprob), hprob1)

    w_upd8 = w + (learning_rate *(positive - negative))
    bh_upd8 = bh_ + learning_rate * tf.reduce_mean(hprob0 - hprob1, 0)
    bv_upd8 = bv_ + learning_rate * tf.reduce_mean(n_features - vprob, 0)

    h_rand = tf.nn.sigmoid(tf.add(tf.matmul(input_data,w), bh_))
    v_rand = tf.nn.sigmoid(tf.add(tf.matmul(h_rand, tf.transpose(w)),bv_))
    err = input_data - v_rand

    err_sum = tf.reduce_mean(err)

    # returning components as dictionary elements
    return {'input_data' : input_data,
        'reconstruction_error':err_sum,
        'w_upd8':w_upd8,
        'bh_upd8':bh_upd8,
        'bv_upd8':bv_upd8
        }


def train_network():

    with tf.Session() as sess:

    train_instance = DataGenerator(training_data_size)

    sess.run(tf.global_variables_initializer())
    step, error = 0, 0
    tr_err = []
    current_epoch = 0

    while current_epoch < epoch:
        start_time = cal.timegm(time.gmtime())
        step += 1
        trb = train_instance.next_batch()


        n_w = np.zeros([n_features, num_hidden], np.float32)
        n_vb = np.zeros([n_features], np.float32)
        n_hb = np.zeros([num_hidden], np.float32)
        o_w = np.zeros([n_features, num_hidden], np.float32)
        o_vb = np.zeros([n_features], np.float32)
        o_hb = np.zeros([num_hidden], np.float32)


        print (trb[0])

        n_w = sess.run([g['w_upd8']], feed_dict={pw: o_w, pbh_: o_hb, pbv_: o_vb})
        n_hb = sess.run([g['bh_upd8']], feed_dict={pw: o_w, pbh_: o_hb, pbv_: o_vb})
        n_vb = sess.run([g['bv_upd8']], feed_dict={pw: o_w, pbh_: o_hb, pbv_: o_vb})

        feed = {g['input_data'] : np.transpose(trb[0])}
        error_ = sess.run([g['reconstruction_error']], feed_dict=feed)[0]
        error = error - error_

        o_w = n_w
        o_vb = n_vb
        o_hb = n_hb

        if train_instance.epochs > current_epoch:
            current_epoch += 1
            tr_err.append(error/ step)
            step, error = 0, 0

    return tr_err

g = struct_network()
tr_err = train_network()

1 个答案:

答案 0 :(得分:0)

我的坏。我错过的是我没有在feed_dict中传递输入张量。而不是传递:

n_w = sess.run([g['w_upd8']], feed_dict={pw: o_w, pbh_: o_hb, pbv_: o_vb})

我试过传递:

n_w = sess.run([g['w_upd8']], feed_dict={input_data: input_data, pw: o_w, pbh_: o_hb, pbv_: o_vb})

它完美无缺。更正的部分是:

n_w = sess.run([g['w_upd8']], feed_dict={input_data: input_data, pw: o_w, pbh_: o_hb, pbv_: o_vb})
n_hb = sess.run([g['bh_upd8']], feed_dict={input_data: input_data, pw: o_w, pbh_: o_hb, pbv_: o_vb})
n_vb = sess.run([g['bv_upd8']], feed_dict={input_data: input_data, pw: o_w, pbh_: o_hb, pbv_: o_vb})