![](/img/trans.png)
[英]InvalidArgumentError: required broadcastable shapes [Op:Mul]
[英]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.