Numpy / Keras:ValueError:无法将输入数组从形状(7,5)广播到形状(7)

时间:2018-09-06 10:12:44

标签: python numpy keras numpy-broadcasting

我正在尝试将一些分类功能转换为一种热门编码,以用于Keras。但是,当我尝试映射这些特征时,最终会收到错误消息,指出形状不兼容。这是我的代码:

import numpy
import pandas
from keras.models import Sequential
from keras.layers import Dense
from sklearn.preprocessing import LabelEncoder
from keras.utils import np_utils

# load dataset
dataframe = pandas.read_csv("data/development.csv")
dataset = dataframe.values

X = dataset[:,0:7].astype(int)

encoder = LabelEncoder()

for i in [3,4,5,6]:
    col = X[i]
    encoder.fit(col)
    encoded_col = encoder.transform(col)
    X[i] = np_utils.to_categorical(encoded_col) # Error is here

Y = dataset[:,7].astype(int)

这是我收到的错误:

  

ValueError: could not broadcast input array from shape (7,5) into shape (7)

在这里有什么我应该做不同的事情吗?我正在使用Python 3.6和Keras 2.2.2。

1 个答案:

答案 0 :(得分:0)

根据您在上述评论中的问题,我提出了一个可行的解决方案。但是,我仍然不确定您要实现的目标,因为我缺少您要在其中使用此操作的上下文。但是无论如何,让我a一下吧。

因此,迭代的每一行X都有自己的标签矩阵,该矩阵由to_categorical操作给出。因此,我将Y(我认为是您想要的)设计为列表。然后在迭代过程中,我将新创建的矩阵分配给Y列表的相应元素。

# load dataset
dataframe = pandas.read_csv("data/development.csv")
dataset = dataframe.values

X = dataset[:,0:7].astype(int)
num_classes = np.max(X)

# Y is a list of matrices, one matrix for each row of X iterated below
Y = [None for _ in range(X.shape[0])]
encoder = LabelEncoder()

for i in [3,4,5,6]:
    col = X[i]
    # Get the number of classes present in that vector
    num_classes = np.max(X[i])

    encoder.fit(col)
    encoded_col = encoder.transform(col)
    # Set Y[i] to the new one-hot-encoded matrix
    Y[i] = np_utils.to_categorical(encoded_col) # Error is here

print([y.shape for y in Y if y is not None])