Keras多重输出numpy转换

时间:2019-12-13 23:02:10

标签: python numpy tensorflow keras

我有一个y_train形式的(samples, 9)数据集。我的X_train输入形式为(samples, 30, 1)

这些通过以下模型运行:

def create_model(input_shape, outputs):
    i = Input(shape=input_shape)

    x = Dense(256, activation="relu")(i)
    x = Dropout(0.5)(x)
    x = Dense(128, activation="relu")(x)
    x = Dropout(0.5)(x)
    x = Dense(64, activation="relu")(x)
    x = Dropout(0.5)(x)
    x = Flatten()(x)

    # Optimize each binary output independently.
    o = list(map(lambda _: Dense(1, activation='sigmoid')(x), range(outputs)))

    m = Model(i, o)
    m.compile('adam', loss='binary_crossentropy', metrics=['accuracy'])
    return m

model = create_model((30, 1), 9)

哪个会产生训练错误:

  

检查模型目标时出错:您所用的Numpy数组列表   传递给您的模型不是模型期望的尺寸。预期   查看9个数组,但得到以下1个数组的列表:

[array([[1., 1., 1., ..., 0., 0., 0.],
   [1., 0., 0., ..., 0., 0., 0.],
   [0., 0., 0., ..., 0., 0., 0.],
   ...,
   [0., 0., 0., ..., 1., 1., 1.],
   [0., 0., 0., ..., 0., 0., 0....

我尝试了y_train(9, samples, 1)的{​​{1}}形状的变化。 keras如何看待我的(samples, 1, 9)数组形状转换?

1 个答案:

答案 0 :(得分:1)

您的模型有9个输出层,每个输出层都有二进制交叉熵。因此,您需要将输出作为9个输出的列表传递,其中每个输出是(samples, 1)大小的数组,而不是9列的单个数组。

因此,您需要执行以下操作。

# Assuming your y_train is of size (samples, 9)
y_train_list = np.split(y_train, y_train.shape[1], axis=1)

model.fit(x_train, y_train_list)

这是一个包含玩具数据的可行示例

x_train = np.random.normal(size=(500,30,1))
y_train = np.random.choice([0,1], size=(500, 9))
y_train_list = np.split(y_train, y_train.shape[1], axis=1)
model.fit(X_tr, y_train_list)

使用train_test_split创建火车验证数据

from sklearn.model_selection import train_test_split

tr_x, ts_x, tr_y, ts_y =train_test_split(X_tr, Y_tr, test_size=0.33)
tr_list_y = np.split(tr_y, tr_y.shape[1], axis=1)
ts_list_y = np.split(ts_y, ts_y.shape[1], axis=1)
model.fit(tr_x, tr_list_y, validation_data=(ts_x, ts_list_y))