使用Pytorch创建3D内核:是否有一种简单的方法用于大型内核?



我想在3D空间中测试多个卷积核。k是一个7x7x7的交叉核,核中间的体素等于1,其余的体素等于-1。这种分配k的方法既混乱又耗时。有什么想法能让它更清晰、更简单吗?

tensor([[[[[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  1.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.]],
[[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  1.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.]],
[[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  1.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.]],
[[ 0.,  0.,  0., -1.,  0.,  0.,  0.],
[ 0.,  0.,  0., -1.,  0.,  0.,  0.],
[ 0.,  0.,  0., -1.,  0.,  0.,  0.],
[-1., -1., -1.,  1., -1., -1., -1.],
[ 0.,  0.,  0., -1.,  0.,  0.,  0.],
[ 0.,  0.,  0., -1.,  0.,  0.,  0.],
[ 0.,  0.,  0., -1.,  0.,  0.,  0.]],
[[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  1.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.]],
[[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  1.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.]],
[[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  1.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.]]]]])

您可以对列和行进行分配,给定kernel_size,在您的示例中为7
请记住,nn.Conv3d图层的形状是(out_channels=n_filters, in_channels, kernel_size_depth, kernel_size_height, kernel_size_width)

>>> n = kernel_size // 2
>>> k = torch.zeros(1,1,*(kernel_size,)*3) # define zero tensor
>>> k[...,n,n,:] = -1 # middle column at middle depth
>>> k[...,n,:,n] = -1 # middle row at middle depth
>>> k[...,n,n] = 1    # middle point at all depths

最新更新