«ValueError: ни одно значение не поддерживается» при вызове функции SubpixelConv2D - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь использовать функцию SubpixelConv2D

Я тренирую GAN и хотел увеличить выборку с использованием субпикселя вместо интерполяции или транспонирования свертки из-за оставленных ими артефактов.

Я использую Tensorflow / 1.4.0 и Keras / 2.2.4

Когда я пытаюсь вызвать функцию, я получаю следующую ошибку:

"ValueError:Ни одно из значений не поддерживается. "

Я вызываю функцию, используя:

import tensorflow as tf
from tensorflow import keras
import Utils

def up_sampling_block(model):

    #model = keras.layers.Conv2DTranspose(filters = filters, kernel_size = kernal_size, strides = strides, padding = "same")(model)
    model = Utils.SubpixelConv2D(model)(model)
    #model = keras.layers.UpSampling2D(size = 2)(model)
    #model = keras.layers.Conv2D(filters = filters, kernel_size = kernal_size, strides = strides, padding = "same")(model)
    #model = keras.layers.LeakyReLU(alpha = 0.2)(model)

    return model

, и функция выглядит следующим образом:

# Subpixel Conv will upsample from (h, w, c) to (h/r, w/r, c/r^2)
def SubpixelConv2D(input_shape, scale=4):
    def subpixel_shape(input_shape, scale):
        dims = [input_shape[0], input_shape[1] * scale, input_shape[2] * scale, int(input_shape[3] / (scale ** 2))]             
        output_shape = tuple(dims)
        return output_shape

    def subpixel(x):
        return tf.depth_to_space(x, scale)

    return keras.layers.Lambda(subpixel, subpixel_shape)

Размервходной тензор равен (?, 48,48,64), и я считаю "?"потому что размер пакета вызывает ошибку, но я не могу решить проблему.

1 Ответ

0 голосов
/ 25 апреля 2019

Вторая функция слоя Lambda должна быть функцией только входной фигуры: subpixel_shape(input_shape), но вы берете второй аргумент с именем scale, который по умолчанию равен undefined, когда передается только input_shape. Попробуйте вместо этого передать lambda input_shape: subpixel_shape(input_shape, scale) в keras.layers.Lambda функцию. Тогда шкала по умолчанию будет равна 4, как диктует внешняя функция. Или удалите scale из аргументов функции subpixel_shape:

def outer(a=0):
    def inner():
        print(a)

    return inner

print(outer()()) # prints 0
...