keras / tensorflow层中的向上采样邻域

时间:2018-10-09 04:12:39

标签: python tensorflow keras

我正在尝试使用hxwxd(在我的情况下为160x60x3)从keras层中对张量/数组的nxn(在我的特定情况下为5x5)补丁进行升采样。我知道有一个用于upsampling的keras函数,称为upsample_same,但是我要执行的操作与此函数的操作有些不同。我想从左上角像素开始并采用5x5邻居,即-在所有四个方向上以两个单位为当前像素作为输入。我对整个图层进行了零填充,以便能够将第一个像素左右移动2个单位(在所有方向上都有2个单位的零垫)。然后,我通过一次移动一个像素而不是一次移动5个像素来横扫整个行。这工作正常,我能够按计划获得160x5,60x5,3大张量。我想以与上述类似的方式(即,行和列上的5x5色块)重新采样此输出800,300,3,但是这次每个单位/索引都引用5x5x3色块,而不是单个像素,因为它是整数较早的情况。我的问题是- 一个,与第一次上采样不同,我不使用零填充,并且由于第55个位置/索引之后,剩余单元数将开始变为4,3,2,1,因此补丁向上采样无法完全适应稍后连接补丁时出现错误...我该如何解决此问题?再次补零吗?如果是这样,我该怎么做,因为新的上采样层中的单位/索引是5x5x3,所以我不能像上述情况那样简单地将2d填充为零,第二个切片/修补程序提取时消耗了大量内存运行(高达30gb),它几乎冻结了我的系统-我想知道我是否可以在程序执行过程中或任何有效方式对附近进行采样的过程中释放内存。这是我在第一种情况下用于对5x5补丁进行升采样的示例代码

def upsample_neighbor_function_5_5(input_x):
input_x_pad = K.spatial_2d_padding(input_x, padding=((2, 2), 
(2, 2)))
x_length = K.int_shape(input_x)[1]
y_length = K.int_shape(input_x)[2]
output_y_list = [] 
output_x_list = [] 

for i_x in range(2, x_length + 2):
    for i_y in range(2, y_length + 2):
        output_y_list.append(input_x_pad[:, i_x - 2:i_x + 3, i_y - 
2:i_y + 3, :])
    output_x_list.append(K.concatenate(output_y_list,axis=2))
    output_y_list = []


return K.concatenate(output_x_list, axis=1)

对于第二种情况,我使用了相同的函数,但我将上述函数的输出作为新的向上采样任务的输入传递,但我在上面提出的那些问题仍然是有问题的。实际上,我在运行时不会出错,因为执行占用大量内存,从而冻结了我的机器,并最终强制中止了执行。我提到的问题是我自己的踪迹

0 个答案:

没有答案