Как получить значения конечного уровня DNN с помощью KERAS?

#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 критические ошибки:

  1. Не передавайте аргументы для потери в .compile keras достаточно умен для этого:

      model.compile(loss=custom_loss, optimizer='adam', metrics=["accuracy"])
      
  2. Если вы хотите применить некоторое умножение к последнему слою, а затем создать для этого пользовательский слой, не делайте этого внутри функции потерь; задача функции потерь состоит только в том, чтобы выяснить, насколько далеко прогнозируемое значение от реального

Комментарии:

1. Спасибо за советы, так пользовательский слой должен быть помещен после выходного слоя? И как я могу получить значения выходного слоя, чтобы использовать его в пользовательском слое?