2017-09-01 48 views
1

運行下面的代碼:定義一個佔位符,張一個熱編碼數據

loss = tf.losses.softmax_cross_entropy(onehot_labels=training_outputs, logits=logits) 
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss) 

    init = tf.global_variables_initializer() 

    # define placeholder for inputs to network 
    xs = tf.placeholder(tf.float32,[None,2000]) 
    ys = tf.placeholder(tf.float32,[None,81]) 


    with tf.Session() as sess: 
     sess.run(init) 
     for i in range(1000): 
      sess.run(optimizer, feed_dict={xs:training_inputs, ys:training_outputs}) 

返回錯誤:

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

我認爲這是關係到training_inputs & training_outputs的格式是:

enter image description here

enter image description here

training_inputs & training_outputs是一個熱編碼。但是,每個都應該是array([],[]....)而不是array([[],[],...])

回答

2

training_inputs & training_outputs是一個熱門編碼。但是,每一個都應該是數組類型([],[] ....)而不是數組([[],[],...])?

不,輸入和輸出看起來不錯。

錯誤提示您未提供運行optimizer張量所需的佔位符。從錯誤消息(Placeholder_150)中的佔位符名稱可以看出,您創建了許多佔位符。你要知道,當你在tensorflow組合使用筆記本

一件事是,每次你執行單元與

xs = tf.placeholder(tf.float32,[None,2000]) 
ys = tf.placeholder(tf.float32,[None,81]) 

新佔位符將被添加到圖。第一次執行"Placeholder_0""Placeholder_1"將在第二次添加"Placeholder_2""Placeholder_3",依此類推。

問題可能是xsys不是指用於計算optimizer的相同佔位符。

這可能發生,例如,如果你第一次執行

xs = tf.placeholder(tf.float32,[None,2000]) 
ys = tf.placeholder(tf.float32,[None,81]) 

然後從xsys建立optimizer的部分,然後運行會話之前執行

xs = tf.placeholder(tf.float32,[None,2000]) 
ys = tf.placeholder(tf.float32,[None,81]) 

一次。

編輯: 在創建optimizer張量後創建佔位符也是一個錯誤。由於optimizer應取決於這些佔位符。它應該在您第一次運行筆記本時出現錯誤,但第二次可能會導致出現錯誤。

+0

哪裏是優化和XS,YS佔位符之間的依賴?作爲xs,ys佔位符在筆記本中只聲明一次,那麼它們如何引用不同的佔位符? –

+0

1)我看不到你的問題中的代碼。但我期望計算'logits'需要'xs','ys'應該作爲'onehot_labels參數'提供(我看到你現在使用'training_outputs',這也是一個bug )。 2)您可以多次執行佔位符的單元格。如果'logits'取決於'xs'的舊值,那麼您將會看到一個錯誤,請參閱我在答案中給出的示例。 – GeertH

+0

您正在使用jupyter筆記本來定義您的模型,不是嗎?您的'placeholder_150'看起來像是一次又一次地運行佔位符定義。只需嘗試重新啓動筆記本電腦並按順序執行每一步。有些事情可能會改變。試一試 – nessuno

0

,我認爲你是被混淆的損失計算

# Here onehot_labels is not exactly the training outputs data, but the ground truths labels placeholder <ys> of your training data <xs> 
# this line should be replaced with 
loss = tf.losses.softmax_cross_entropy(onehot_labels=training_outputs, logits=logits) 
# this one 
loss = tf.losses.softmax_cross_entropy(onehot_labels=ys, logits=logits)