我使用TFLearn在Python中有一个3D卷积神经网络。
示例代码如下:
def model_3d(self):
"""
This function will build our 3D Convolutional Neural Network
"""
#Layers
net = tflearn.input_data(shape=[None, 40, 80, 80, 3], name='InputLayer')
net = tflearn.layers.conv.conv_3d(net, 32, filter_size=(3, 3, 3), activation='relu', name='Conv3D1')
net = tflearn.max_pool_3d(net, kernel_size=(1, 2, 2), strides=(1, 2, 2), name='MaxPool3D1')
net = tflearn.layers.conv.conv_3d(net, 32, filter_size=(3, 3, 3), activation='relu', name='Conv3D2')
net = tflearn.max_pool_3d(net, kernel_size=(2, 2, 2), strides=(2, 2, 2), name='MaxPool3D2')
net = tflearn.layers.conv.conv_3d(net, 64, filter_size=(3, 3, 3), activation='relu', name='Conv3D3')
net = tflearn.max_pool_3d(net, kernel_size=(2, 2, 2), strides=(2, 2, 2), name='MaxPool3D3')
net = tflearn.layers.conv.conv_3d(net, 128, filter_size=(2, 2, 2), activation='relu', name='Conv3D5')
net = tflearn.max_pool_3d(net, kernel_size=(2, 2, 2), strides=(2, 2, 2), name='MaxPool3D4')
#FC Layers
net = tflearn.fully_connected(net, 1024, activation='relu', name='FC1')
net = tflearn.dropout(net, 0.5)
net = tflearn.fully_connected(net, self.n_classes, activation='softmax', name='FC3')
net = tflearn.regression(net, optimizer='adam', loss='categorical_crossentropy', learning_rate=1e-5)
return [net]
我将使用此模型来学习和分类视频。为此,我编写了一个算法,每个视频提取40帧,并生成一个文件夹,其子文件夹代表每个类,基本上是一个新的数据集。
我的意思是。将这些帧加载到此模型的最佳方法是哪种? 我应该使用40个示例(帧)的小批量方法,或者在3D CNN的情况下,输入层一次从数据集中获取40个图像并从中学习吗?
我需要知道这个模型如何从一组40帧中学习,每个类子文件夹每个视频有40个图像,所以,详细一点,如果我在一个类中有50个视频,我有50 * 40帧那个文件夹。
我已经搜索了很多东西来解决这个具体的问题,但直到现在还没有。
感谢您的支持和关注!
答案 0 :(得分:0)
我这样做的方法是创建一个大小为m x n的numpy数组,其中m是所有类的图像数量,n是每个图像的像素数据点数量。您将需要事先对这些类进行洗牌,以便连续没有一堆相同的类。您不希望在给定的一批训练数据中出现过多的班级,因为这可能会使您在训练期间失去CNN的权重。从那里,您可以将创建的阵列的微型批次馈送到CNN,并确保在训练之前将每一行调整为所需的二维尺寸。