当前位置: 首页 > 知识库问答 >
问题:

将使用可训练参数在层中定义的损失纳入最终损失以进行优化

郏志学
2023-03-14

嗨,我正在尝试创建一个VariationalDenseLayer,其中KL损失在调用函数中计算。

def call(self, inputs, **kwargs):
    kernel_sigma = tf.math.softplus(self.kernel_rho)
    kernel = self.kernel_mu + kernel_sigma * tf.random.normal(self.kernel_mu.shape)

    bias_sigma = tf.math.softplus(self.bias_rho)
    bias = self.bias_mu + bias_sigma * tf.random.normal(self.bias_mu.shape)

    self.add_loss(self.kl_loss(kernel, self.kernel_mu, kernel_sigma) +
                  self.kl_loss(bias, self.bias_mu, bias_sigma))

    outputs = gen_math_ops.MatMul(a = inputs, b = kernel)

    if self.use_bias:
        outputs = nn_ops.bias_add(outputs, bias)

    if self.activation is not None:
        outputs = self.activation(outputs)

    return outputs


def kl_loss(self, w, mu, sigma):
    variational_dist = tfp.distributions.Normal(mu, sigma)
    return self.kl_weight * K.sum(variational_dist.log_prob(w) - self.log_prior_prob(w))

def log_prior_prob(self, w):
    comp_1_dist = tfp.distributions.Normal(0.0, self.prior_sigma_1)
    comp_2_dist = tfp.distributions.Normal(0.0, self.prior_sigma_2)
    return K.log(self.prior_pi_1 * comp_1_dist.prob(w) +
                 self.prior_pi_2 * comp_2_dist.prob(w))
    

然而,当我试图将我的最终损失定义为neg_log_likelihhoodkl_loss时,我得到了以下错误:

TypeError:函数构建代码之外的op被传递一个“图形”张量。通过包含tf,可以使图张量从函数构建上下文中泄漏出来。函数构建代码中的init_范围。例如,以下函数将失败:@tf。函数def具有_init_scope():my_常量=tf。常数(1)用tf。init_scope():added=my_常量*2图张量的名称为:稠密翻转/发散内核:0

如果我加上

tf.compat.v1.disable_eager_execution()

我有以下错误。然而,我仍然不清楚我做错了什么。

