簡體   English   中英

節點 mul_1 需要可廣播的形狀

[英]Node mul_1 required broadcastable shapes

作為參考/跟進我的問題: 以前問過但沒有回答

我可以通過避免創建 model 對象,添加額外的維度並指定要連接的軸來編譯我的 model

def make_model(input_shape, input_shape_feat):
    base_input_layer = tf.keras.layers.Input(input_shape)
    base_input_layer = normalizer(base_input_layer)

    conv0 = keras.layers.Conv1D(filters=512, kernel_size=16, padding="same")(base_input_layer)
    conv0 = keras.layers.BatchNormalization()(conv0)
    conv0 = keras.layers.ReLU()(conv0)
    conv0 = keras.layers.Dropout(0.5)(conv0)

    conv1 = keras.layers.Conv1D(filters=256, kernel_size=8, padding="same")(conv0)
    conv1 = keras.layers.BatchNormalization()(conv1)
    conv1 = keras.layers.ReLU()(conv1)
    conv1 = keras.layers.Dropout(0.5)(conv1)

    conv2 = keras.layers.Conv1D(filters=128, kernel_size=8, padding="same")(conv1)
    conv2 = keras.layers.BatchNormalization()(conv2)
    conv2 = keras.layers.ReLU()(conv2)
    conv2 = keras.layers.Dropout(0.5)(conv2)

    conv3 = keras.layers.Conv1D(filters=64, kernel_size=8, padding="same")(conv2)
    conv3 = keras.layers.BatchNormalization()(conv3)
    conv3 = keras.layers.ReLU()(conv3)
    conv3 = keras.layers.Dropout(0.5)(conv3)

    conv4 = keras.layers.Conv1D(filters=32, kernel_size=4, padding="same")(conv3)
    conv4 = keras.layers.BatchNormalization()(conv4)
    conv4 = keras.layers.ReLU()(conv4)
    conv4 = keras.layers.Dropout(0.5)(conv4)

    gap = keras.layers.GlobalAveragePooling1D()(conv4)
    gap = keras.layers.Flatten()(gap)
    gap = keras.layers.Reshape(target_shape=(1, 32))(gap)


    additional_input_layer = keras.Input(input_shape_feat)
    additional_input_layer = normalizer_feat(additional_input_layer)

    Y = keras.layers.Dense(32, activation='relu')(additional_input_layer)
    Y = keras.layers.BatchNormalization()(Y)

    Y = keras.layers.Dense(32, activation='relu')(Y)
    Y = keras.layers.BatchNormalization()(Y)

    Y = keras.layers.Dense(32, activation='relu')(Y)
    Y = keras.layers.BatchNormalization()(Y)


    Z = keras.layers.concatenate([gap, Y], axis=1)


    Z = keras.layers.Dense(10, activation='relu')(Z)
    Z = keras.layers.BatchNormalization()(Z)

    Z = keras.layers.Dense(5, activation='relu')(Z)
    Z = keras.layers.BatchNormalization()(Z)

    Z = keras.layers.Dense(4, activation='relu')(Z)
    Z = keras.layers.BatchNormalization()(Z)

    Z = keras.layers.Dense(num_classes, activation="softmax")(Z)

    return keras.Model([base_input_layer, additional_input_layer], Z)


model = make_model(input_shape=x_train.shape[1:], input_shape_feat=x_train_feat.shape[1:])
keras.utils.plot_model(model, show_shapes=True)

它實際上編譯並顯示了下圖:

在此處輸入圖像描述

現在我真的想裝我的 model

epochs = 100
batch_size = 8

callbacks = [
    keras.callbacks.ModelCheckpoint(
        "best_model.h5", save_best_only=True, monitor="val_loss"
    ),
    keras.callbacks.ReduceLROnPlateau(
        monitor="val_loss", factor=0.5, patience=20, min_lr=0.0001
    ),
    keras.callbacks.EarlyStopping(monitor="val_loss", patience=50, verbose=1),
]
model.compile(
    optimizer="adam",
    loss="sparse_categorical_crossentropy",
    metrics=[_get_f1], #    "sparse_categorical_accuracy"
)
history = model.fit(
    [x_train, x_train_feat],
    y_train,
    batch_size=batch_size,
    epochs=epochs,
    callbacks=callbacks,
    validation_split=0.2,
    verbose=1,
)

但我收到以下錯誤

---> 18 history = model.fit(...) 節點:“mul_1”需要可廣播的形狀...

我想通了。

問題出在輸入 (2D) 和 output (1D) 的維度不匹配,因為我只有一個 class label 作為 output。

解決方案是在最終 output 層之前展平

Z = keras.layers.Flatten()(Z)
Z = keras.layers.Dense(num_classes, activation="softmax")(Z)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM