没有完全连接图层的卷积神经网络分类器

时间:2016-11-21 12:25:56

标签: computer-vision deep-learning caffe convolution object-detection

我正在研究一个项目,以检测以下类 {汽车,卡车,公共汽车} ,然后提取相应的车牌。

这个问题是关于各个班级的检测。我使用传统的方法,我使用线性SVM的HOG功能,它的工作但精度低。我正在尝试研究CNN的基于深度学习的检测,它已经显示出更高的准确性。像R-CNN这样的论文非常精彩,我完全理解它是如何运作的。

最近,YOLO模型显示出非常快速的检测,非常有趣。如果我能猜对,那么YOLO与DPM大致相似。

通常,YOLO有24个卷积层和2个完全连接的层。 NVIDIA DIGITS基于此YOLO论文实现了DetectNet。我感到困惑的是,NVIDIA的DetectNet没有任何完全连接的图层(Caffe Model File)。相反,来自最后一个卷积层的输出通过一个减少维数的卷积层,我认为这对于拥有一个对象有一定的信心。

问题1

但我不明白卷积层如何取代FC层并学会预测物体?对此的详细解释将非常有帮助。

1 个答案:

答案 0 :(得分:0)

问题:您可以对具有完全连接层的图像进行卷积以进行分类

简单的回答:是的。我们不需要在tensorflow或keras中使用Dense层。但是...这到底是什么意思?那有多重要?让我们看一些使用Denise层进行MNIST分类的代码

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Conv2D, MaxPool2D, InputLayer, Reshape

# get some image data for classification
(xtrain,ytrain),(xtest,ytest) = tf.keras.datasets.mnist.load_data()
xtrain = np.reshape(xtrain,[-1,28,28,1]) / 255.0
ytrain = np.eye(10)[ytrain]
xtest = np.reshape(xtest,[-1,28,28,1]) / 255.0
ytest = np.eye(10)[ytest]

# make a convolution model with any dense or fully connected layers
model = tf.keras.models.Sequential([
    InputLayer([28,28,1]),
    Conv2D(filters=16, kernel_size=3, activation='tanh', padding='valid', kernel_initializer='he_normal'),
    Conv2D(filters=16, kernel_size=3, activation='tanh', padding='valid', kernel_initializer='he_normal'),
    MaxPool2D(pool_size=2),
    Conv2D(filters=24, kernel_size=3, activation='tanh', padding='valid', kernel_initializer='he_normal'),
    Conv2D(filters=24, kernel_size=3, activation='tanh', padding='valid', kernel_initializer='he_normal'),
    MaxPool2D(pool_size=2),
    Conv2D(filters=32, kernel_size=4, activation='tanh', padding='valid', kernel_initializer='he_normal'),
    Conv2D(filters=10, kernel_size=1, activation='softmax', padding='valid', kernel_initializer='he_normal'),
    Reshape([10])
    ])

model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
_ = model.fit(x=xtrain,y=ytrain, validation_data=(xtest,ytest))

此结果将在1个时期后对MNIST进行分类

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 26, 26, 16)        160       
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 24, 24, 16)        2320      
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 12, 12, 16)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 10, 10, 24)        3480      
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 8, 8, 24)          5208      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 4, 4, 24)          0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 1, 1, 32)          12320     
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 1, 1, 10)          330       
_________________________________________________________________
reshape (Reshape)            (None, 10)                0         
=================================================================
Total params: 23,818
Trainable params: 23,818
Non-trainable params: 0
_________________________________________________________________

60000/60000 [==============================] - 28s 467us/sample - loss: 0.1709 - acc: 0.9543 - val_loss: 0.0553 - val_acc: 0.9838

精度不高,但肯定比随机精度高。从模型定义中可以看出,没有使用单个完全连接的层(tf.keras.layers.Dense)。

但是,conv2d_4Conv2D(filters=32, kernel_size=4, ...实际上正在执行与Flatten()后跟Dense(32, ...)的相同操作。

然后conv2d_5就是Conv2D(filters=10, kernel_size=1, ...,实际上执行的操作与Dense(10, ...)相同。关键区别在于,在上述模型中,这些操作使用卷积框架。看起来很酷,但是当kernel_size与整个高度x宽度相同时,它的内容与完全连接的层相同。

从技术上讲,答案是不使用致密层。本着承认底层计算的精神,是的,最后的层就像完全连接的层一样。