【问题标题】:Custom loss function access tensor channels自定义损失函数访问张量通道
【发布时间】:2020-12-03 09:22:37
【问题描述】:

我有一个形状为 (64, 64, 2) 的 2 通道 numpy 数组作为我的 CNN 的输入。 我想构建一个自定义的损失函数,如https://www.tensorflow.org/guide/keras/train_and_evaluate 中所述:

def basic_loss_function(y_true, y_pred):
    return tf.math.reduce_mean(tf.abs(y_true - y_pred))

model.compile(optimizer=keras.optimizers.Adam(),
              loss=basic_loss_function)

model.fit(x_train, y_train, batch_size=64, epochs=3)

但我想要一些比这个基本的更复杂的东西。我需要做的是逆 DFT(ifft2d),我的 y_pred 和 y_true 应该是每个形状(64,64,2),两个通道是 fft2 的实部和虚部。如何正确访问 y_pred 和 y_true 通道(我猜这是某种 keras/张量层?)以 RealPart+1j*ImagPart 的形式重建一个复数(在 numpy 中它将是y_pred[:,:,0] 和 y_pred[:,:,1] ) ?

--> 总而言之,是否有人确切知道 y_pred 和 y_true 是什么类型的对象以及如何访问它们的通道/元素? (这并不容易调试,因为需要在编译好的 CNN 中运行,所以最好事先了解它)

【问题讨论】:

    标签: tensorflow keras


    【解决方案1】:

    y_truey_pred 是形状为 (batchsize, ...[output shape]...) 的张量。您的输入形状为(64,64,2),但我不确定您的输出是什么样子,如果您的输出确实是(64,64,2),那么y_predy_true 形状为(64,64,64,2),给定您的batchsize=64

    处理张量非常类似于 numpy 的语法,因此您可以对张量使用切片表示法,例如 y_true[:,:,:,0](注意添加的批处理维度)。

    Tensorflow 具有计算 DFT、FFT 等功能。见tf.signaltf.signal.rfft2d

    如果您的损失函数涉及对输入的操作,而不仅仅是输出y_truey_pred,那么您可以使用model.add_loss 而不是model.compile(loss= basic_loss_function),如下所示

    x = Input(shape=(64,64,2))
    y_true = Input(shape=...))
    # your CNN layers
    y_pred = Dense(128)(net)
    
    model = Model(input=[x, y_true], output=y_pred)
    model.add_loss(basic_loss_function(x, y_true, y_pred))
    

    请注意,标签(又名y_true)现在是模型的输入。

    【讨论】:

    • 非常感谢,它确实有效。我现在有另一个问题......因为我正在使用 tf2.1.0,所以我的生成器不再工作......如果你有兴趣:stackoverflow.com/questions/60583696/…
    • 我已经实现了,但是有一些问题...介意看看:stackoverflow.com/questions/60590403/…
    • @MohamedEzz 看起来您正在使用output,但从未定义它。我可以安全地假设这是一个错字,你的意思是y_pred
    猜你喜欢
    • 1970-01-01
    • 2021-02-01
    • 2018-02-22
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2021-03-09
    • 2019-09-20
    相关资源
    最近更新 更多