2017-10-23 1 views
1

처음으로 이러한 문제가 발생했습니다.Tensorflow : 잘못된 형상의 feed_dict {}

오류는 약 feed_dict={tfkids: kids, tfkids_fit: kids_fit}입니다. kids_fit을 재 형성해야합니다.

누구든지이 문제를 해결할 수 있습니까?

import tensorflow as tf 
from tensorflow.contrib.distributions import Normal 
import numpy as np 
import matplotlib.pyplot as plt 

DNA_SIZE = 1 
POP_SIZE = 10 
LR = 0.1 
N_GENERATION = 50 

def F(x): 
    return x**2 

def get_fitness(value): 
    return -value 

mean = tf.Variable(tf.constant(13.), dtype=tf.float32) 
sigma = tf.Variable(tf.constant(5.), dtype=tf.float32) 
N_dist = Normal(loc=mean, scale=sigma) 
make_kids = N_dist.sample([POP_SIZE]) 

tfkids = tf.placeholder(tf.float32, [POP_SIZE, DNA_SIZE]) 
tfkids_fit = tf.placeholder(tf.float32, [POP_SIZE]) 
loss = -tf.reduce_mean(N_dist.log_prob(tfkids) * tfkids_fit) 
train_op = tf.train.GradientDescentOptimizer(LR).minimize(loss) 

x = np.linspace(-20, 20, 100) 
plt.plot(x, F(x)) 

sess = tf.Session() 
init = tf.global_variables_initializer() 
sess.run(init) 

plt.ion() 
for g in range(N_GENERATION): 
    kids = sess.run(make_kids) 
    kids_fit = get_fitness(F(kids)) 
    sess.run(train_op, feed_dict={tfkids: kids, tfkids_fit: kids_fit}) 

    if "plot_points" in globals(): 
     plot_points.remove() 

    plot_points = plt.scatter(kids, F(kids), s=30) 
    plt.pause(0.05) 

plt.ioff() 
plt.show() 

코드를 테스트 할 때 오류가 발생합니다.

ValueError: Cannot feed value of shape (10,) for Tensor 'Placeholder:0', which has shape '(10, 1)'

답변

1

Placeholder:0tfkids = tf.placeholder(tf.float32, [POP_SIZE, DNA_SIZE])입니다.

보시다시피, tfkids 모양은 [POP_SIZE, DNA_SIZE] = (10, 1)입니다.

kids 변수 대신 모양 = (10)입니다. 두 모양 (10 개) 값이 포함되어 있지만, 두 번째는

D.

일 동안

은, 최초의 2 차원이 당신, 따라서이 방법으로 tfkids와 호환되도록하기 위해 귀하의 kids 변수의 차원을 확장해야 :

sess.run(train_op, feed_dict={tfkids: np.expand_dims(kids, axis=1), tfkids_fit: kids_fit}) 

np.expand_dims 당신이 당신의 kids 모양에 1D 차원을 추가 할 수 있습니다

+0

감사합니다. 매우 명확한 설명입니다. – CYC

1

어린이 텐서를 변형 할 수 있습니다.

kids = sess.run(make_kids) 
kids = tf.reshape(kids,(None,1)) 
kids_fit = get_fitness(F(kids)) 
sess.run(train_op, feed_dict={tfkids: kids, tfkids_fit: kids_fit}) 
1

문제 : W 당신이 tfkids 변수의 모양을 [POP_SIZE, DNA_SIZE] (10, 1)으로 선언했다. 그러나 실제 데이터를 연습 중에 자리 표시 자에 넣으면 (10) 모양의 데이터가 전달됩니다.

솔루션 : 변수에 피드를 제공하려면 훈련 데이터를 (10, 1)로 바꿔야합니다. 데이터를 재구성 할 수있는 몇 가지 방법이 있습니다. numpy 라이브러리의 변형 기능을 사용할 수 있습니다. 교육 데이터를 제공하기 전에 다음을 수행하십시오.

kids = np.reshape(kids, [-1, 1]) 

희망이 있습니다.

+0

좋아요! 이것은이 문제를 해결하는 또 다른 방법입니다. 감사합니다 @ Niyamat Ullah – CYC