如何在keras中减去频道明智的意思?

问题描述 投票:0回答:1

我已经实现了一个lambda函数来调整图像大小从28x28x1到224x224x3。我需要从所有通道中减去VGG均值。当我尝试这个时,我得到一个错误

TypeError:'Tensor'对象不支持项目分配

def try_reshape_to_vgg(x):
    x = K.repeat_elements(x, 3, axis=3)
    x = K.resize_images(x, 8, 8, data_format="channels_last")
    x[:, :, :, 0] = x[:, :, :, 0] - 103.939
    x[:, :, :, 1] = x[:, :, :, 1] - 116.779
    x[:, :, :, 2] = x[:, :, :, 2] - 123.68
    return x[:, :, :, ::-1]

什么是推算元素减法的推荐解决方案?

machine-learning tensorflow deep-learning keras tensor
1个回答
3
投票

在Keras 2.1.2之后,您可以在张量上使用keras.applications.imagenet_utils.preprocess_input。它将在默认模式x下从'caffe'中减去VGG均值。

from keras.applications.imagenet_utils import preprocess_input

def try_reshape_to_vgg(x):
    x = K.repeat_elements(x, 3, axis=3)
    x = K.resize_images(x, 8, 8, data_format="channels_last")
    x = preprocess_input(x)
    return x

如果你想留在Keras的旧版本中,也许你可以检查它在Keras 2.1.2中的实现方式,并将有用的行提取到try_reshape_to_vgg中。

def _preprocess_symbolic_input(x, data_format, mode):
    global _IMAGENET_MEAN

    if mode == 'tf':
        x /= 127.5
        x -= 1.
        return x

    if data_format == 'channels_first':
        # 'RGB'->'BGR'
        if K.ndim(x) == 3:
            x = x[::-1, ...]
        else:
            x = x[:, ::-1, ...]
    else:
        # 'RGB'->'BGR'
        x = x[..., ::-1]

    if _IMAGENET_MEAN is None:
        _IMAGENET_MEAN = K.constant(-np.array([103.939, 116.779, 123.68]))
    # Zero-center by mean pixel
    if K.dtype(x) != K.dtype(_IMAGENET_MEAN):
        x = K.bias_add(x, K.cast(_IMAGENET_MEAN, K.dtype(x)), data_format)
    else:
        x = K.bias_add(x, _IMAGENET_MEAN, data_format)
    return x
© www.soinside.com 2019 - 2024. All rights reserved.