最近Tensorflow增加了对3d卷积的支持。我在试着训练一些视频技能。
我有几个问题:
我的输入是16帧,每帧3通道的.npy
文件,所以它们的形状是:(128, 171, 48)
。
1) tf.nn.max_pool3d()
的文档说明输入的形状应该是:Shape [batch, depth, rows, cols, channels]
。是我的通道维度仍然3,即使我的npy imgs
是48通道深,可以这么说?
2)下一个问题与上一个问题相吻合:我的深度是48还是16?
3)(因为我在这里)批处理尺寸与3d数组相同,正确吗?这些图像就像任何其他图像一样,一次处理一个。
只是为了清楚:在我的情况下,对于单个图像批处理大小,上面的图像亮度,我的尺寸是:
[1(batch),16(depth), 171(rows), 128(cols), 3(channels)]
回答你的问题,尺寸应该是(如你所说):[batch_size, depth, H, W, 3]
,其中depth
是您拥有的时间框架的数量。
例如,20帧/秒的5s视频将具有depth=100
。
我最好的建议是先阅读CS231n关于深度学习的幻灯片视频(如果你能看到视频,那就更好了)。
基本上,3D卷积与2D卷积相同,只是多了一个维度。让我们回顾一下:
1D卷积(ex: text):
- 输入形状为
[batch_size, 10, in_channels]
- 内核形状为
[3, in_channels, out_channels]
- 示例:对于文本,这是一个长度为10的句子,单词嵌入为dim
in_channels
- 内核用大小为3的内核检查句子(dim 10)
二维卷积(ex: image):
- 输入形状为
[batch_size, 10, 10, in_channels]
- 内核形状为
[3, 3, in_channels, out_channels]
- ex: RGB图像,大小为10x10,
in_channels=3
- 内核用大小为3的内核检查图像(dim 10x10)
- 内核是一个在图像上滑动的正方形
3D卷积(例如:video)
- 输入形状为
[batch_size, T, 10, 10, in_channels]
- 内核形状为
[T_kernel, 3, 3, in_channels, out_channels]
- 示例:
T=100
帧的视频,以及尺寸为10x10的图像,in_channels=3
- 内核通过大小为
T_kernel
(例如:T_kernel=10
)的内核来查看视频(dim 100x10x10) - 内核就像一个立方体,在"立方体"上滑动。视频(时间* W * H)
卷积的目标是减少参数的数量,因为数据中存在冗余。对于图像,您可以在左上角的3x3框和右下角的3x3框中提取相同的基本特征。
对于视频,这是相同的。您可以从图像的3x3框中提取信息,但要在一个时间框架内(例如:10帧)。结果将具有3x3的图像维度和10帧的时间维度的接受域。