PyTorch对2个2通道的5x4x3的体积数据,使用一个3x2x1的卷积核进行卷积,输出通道数变为3。
import torch
# 定义输入数据
input_data = torch.randn(2, 2, 5, 4, 3)
print(input_data.shape)
print(input_data)
# 定义卷积层
conv_layer = torch.nn.Conv3d(in_channels=2,
out_channels=3,
kernel_size=(3, 2, 1))
# 执行卷积操作
output_data = conv_layer(input_data)
print(output_data.shape) # 输出数据大小为 [2, 3, 3, 3, 3]
print(output_data)
输出结果:
torch.Size([2, 2, 5, 4, 3]) tensor([[[[[-2.2551, 1.8762, 0.9093], [-1.7491, 0.4743, 1.0860], [ 0.4244, 0.2500, 0.5701], [ 0.0351, -0.1341, 0.5168]], [[-0.9098, -0.1177, -0.6377], [ 0.5954, -0.5134, 0.8410], [ 0.9537, -0.5295, 2.1060], [ 1.2345, 0.3172, -0.0933]], [[ 0.7846, 1.6091, -1.2342], [ 0.2019, -0.1042, -0.2088], [-1.5975, -0.2866, 1.8364], [ 1.2532, -0.8723, 1.5267]], [[-0.5136, -0.6781, 0.8217], [-0.1457, -0.0252, 0.9866], [-0.3281, 1.3499, 0.7433], [-0.8644, 2.3591, 2.0216]], [[-0.2558, -0.5571, 0.5808], [-0.7241, 0.0676, 0.3299], [ 0.6700, -0.0186, -1.0560], [ 2.0923, 0.3727, 0.6217]]], [[[-0.6137, 0.4911, 0.1814], [-0.9086, -0.4520, -1.0195], [ 0.1902, 1.7698, -0.4411], [ 0.0367, -2.1763, -1.8843]], [[ 0.2941, 2.2297, 0.2112], [-0.8202, 2.3166, -2.4794], [-1.4520, 0.1378, 0.0831], [ 0.2710, -0.1140, 0.2289]], [[ 1.0764, 0.8957, 0.3158], [ 0.8457, -0.1029, 0.3473], [-0.6704, -0.4978, 1.5054], [ 0.6096, -0.6333, -0.0687]], [[-1.5285, -2.1601, 0.3354], [-0.2245, 0.4753, -0.7743], [-0.4968, -0.0827, 0.0913], [ 0.0222, 1.9793, 0.6967]], [[-0.0547, 0.0232, 0.8391], [ 1.4277, 1.3289, -0.7146], [ 1.2303, -2.2422, -2.6630], [-0.5919, -1.8626, -0.5085]]]], [[[[-1.0477, -1.0734, -0.8632], [-0.9833, -0.4233, 0.5288], [-0.9997, -0.5527, 0.4101], [ 0.0374, -0.4946, 1.9740]], [[-0.5776, 0.3546, 0.3264], [-0.6250, 0.9828, 1.0864], [ 0.1073, 1.1729, 0.1233], [-0.3755, -1.3044, 0.0986]], [[-1.2472, 0.9524, -1.9337], [ 0.3735, 1.2111, 0.7463], [ 1.5011, -2.3658, 0.0341], [-0.3289, 1.1919, 0.1201]], [[ 0.2477, -0.7489, -0.7459], [-0.1654, -0.8519, -1.9785], [-0.2175, 1.2661, 0.2153], [ 1.5167, 0.7904, 1.6788]], [[-0.2949, 0.8620, 0.3485], [ 1.0321, 0.0322, 0.8339], [ 1.3897, -0.3010, 0.5383], [-0.0753, -0.4847, -0.2365]]], [[[-0.1044, 0.4620, 0.7319], [ 0.2302, 0.0262, -0.9037], [-0.3036, -0.8206, 0.2374], [ 0.2612, 0.8650, -1.3442]], [[ 0.3538, 1.1530, 0.3804], [-1.0026, 0.7600, 0.6268], [-0.5890, 0.5478, -0.7653], [-0.3495, 0.0538, 1.1723]], [[ 0.9474, 0.5959, 0.4884], [-1.2340, -0.5679, -0.8211], [ 0.0709, -0.9129, -0.2954], [-0.2687, -0.8606, -1.9036]], [[-0.4183, -0.5826, 0.6255], [-0.2705, -1.0747, -0.6064], [-0.2809, 0.6190, 0.7359], [-0.2480, 2.1299, -0.6461]], [[ 2.4983, -0.1545, -1.5769], [-0.3627, -0.6923, 1.0241], [ 0.8108, 1.4751, -0.9881], [-0.8135, -0.1123, -0.2111]]]]]) torch.Size([2, 3, 3, 3, 3]) tensor([[[[[-0.1662, -0.2569, -0.7138], [-0.7776, 0.6162, -0.5957], [ 0.6610, -0.2079, -0.6501]], [[ 0.9971, 1.8393, -0.2067], [-0.1489, 0.7793, -0.4629], [-0.7375, 0.4156, 0.1187]], [[-0.2325, -0.3271, 0.0641], [ 0.1209, -0.4605, -0.0308], [ 0.5098, 0.7675, 0.7138]]], [[[ 1.3187, -1.5053, 0.3868], [ 1.0014, -0.7746, 2.0975], [ 1.7284, -0.3720, 0.4202]], [[ 0.0904, 0.5301, -0.5519], [-0.7908, 0.5951, -0.1777], [-0.1958, 0.7541, 0.6435]], [[ 0.5478, 0.6514, 0.8858], [ 1.2833, 0.1298, -0.5012], [ 0.4759, 0.5628, -0.1031]]], [[[-0.0203, -0.1382, -0.2519], [-0.1873, -0.0148, -0.3380], [-0.4782, -0.0333, -1.0595]], [[-0.9037, -0.5245, -0.5286], [-0.8268, -0.3960, -0.2062], [ 0.4748, -0.9875, -0.3498]], [[-0.0092, 0.1123, -0.2730], [-0.2261, 0.4015, -0.0370], [-0.9644, 0.2676, -0.2092]]]], [[[[ 0.5949, 0.5485, 0.8341], [ 0.6573, -0.6114, -0.0787], [-0.2610, 1.9108, -0.1707]], [[-0.0754, 0.2263, -0.7392], [-0.3371, 1.0639, 0.4181], [ 0.6580, -0.9818, -0.0117]], [[-0.0329, -0.6175, 1.1982], [-0.1406, -0.5078, -0.7542], [-1.2171, 0.3305, -0.4895]]], [[[ 0.6026, 0.5057, 1.0142], [ 0.7969, -0.2565, -0.0621], [ 0.1117, 0.8590, -0.7177]], [[-0.1182, 0.0791, -0.5745], [ 1.0970, 0.0877, 0.9835], [ 0.8267, 0.6727, 0.6993]], [[ 1.0547, -0.9257, -0.1850], [ 0.0687, 1.0054, -0.4995], [-0.1187, 1.0915, 0.1494]]], [[[-0.0869, -0.2858, -0.7185], [-0.0740, 0.2515, -0.3514], [-0.2124, -0.9353, -0.5132]], [[ 0.1691, -0.1786, 0.5258], [-0.0710, -1.3946, -0.6208], [-0.7662, 0.9605, -0.1005]], [[-0.9194, -0.1611, -1.3769], [-0.7140, 0.9090, 0.6599], [ 0.7931, -1.3090, -0.0885]]]]], grad_fn=<ConvolutionBackward0>)
对于输入2个2通道的5x4x3的体积数据,可以说明共有240个元素
-----------------------------------------------------------------------------------------------
[[-2.2551, 1.8762, 0.9093],
[-1.7491, 0.4743, 1.0860],
[ 0.4244, 0.2500, 0.5701],
[ 0.0351, -0.1341, 0.5168]]可以表示体积数据第一层的12个元素,也就是4x3,四行三列,用2个[ ]表示
-----------------------------------------------------------------------------------------------
[[[-2.2551, 1.8762, 0.9093],
[-1.7491, 0.4743, 1.0860],
[ 0.4244, 0.2500, 0.5701],
[ 0.0351, -0.1341, 0.5168]],[[-0.9098, -0.1177, -0.6377],
[ 0.5954, -0.5134, 0.8410],
[ 0.9537, -0.5295, 2.1060],
[ 1.2345, 0.3172, -0.0933]],[[ 0.7846, 1.6091, -1.2342],
[ 0.2019, -0.1042, -0.2088],
[-1.5975, -0.2866, 1.8364],
[ 1.2532, -0.8723, 1.5267]],[[-0.5136, -0.6781, 0.8217],
[-0.1457, -0.0252, 0.9866],
[-0.3281, 1.3499, 0.7433],
[-0.8644, 2.3591, 2.0216]],[[-0.2558, -0.5571, 0.5808],
[-0.7241, 0.0676, 0.3299],
[ 0.6700, -0.0186, -1.0560],
[ 2.0923, 0.3727, 0.6217]]]可以表示体积数据第一个通道的5层4x3大小的60个元素,用3个[ ]表示
同理第二个通道也是5层4x3大小的60个元素,用3个[ ]表示
-----------------------------------------------------------------------------------------------
两个通道的元素构成一个2通道的5x4x3的体积数据,共有120个元素,用4个[ ]表示
-----------------------------------------------------------------------------------------------
共有两个2通道的5x4x3的体积数据,共有240个元素,用5个[ ]表示
对于输出的2个3通道的3x3x3大小的体积数据,也是同样的道理,共有162个元素。
-----------------------------------------------------------------------------------------------
体积数据第一层有9个元素,也就是3x3,三行三列,用2个[ ]表示
-----------------------------------------------------------------------------------------------
体积数据第一个通道有3层3x3大小的27个元素,用3个[ ]表示
同理第二个通道也是3层3x3大小的27个元素,用3个[ ]表示
同理第三个通道也是3层3x3大小的27个元素,用3个[ ]表示
-----------------------------------------------------------------------------------------------
三个通道的元素构成一个3通道的3x3x3的体积数据,共有81个元素,用4个[ ]表示
-----------------------------------------------------------------------------------------------
共有两个3通道的3x3x3的体积数据,共有162个元素,用5个[ ]表示
对5x4x3的输入体积数据使用3x2x1的卷积核进行卷积,输出大小3x3x3
对5x5x5的输入体积数据使用3x3x3的卷积核进行卷积,输出大小3x3x3
对5x6x7的输入体积数据使用3x3x3的卷积核进行卷积,输出大小3x4x5
由此可知,把axbxc想象成一个a层的bxc大小的体积数据,采用mxnxk的卷积核进行卷积,输出大小为(a-m+1)x(b-n+1)x(c-k+1),这样计算大小很快。