как изменить форму тензора с формой 64x4x4x3 на другую форму, аналогичную входу в сеть? - PullRequest
2 голосов
/ 30 апреля 2019

Я пытаюсь реализовать сжатие JPEG в качестве слоя шума в керасе. во время реализации мне нужно изменить форму, и я озадачен, как я могу это сделать. поэтому я пытаюсь объяснить, что я делал и что хочу делать. Во-первых, в следующей функции я произвел весь коэффициент DCT блока 8x8, который производит фильтр с формой 64x8x8. каждый из этих 64 фильтров представляет собой коэффициенты DCT для одного пикселя в конечном выходе преобразования DCT.

def gen_filters(size_x: int, size_y: int, dct_or_idct_fun: callable) -> np.ndarray:
    tile_size_x = 8
    filters = np.zeros((size_x * size_y, size_x, size_y))
    for k_y in range(size_y):
        for k_x in range(size_x):
            for n_y in range(size_y):
                for n_x in range(size_x):
                    filters[k_y * tile_size_x + k_x, n_y, n_x] = dct_or_idct_fun(n_y, k_y, size_y) * dct_or_idct_fun(n_x,
                                                                                                            k_x,
                                                                                                            size_x)
    return filters

, поскольку мы не можем использовать присваивание в кератах, мне нужно реализовать преобразование DCT с использованием слоя сгиба, используя следующий код.

    image_conv = Kr.backend.conv2d(image_yuv_ch,filters,strides=(8,8),data_format='channels_first')

но у меня есть проблемы с приведенным выше кодом. если входные данные image_yuv_ch были 32x32x1, а filters были 64x8x8, как бы я изменил форму, чтобы реализовать слой конволюции? потому что с этими формами это привело к ошибке. считает ли keras первое число в форме filters как номер фильтра и 8x8 как размер фильтра в приведенном выше коде?

У меня также есть другой вопрос. если слой с конволюцией произвел то, что я хочу, означает вывод с формой 64x4x4, поскольку мы знаем, что каждый элемент фильтра 4x4 в качестве вектора длины 64 является значением DCT блока 8x8 входного изображения, и теперь мне нужно изменить форму каждый блок 64 векторов к 8x8 и поместите их рядом друг с другом и сделайте 32x32x1 из 64x4x4. но я действительно не знаю, как я могу это сделать? у вас есть предложения для меня? Я с нетерпением жду вашего предложения. Спасибо.

...