首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何引用tensorflow角的地面真相变量?

如何引用tensorflow角的地面真相变量?
EN

Stack Overflow用户
提问于 2021-10-28 21:36:50
回答 1查看 267关注 0票数 2

我试图在我的模型中添加一个自定义丢失,并需要对目标变量的引用才能做到这一点。例如。

代码语言:javascript
复制
model = Model(inputs=[x1, x2, x3], outputs=[y1,y2,y3])
mse = tf.keras.losses.MeanSquaredError()
model.add_loss(mse(x1, dec_x1))

在这里,我在一个输入变量和一个编码的、然后解码的变量之间添加了一个丢失。但我也希望能够增加一个损失,它取决于y变量的基本真理(不是预测的y1、y2、y3),即想象y1_true,然后添加一个损失:

代码语言:javascript
复制
# Code to make Y1 which depends on x1, x2, x3
model.add_loss(mse(Y1, y1_true))

但是如何访问keras中的y1_true呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-29 07:35:47

不幸的是,add_loss函数无法访问y1_true标签。此方法实际上是为了在您的模型中进行正则化损失:

在编写自定义层或子类模型的调用方法时,您可能希望计算在培训期间希望最小化的标量量(例如正则化损失)。您可以使用add_loss() layer方法来跟踪此类损失项。

有关更多信息,请参见文档。我认为使用自定义训练回路会好得多,在那里您可以直接访问所需的一切。下面是一个简化的示例:

代码语言:javascript
复制
class Autoencoder(tf.keras.Model):
  def __init__(self, latent_dim):
    super(Autoencoder, self).__init__()

    self.latent_dim = latent_dim
    self.dense1 = tf.keras.layers.Dense(self.latent_dim, activation='relu')
    self.dense2 = tf.keras.layers.Dense(5, activation='relu')
    e_input1 = tf.keras.Input(shape=(5,))
    e_input2 = tf.keras.Input(shape=(5,))
    e_input3 = tf.keras.Input(shape=(5,))
    e_output1 = self.dense1(e_input1)
    e_output2 = self.dense1(e_input2)
    e_output3 = self.dense1(e_input3)

    self.encoder = tf.keras.Model([e_input1, e_input2, e_input3], [e_output1, e_output2, e_output3])

    d_input1 = tf.keras.Input(shape=(self.latent_dim,))
    d_input2 = tf.keras.Input(shape=(self.latent_dim,))
    d_input3 = tf.keras.Input(shape=(self.latent_dim,))

    d_output1 = self.dense2(d_input1)
    d_output2 = self.dense2(d_input2)
    d_output3 = self.dense2(d_input3)
    
    self.decoder = tf.keras.Model([d_input1, d_input2, d_input3], [d_output1, d_output2, d_output3])

  def encode(self, inputs):
    x1, x2, x3 = inputs
    return self.encoder([x1, x2, x3])
  
  def decode(self, inputs):
    x1, x2, x3 = inputs
    return self.decoder([x1, x2, x3])


latent_dim = 5 
autoencoder = Autoencoder(latent_dim) 
optimizer = tf.keras.optimizers.Adam()
mse = tf.keras.losses.MeanSquaredError()


your_train_dataset = tf.data.Dataset.from_tensor_slices((tf.random.normal((4, 5)), 
                                                         tf.random.normal((4, 5)), 
                                                         tf.random.normal((4, 5)), 
                                                         tf.random.normal((4, 5)),
                                                         tf.random.normal((4, 5)),
                                                         tf.random.normal((4, 5)))).batch(2)
epochs = 2
for epoch in range(epochs):
    for batch in your_train_dataset:
        x1_batch_train, x2_batch_train, x3_batch_train, y1_batch_train, y2_batch_train, y3_batch_train = batch
        with tf.GradientTape() as tape:
            enc_x1, enc_x2, enc_x1 = autoencoder.encode([x1_batch_train, x2_batch_train, x3_batch_train])
            dec_x1, dec_x2, dec_x1 = autoencoder.decode([enc_x1, enc_x2, enc_x1])

            loss1 = mse(x1_batch_train, enc_x1)
            loss2 = mse(x1_batch_train, dec_x1)
            loss3 = mse(dec_x1, y1_batch_train)
            #..... and so on.

            losses = loss1 + loss2 + loss3
            tf.print(losses)
        grads = tape.gradient(losses, autoencoder.trainable_weights)
        optimizer.apply_gradients(zip(grads, autoencoder.trainable_weights))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69761229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档