无法播放numpy数组,但.shape表示它们具有相同的形状

时间:2018-02-28 20:56:24

标签: python arrays numpy shape broadcast

这是我的函数的第一部分,它想要从训练好的LSTM和dim 50的单词嵌入生成文本。当我尝试将X的行i设置为嵌入向量y_embed时,问题出现了。但是,这个问题只出现在for循环的第三次迭代中。这对我来说很奇怪,因为我希望X的每一行都有相同的形状。

def generate_text(my_model, length):
    ix = np.random.randint(VOCAB_SIZE) #start generating by some 
         random index
    y_word = [reverse_dictionary[ix]] #get the word with that index
    y_embed = w2vec[ix] #get the embedding vector
    print(y_embed.shape)

    X = np.zeros((1, length, EMBED_DIM)) #make our numpy array
    print(X[0,2].shape)
    for i in range(length): #however many words we want
        print("i is "+str(i))
        X[0, i] = y_embed #current row of X is current word embedding
        y_embed = my_model.predict(X[:, :i+1, :])[0] 
        #input what we've generated so far, model.predict gives us a list, take the first one
        #we'll add it to our input on the next loop iteration

        y_word.append(vec2w(y_embed)) #lookup the word by its embedding

for循环适用于前两次迭代,然后在i = 2时抛出此错误:

 X[0, i] = y_embed #current row of X is current word embedding  
 ValueError: could not broadcast input array from shape (2,50) into shape (50)

这就是为什么我事先打印出y_embed和X [0,2]的形状,并且控制台打印出来:

(50,)

(50,)

据我所知,他们的形状相同。我对numpy还很陌生,所以也许这是显而易见的事情,但我无法解决这个问题。我应该补充一点,我使用的是Keras,而model.predict需要3D张量,这就是为什么X的定义方式。我也试过设置X [0,i,:] = y_embed但是同时产生了同样的错误。

1 个答案:

答案 0 :(得分:0)

X = np.zeros((1, length, EMBED_DIM))

X是3d。

X[0, i]

选择前2个目录,所以它是(EMBED_DIM,),根据错误是(50,)。

错误认为y_embed是(2,50),2列是50.显然它是由最后一次迭代创建的。

my_model.predict(X[:, :i+1, :])[0] 

使用i==1,它会提供predict X[:,:2,:],一个(2,50)数组。我不知道predict做了什么,但我不认为输出与输入具有相同的形状是巧合。