将帧加载到3D CNN

时间:2018-05-02 22:23:13

标签: python machine-learning deep-learning classification tflearn

我使用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帧那个文件夹。

我已经搜索了很多东西来解决这个具体的问题,但直到现在还没有。

感谢您的支持和关注!

1 个答案:

答案 0 :(得分:0)

我这样做的方法是创建一个大小为m x n的numpy数组,其中m是所有类的图像数量,n是每个图像的像素数据点数量。您将需要事先对这些类进行洗牌,以便连续没有一堆相同的类。您不希望在给定的一批训练数据中出现过多的班级,因为这可能会使您在训练期间失去CNN的权重。从那里,您可以将创建的阵列的微型批次馈送到CNN,并确保在训练之前将每一行调整为所需的二维尺寸。