你好,我需要一个自定义的正则化项来添加到我的(二元交叉熵)损失函数中。有人能帮我用Tensorflow语法实现这个吗?我已经尽可能简化了一切,以便更容易帮助我。
模型输入的是10000个18 x 18的二进制配置数据集,输出的是16×16的配置集。神经网络仅包含两个卷积层。
我的模型如下所示:
import tensorflow as tffrom tensorflow.keras import datasets, layers, modelsEPOCHS = 10model = 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)
现在我写了一个函数,我想用它作为额外的正则化项。这个函数接受真实值和预测值。基本上,它将两者的每个点与其“右侧”邻居相乘,然后计算差异。我假设真实值和预测值是16×16的(而不是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 * deviationdef 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所述:
任何具有签名loss_fn(y_true, y_pred)并返回损失数组(输入批次中每个样本的损失)的可调用对象都可以作为损失传递给compile()。请注意,样本加权自动支持任何此类损失。
所以请确保返回一个损失数组(编辑:正如我现在看到的,也可以返回一个简单的标量。如果你使用例如reduce函数也没关系)。基本上y_true和y_predicted的第一维是批次大小。
这里有详细信息:https://keras.io/api/losses/