Image Classification based on VGG16 Transfer Learning using Tensorflow 使用Tensorflow打造基于VGG16的图片分类器

时下最流行的机器学习非深度学习莫属。而想要事半功倍入门深度学习就非Transfer Learning莫属。fast.ai和Udacity的深度学习入门课程不约而同都以VGG16为基础,介绍了如何使用卷积神经网络实现图片分类器。我也参照着打造了以下专门识别男女的图片分类器。

作为基础的VGG16,其模型结构如下图所示。它先后由2个2层卷积、3个3层卷积和3个全连层组成,共16层。其中第1层和第2层卷积都是64个卷积核,所以输出的维度也相应变成(224,224,64),再经由(2,2)max pooling变成(112,112,64)。以后可如此类推。

vgg16

Transfer Learning 的核心思想就是,最大限度利用已经训练好的模型,为了实现特定分类功能,只需要舍弃原模型的最后一层或若干层,然后拼上新定义层并做fine tuning以获得新定义层的weights。当然,保留下来的原模型的所有层在fine tuning过程中均保持weights不变。这样显然可以显著减少模型的训练开销,并且也可以取得不错的结果,从而达到事半功倍的效果。

在fast.ai的Keras示例中,其做法如下代码所示。

model.pop() #舍弃当前模型的最后一层
for layer in model.layers: layer.trainable=False #当前模型的所有层的weights保持不变
model.add(Dense(num, activation=’softmax’)) #拼上新定义的全连层
self.compile() #使模型的新网络结构生效

而在Udacity的Tensorflow实例中,其做法如下代码所示。

feed_dict = {input_: images} #输入图片到VGG16模型
codes = sess.run(vgg.relu6, feed_dict=feed_dict) #截取VGG16模型的第一层全连层输出

以下代码重新定义一个2层全连层网络,输入即上面截取的VGG16模型的第一层全连层输出,而输出则为我们需要的特定分类器输出标签。

inputs_ = tf.placeholder(tf.float32, shape=[None, codes.shape[1]])
labels_ = tf.placeholder(tf.int64, shape=[None, labels_vecs.shape[1]])

fc = tf.contrib.layers.fully_connected(inputs_, 256)
logits = tf.contrib.layers.fully_connected(fc, labels_vecs.shape[1], activation_fn=None)

两者相比较,示例1中fine tuning是在包含VGG16前15层和新加1层全连层的模型上开展,当然真正可调的也只是最后一层新加的全连层的参数;示例2则需要先单独截取VGG16的前14层输出,再作为新定义的2层全连层的输入做模型训练。看似做法略有不同,其实本质上思想是一致的。

下面,看下图片经过VGG16不同卷积层的输出大概是什么样子的。原始图片是图像处理领域的“明星”, Lena。

第1层max pooling输出,共64个卷积核。可以看出不同的卷积核关注的焦点也不同,得到的输出也是各有侧重。

conl1

第2层max pooling输出,共128个卷积核。

convl2

第3层max pooling输出,共256个卷积核。

convl3

第5层max pooling输出,共512个卷积核。好吧,现在的输出每张image只有7乘7的像素。肉眼已经完全“沦陷”了。

convl5

那我们看下打造的性别分类器的输出吧。

Screen Shot 2017-08-07 at 23.35.36

哈,话说金星老师你即便还是他的时候,分类器还是可以“慧眼识珠”的。

Screen Shot 2017-08-07 at 23.35.52.png

额,下面这位。。。哈哈,我已无言。

Screen Shot 2017-08-07 at 23.37.41.png

至此,简单几十行代码便可以实现图片分类,并且还可以任意推广到其他图片分类应用。看来深度学习的魅力和潜力真不是盖的。那么,就继续加油吧。

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s