python - Tensorflow 自定义正则化术语将预测与真实值进行比较

标签 python tensorflow machine-learning conv-neural-network loss-function

您好,我需要一个自定义正则化项来添加到我的(二元交叉熵)损失函数中。有人可以帮我用 Tensorflow 语法来实现这个吗? 我尽可能地简化了一切,这样可以更轻松地帮助我。

该模型采用 10000 个 18 x 18 二进制配置的数据集作为输入,并以 16x16 的配置集作为输出。该神经网络仅由 2 个卷积层组成。

我的模型如下所示:

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
EPOCHS = 10
model = models.Sequential()
model.add(layers.Conv2D(1,2,activation='relu',input_shape=[18,18,1]))
model.add(layers.Conv2D(1,2,activation='sigmoid',input_shape=[17,17,1]))
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),loss=tf.keras.losses.BinaryCrossentropy())
model.fit(initial.reshape(10000,18,18,1),target.reshape(10000,16,16,1),batch_size = 1000, epochs=EPOCHS, verbose=1)
output = model(initial).numpy().reshape(10000,16,16) 

现在我编写了一个函数,我想将其用作附加正则化项以作为正则化项。该函数采用真实值和预测值。基本上,它将两者的每个点与其“右”邻居相乘。然后取差值。我假设真实项和预测项是 16x16(而不是 10000x16x16)。这是正确的吗?

def regularization_term(prediction, true):
    order = list(range(1,4))
    order.append(0)
    
    deviation = (true*true[:,order]) - (prediction*prediction[:,order])
    deviation = abs(deviation)**2
    return 0.2 * deviation

我真的很感激一些帮助,将这样的函数作为正则化项添加到我的损失中,以帮助神经网络更好地训练这种“右邻居”交互。我真的很难使用可定制的 Tensorflow 功能。 谢谢,非常感谢。

最佳答案

这很简单。您需要指定一个自定义损失,在其中定义添加正则化项。像这样的事情:

# to minimize!
def regularization_term(true, prediction):
    order = list(range(1,4))
    order.append(0)
    
    deviation = (true*true[:,order]) - (prediction*prediction[:,order])
    deviation = abs(deviation)**2
    return 0.2 * deviation

def my_custom_loss(y_true, y_pred):
    return tf.keras.losses.BinaryCrossentropy()(y_true, y_pred) + regularization_term(y_true, y_pred)


model.compile(optimizer='Adam', loss=my_custom_loss)

正如 keras 所说:

Any callable with the signature loss_fn(y_true, y_pred) that returns an array of losses (one of sample in the input batch) can be passed to compile() as a loss. Note that sample weighting is automatically supported for any such loss.

因此请务必返回一组损失 ( EDIT: as I can see now it is possible to return also a simple scalar. It doesn't matter if you use for example the reduce function )。 基本上 y_true 和 y_predicted 将批量大小作为第一个维度

此处详细信息:https://keras.io/api/losses/

关于python - Tensorflow 自定义正则化术语将预测与真实值进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65200697/

相关文章:

python - 从列表中删除字典的子集

python - Tensorboard 中的 HParams、运行 ID 和命名

machine-learning - 为什么这个 tf.placeholder 必须是 float ?

python - 加权铰链损失函数

python - 可以处理数据中 NaN 的 scikit-learn 分类器?

python - 处理类中的 tensorflow session

python - Bloomberg APIv3 获取引用数据覆盖

python - 自动编码器 : accuracy & number of images

tensorflow - 来自 Tensorflow 中 4-D 张量的 tf.nn.top_k 索引的二进制掩码?

python - 用垂直线绘制 pandas 数据框