#python #tensorflow #keras #layer
#python #тензорный поток #keras #слой
Вопрос:
Я только начал использовать Keras для обучения простого DNN, и я изо всех сил пытаюсь настроить свою пользовательскую функцию потерь, вот код модели:
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_pred
model.compile("adam", custom_loss(X_train, model.layers[2].output), metrics=["accuracy"])
model.fit(X_train, Y_train, epochs=5, batch_size=1)
Я кратко объясню. Я получил обучающий набор из 450 выборок и 4 функций для каждого в качестве входных данных и числовой вектор (450,1), сопоставленный с обучающим набором.
Теперь то, что я хотел бы получить, это своего рода регрессию ЛАССО, применив регуляризатор активности к последнему слою, а затем создав свою пользовательскую функцию потерь, где я помещаю MSE между y_true (который является входом) y_pred, который является не выходом, а простым умножением значений выходного уровня на(450,4) матрица (для полноты заполняется единицами).
Моя проблема в том, что я получил эту ошибку при запуске скрипта:
ValueError: Dimensions must be equal, but are 4 and 450 for 'mul' (op: 'Mul') with input shapes:
[450,4], [?,450].
И, возможно, это потому, что я плохо извлекаю значения выходного уровня model.layers[2].output
. Итак, как я могу сделать это правильно, используя Keras?
Ответ №1:
Я думаю, вы совершаете 2 критические ошибки:
-
Не передавайте аргументы для потери в .compile keras достаточно умен для этого:
model.compile(loss=custom_loss, optimizer='adam', metrics=["accuracy"])
-
Если вы хотите применить некоторое умножение к последнему слою, а затем создать для этого пользовательский слой, не делайте этого внутри функции потерь; задача функции потерь состоит только в том, чтобы выяснить, насколько далеко прогнозируемое значение от реального
Комментарии:
1. Спасибо за советы, так пользовательский слой должен быть помещен после выходного слоя? И как я могу получить значения выходного слоя, чтобы использовать его в пользовательском слое?