张量流中具有循环的自定义损失

时间:2019-04-01 09:12:34

标签: python loops tensorflow tensor loss-function

我的数据处理过程中有一个函数,可以在YCbCr模式下对3D numpy数组执行逐块DCT。

def perform_blockwise_dct(img, ratio):

    imsize = img.shape
    dct_blocks = np.zeros(imsize)

    for i in np.r_[:imsize[0]:8]:
        for j in np.r_[:imsize[1]:8]:

            dct_blocks[i:(i+8),j:(j+8), 0] = dct(dct(img[i:(i+8),j:(j+8), 0].T, norm='ortho').T, norm='ortho')
            dct_blocks[i:(i+8),j:(j+8), 1] = dct(dct(img[i:(i+8),j:(j+8), 1].T, norm='ortho').T, norm='ortho')
            dct_blocks[i:(i+8),j:(j+8), 2] = dct(dct(img[i:(i+8),j:(j+8), 2].T, norm='ortho').T, norm='ortho')

    return dct_blocks

为了能够实现自定义的均方误差函数,我想反转此函数。问题在于,实现损失函数时,它是张量流张量。有一个逆DCT函数可以使用。但是,我不知道如何执行等效的双for循环来逐块执行。当前,它是在整个图像上完成的,就像这样:

    def mse_custom_loss(a, b)
        y = tf.spectral.idct(a[:,:,0], norm='ortho') 
        cb = tf.spectral.idct(a[:,:,1], norm='ortho')
        cr = tf.spectral.idct(a[:,:,2], norm='ortho') 
        a = K.stack([y, cb, cr], axis=-1)

        y = tf.spectral.idct(b[:,:,0], norm='ortho') 
        cb = tf.spectral.idct(b[:,:,1], norm='ortho')
        cr = tf.spectral.idct(b[:,:,2], norm='ortho') 
        b = K.stack([y, cb, cr], axis=-1)

        return mean_square_error(a, b)

有关如何正确执行操作的任何想法?我认为可能有lambda函数吗?

1 个答案:

答案 0 :(得分:1)

我认为这是一个相当于您的NumPy / SciPy函数的TensorFlow:

vector<uint8_t> HexToBytes(const string& hex) {
  vector<uint8_t> bytes;
  for (unsigned int i = 0; i < hex.length(); i += 2) {
    string byteString = hex.substr(i, 2);
    uint8_t byte = (uint8_t) strtol(byteString.c_str(), nullptr, 16);
    bytes.push_back(byte);
  }
  return bytes;
}

一个小测试:

{{ my_string_value | default("awesome") }}