我剛剛開始使用 Keras 訓(xùn)練一個(gè)簡(jiǎn)單的 DNN,并且正在努力設(shè)置自定義損失函數(shù),以下是模型的代碼:X_train = train_dataframe.to_numpy()[:, 0:4]Y_train = train_dataframe.to_numpy()[:, 4]model = Sequential()model.add(Dense(1000, input_shape=(4,), activation='relu'))model.add(Dense(1000, activation='relu'))model.add(Dense(Y_train.shape[0], activation='linear', activity_regularizer=regularizers.l1(0.02)))def custom_loss(y_true, y_pred): mse_loss = tf.keras.losses.mean_squared_error(y_true,np.ones((450, 4)) * y_pred) return mse_loss + y_predmodel.compile("adam", custom_loss(X_train, model.layers[2].output), metrics=["accuracy"])model.fit(X_train, Y_train, epochs=5, batch_size=1)我將簡(jiǎn)要解釋一下。我得到了一個(gè)包含 450 個(gè)樣本的訓(xùn)練集,每個(gè)樣本有 4 個(gè)特征作為輸入,以及一個(gè)與訓(xùn)練集配對(duì)的 (450,1) 數(shù)值向量?,F(xiàn)在,我想要獲得的是一種 LASSO 回歸,方法是在最后一層應(yīng)用活動(dòng)正則化器,然后構(gòu)建自定義損失函數(shù),其中我將 MSE 放在 y_true (這是輸入) y_pred 之間,y_pred 不是輸出,而是輸出層值與 (450,4) 矩陣的簡(jiǎn)單乘法(因?yàn)楹?jiǎn)單性用 1 填充)。我的問題是,當(dāng)我運(yùn)行腳本時(shí)出現(xiàn)此錯(cuò)誤:ValueError: Dimensions must be equal, but are 4 and 450 for 'mul' (op: 'Mul') with input shapes: [450,4], [?,450].也許是因?yàn)槲覜]有很好地提取輸出層的值model.layers[2].output。那么我怎樣才能使用 Keras 正確地做到這一點(diǎn)呢?
1 回答

湖上湖
TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊
我認(rèn)為你犯了兩個(gè)嚴(yán)重錯(cuò)誤:
不要傳遞 .compile 中丟失的參數(shù) keras 足夠聰明:
model.compile(loss=custom_loss, optimizer='adam', metrics=["accuracy"])
如果您想對(duì)最后一層應(yīng)用一些乘法,然后為此創(chuàng)建一個(gè)自定義層,請(qǐng)不要在損失函數(shù)內(nèi)執(zhí)行此操作;損失函數(shù)的作用只是找出預(yù)測(cè)值與真實(shí)值的差距
添加回答
舉報(bào)
0/150
提交
取消