【问题标题】:Keras multiple output numpy transformationKeras多输出numpy转换
【发布时间】:2019-12-14 07:39:19
【问题描述】:

我有一个(samples, 9) 形状的y_train 数据集。我的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)(samples, 1, 9)。 keras 想看到我的(samples, 9) 数组形状如何变化?

【问题讨论】:

    标签: python numpy tensorflow keras


    【解决方案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))
    

    【讨论】:

    • 这样,我收到一个错误:Found input variables with inconsistent numbers of samples: [samples, 9]
    • 您的 y_train 必须是 [samples, 9]。您可能传递了不同大小的y_train
    • 如果我print(y_train.shape),它返回(4994, 9),其中4994是样本数。在 np.split 之后,print(len(y_train), y_train[0].shape) 返回错误所在的9 (4994, 1)
    • @iRyanBell 我在我的问题中添加了一个工作示例。您能否将您的数据与玩具数据进行比较,看看它们的形状是否正确?
    • @thrushv89 知道了。那成功了!我有一个训练验证拆分,这使测试变得复杂。
    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 2018-09-14
    • 1970-01-01
    • 2018-07-29
    相关资源
    最近更新 更多