损失=neg_log_likelihoodkl*kl_weightFile"/d/dev01/chungh/lib2/anaconda3-2020.11/lib/python3.8/site-包/tensorflow/python/ops/math_ops.py",行1266,r_binary_op_wrappery,x=maybe_promote_tensors(y, x)File"/d/dev01/chungh/lib2/anaconda3-2020.11/lib/python3.8/site-pack/tenstorflow/python/ops/math_ops.py",第1202行,maybe_promote_tensorsops.convert_to_tensor(张量,dtype,name="x"))File"/d/dev01/chungh/lib2/anaconda3-2020.11/lib/python3.8/site-包/tenstorflow/python/探查器/trace.py",行163,在包装返回func(*args,**kwargs)文件"/d/dev01/chungh/lib2/anaconda3-2020.11/lib/python3.8/site-包/tensorflow/python/框架/ops.py",第1566行,在convert_to_tensorret=conversion_func(值,dtype=dtype,name=name,as_ref=as_ref)File"/d/dev01/chungh/lib2/anaconda3-2020.11/lib/python3.8/site-packages/tensorflow/python/framework/constant_op.py",第339行,在_constant_tensor_conversion_function返回常量(v,dtype=dtype,name=name)File"/d/dev01/chungh/lib2/anaconda3-2020.11/lib/python3.8/site-pack/tenorflow/python/框架/constant_op.py",第264行,常量返回_constant_impl(值,dtype,形状,名称,verify_shape=False,File"/d/dev01/chungh/lib2/anaconda3-2020.11/lib/python3.8/site-包/Tenorflow/python/框架/constant_op.py",第281行,_constant_impltensor_util.make(File"/d/dev01/chungh/lib2/anaconda3-2020.11/lib/python3.8/site-包/tensorflow/python/框架/tensor_util.py",第457行,make_tensor_proto_AssertCompatible(值,dtype)File"/d/dev01/chungh/lib2/anaconda3-2020.11/lib/python3.8/site-包/tensorflow/python/框架/tensor_util.py",行336,在_AssertCompatible引发TypeError("期望%s,得到%s的类型'%s'代替。"%TypeError:预期浮动32,得到

计算最终损失的代码是:

def neg_log_likelihood(y_obs, y_pred, sigma=noise):
    dist = tfp.distributions.Normal(loc=y_pred, scale=sigma)
    return K.sum(-dist.log_prob(y_obs))

kl = sum(model.losses)
loss = kl * kl_weight

model.compile(loss=loss, optimizer=optimizers.Adam(lr=0.08), metrics=['mse'])

非常感谢您的帮助和指点!

共有1个答案

颜思淼
2023-03-14

我假设您已经检查了Tensorflow中的变分层实现。

您可以参考这个使用FlipOut层的示例实现。

 类似资料:
  • 我为文本分类问题设计了一个网络。为此,我使用huggingface transformet的BERT模型,上面有一个线性层进行微调。我的问题是训练集上的损失在减少,这很好,但是当涉及到在开发集上的每个时代之后进行评估时,损失会随着时代而增加。我正在发布我的代码来调查它是否有问题。 下面是训练器文件,我使用它对给定批次进行前向传递,然后相应地反向传播。 最后,以下是我的模型(即分类器)类: 为了可视

  • 关于使用Lenet5网络解释MNIST上某些优化器的性能,我有几个问题,以及验证损失/精度与训练损失/精度图确切地告诉我们什么。因此,所有的事情都是在Keras中使用标准的LeNet5网络完成的,它运行了15个历元,批处理大小为128。 有两个图,列车acc vs val acc和列车损失vs val损失。我生成了4个图,因为我运行了两次,一次是validation_split=0.1,一次是va

  • 问题内容: 我有一个“一键编码”(全1和全0)的数据矩阵,具有260,000行和35列。我正在使用Keras训练简单的神经网络来预测连续变量。组成网络的代码如下: 但是,在训练过程中,我看到损失下降得很好,但是在第二个时期的中间,它就变成了nan: 我尝试使用代替,尝试替代,尝试使用和不使用辍学,但都无济于事。我尝试使用较小的模型,即仅具有一个隐藏层,并且存在相同的问题(在不同的点它变得很困难)。

  • 我是pytorch的新手,我正在尝试运行我找到的github模型并对其进行测试。因此,作者提供了模型和损失函数。 像这样: 数据加载 假设我想训练这个模型15个时代。这就是我到目前为止所做的:我正在尝试设置优化器和训练,但我不确定如何将自定义丢失和数据加载绑定到模型,并正确设置15个历元训练。 有什么建议吗?

  • 本文向大家介绍TensorFlow如何用于定义损失函数,优化器,训练模型并在Python中的IMDB数据集上对其进行评估?,包括了TensorFlow如何用于定义损失函数,优化器,训练模型并在Python中的IMDB数据集上对其进行评估?的使用技巧和注意事项,需要的朋友参考一下 Tensorflow是Google提供的一种机器学习框架。它是一个开放源代码框架,可与Python结合使用,以实现算法,

  • 嗨,我一直试图使一个自定义损失函数在kerasdice_error_coefficient。它有它的实现在张量板和我尝试使用相同的函数在keras与张量流但它不断返回一个NoneType当我使用model.train_on_batch或model.fit在那里,因为它给适当的值时,使用在模型中的指标...能不能请人帮帮我我该怎么办?我尝试过跟随像Keras-FCN这样的库,在那里他使用了自定义损失