已解決:見 Marco Cerliani 的評論。tl;dr 每個輸出都必須作為單獨的陣列傳遞給模型。
我有一個神經網路,要估計兩個不同的目標:
目標 #1是 0-infinity,最終單節點密集層使用“線性”激活函式。
目標 #2是 0-1 縮放的,最終單節點密集層使用“sigmoid”激活函式。
兩個輸出都使用 MAE 損失,但目標 #2 的 MAE 幾乎與目標 #1 一樣高。由于 Target #2 是 0-1,而 sigmoid 只能給出 0-1 的輸出,我希望 Target #2 的損失不能大于 1。
事實上,當我只在單個輸出模型中估計目標 #2 時,我總是會得到 <1 的損失。只有在使用多輸出時才會出現問題。
這是一個錯誤,還是我做錯了什么?
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-5)
mae_loss = tf.keras.losses.MeanAbsoluteError()
rmse_metric = tf.keras.metrics.RootMeanSquaredError()
inputs = tf.keras.layers.Input(shape=(IMG_SIZE, IMG_SIZE, CHANNELS))
model = tf.keras.applications.vgg16.VGG16(include_top=False, input_tensor=inputs,
weights='imagenet')
# Freeze the pretrained weights if needed
model.trainable = True
# Rebuild top
x = tf.keras.layers.GlobalAveragePooling2D(name='avg_pool')(model.output)
x = tf.keras.layers.BatchNormalization()(x)
top_dropout_rate = 0.0 # adjustable dropout
x = tf.keras.layers.Dropout(top_dropout_rate, name='top_dropout')(x)
x = tf.keras.layers.Dense(512, activation='relu', name='dense_top_1')(x)
output_1 = tf.keras.layers.Dense(1, activation='linear', name='output_1')(x)
output_2 = tf.keras.layers.Dense(1, activation='sigmoid', name='output_2')(x)
model = tf.keras.Model(inputs, [output_1, output_2],
name='VGG16_modified')
model.compile(optimizer=optimizer, loss=mae_loss, metrics=rmse_metric)
model.fit(X_train, y_train, batch_size=16, epochs=epochs, validation_data=[X_val, y_val], verbose=1)
我還嘗試使用兩個單獨的損失進行顯式編譯:
model.compile(optimizer=optimizer, loss=[mae_loss, mae_loss], metrics=[rmse_metric, rmse_metric])
示例目標:
[[2.05e 02 7.45e-01]
[1.33e 02 1.46e-01]
[8.00e 01 2.77e-01]
[8.30e 01 4.29e-01]
[9.80e 01 1.50e-01]
[6.10e 01 3.10e-01]
[1.00e 02 4.09e-01]
[2.20e 02 9.17e-01]
[1.20e 02 1.52e-01]]
終端輸出(部分裁剪,但你明白了(考慮到 sigmoid 函式和以上目標,損失 #2 應該不可能 > 76):

TensorFlow v.2.8.0
uj5u.com熱心網友回復:
您的模型需要 2 個目標 (output_1和output_2),而您在 期間僅用y_train作目標model.fit。
您應該以這種方式通過兩個單獨的目標來擬合您的模型:
model.fit(X_train, [y_train[:,[0]],y_train[:,[1]]], ...)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/466788.html
上一篇:訓練FF神經語言模型
