Computer vision 无完全连接层的卷积神经网络分类器
我正在进行一个项目,检测以下类别{汽车、卡车、公共汽车},然后提取相应的车牌 这个问题是关于检测各个类的。我使用了传统的方法,我使用了线性支持向量机的HOG特征,它可以工作,但精度较低。我正试图调查CNN的深度学习检测,它显示了更高的准确性。像这样的文件是非常显示,我完全理解它的工作原理 最近,该模型显示了一个非常快速的检测,这是非常有趣的。如果我猜对了的话,那么约洛大致上和他相似 通常,YOLO有24个卷积层和2个完全连接层。实现了一个基于本文的检测网。我感到困惑的是,NVIDIA的DetectNet没有任何完全连接的层()。相反,最后一个卷积层的输出通过一个降维卷积层,我认为这会输出一个对象的可信度 问题1 但我不明白卷积层是如何取代FC层并学会预测对象的?对此的详细解释将非常有帮助 问:你能在一张完全连接的图层上进行卷积分类吗 答案很简单:是的。我们不需要在tensorflow或keras中使用致密层。但是这到底是什么意思?这有多重要?让我们看一些使用Denise层进行MNIST分类的代码Computer vision 无完全连接层的卷积神经网络分类器,computer-vision,deep-learning,caffe,convolution,object-detection,Computer Vision,Deep Learning,Caffe,Convolution,Object Detection,我正在进行一个项目,检测以下类别{汽车、卡车、公共汽车},然后提取相应的车牌 这个问题是关于检测各个类的。我使用了传统的方法,我使用了线性支持向量机的HOG特征,它可以工作,但精度较低。我正试图调查CNN的深度学习检测,它显示了更高的准确性。像这样的文件是非常显示,我完全理解它的工作原理 最近,该模型显示了一个非常快速的检测,这是非常有趣的。如果我猜对了的话,那么约洛大致上和他相似 通常,YOLO有24个卷积层和2个完全连接层。实现了一个基于本文的检测网。我感到困惑的是,NVIDIA的Detec
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_4
即conv2d(filters=32,kernel_size=4,
层有效地执行了与flatte()
紧跟其后的Dense(32,…)
相同的操作
然后conv2d_5
即conv2d(filters=10,kernel_size=1,…
有效地执行与Dense(10,…)相同的操作
可以。关键区别在于,在上述模型中,这些操作使用卷积框架。它看起来很酷,但当内核大小与整个高度x宽度相同时,其计算与完全连接的层相同
从技术上讲,答案是没有使用密集层。本着承认底层计算的精神,是的,最终层的行为与完全连接的层类似。detectnet确实使用FCN,请参见
https://devblogs.nvidia.com/parallelforall/detectnet-deep-neural-network-object-detection-digits/
车队之间的唯一区别内核空间大小1x1
的抽象层和FC层是前者的权重是通道共享的,而后者的权重根本不共享。