如何使用 KERAS 获取 DNN 最后一层的值?

Posted

技术标签:

【中文标题】如何使用 KERAS 获取 DNN 最后一层的值?【英文标题】:How to get the values of the final layer of a DNN using KERAS? 【发布时间】:2021-01-21 15:00:07 【问题描述】:

我刚刚开始使用 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) 数值向量与训练集相匹配。

现在,我想要获得的是一种 LASSO 回归,方法是在最后一层应用活动正则化器,然后构建我的自定义损失函数,其中我在 y_true(输入)y_pred 之间放置一个 MSE输出,而是输出层值与 (450,4) 矩阵的简单乘法(因为 semplicity 用 1 填充)。

我的问题是我在运行脚本时遇到了这个错误:

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】:

我认为你犯了两个关键错误:

    不要为 .compile 中的损失传递参数 keras 足够聪明:

     model.compile(loss=custom_loss, optimizer='adam', metrics=["accuracy"])
    

    如果您想对最后一层应用一些乘法,然后为此创建一个自定义层,请不要在损失函数中执行此操作;损失函数的工作只是找出预测值与真实值的差距

【讨论】:

谢谢提示,所以自定义层应该放在输出层之后?以及如何检索输出层的值以便在自定义层中使用它?

以上是关于如何使用 KERAS 获取 DNN 最后一层的值?的主要内容,如果未能解决你的问题,请参考以下文章

Keras,在每个时期获取一层的输出

如何从 Keras 嵌入层获取词向量

是否可以使用 Keras 在卷积神经网络的最后一层特征上训练 SVM 或随机森林?

了解每一层的 Keras 权重矩阵

Keras:如何在损失函数中使用层的权重?

keras做DNN