深度学习进阶,多个输出和多个损失实现多标签分类

  • blue_shirt(369张图片)

  • red_dress(384张图片)

  • red_shirt(332张图片)

  • red_shoe(486张图片)

  • white_bag(747张图片)

  • white_shoe(840张图片)

我们的卷积神经网络的目标是同时预测颜色和服饰类别。代码使用Tensorflow2.0以上版本编写。下面对我实现算法的代码作讲解:

项目结构

===============================================================

$ tree --filelimit 10 --dirsfirst

.

├── dataset

│ ├── black_jeans [344 entries]

│ ├── black_shoes [358 entries]

│ ├── blue_dress [386 entries]

│ ├── blue_jeans [356 entries]

│ ├── blue_shirt [369 entries]

│ ├── red_dress [380 entries]

│ └── red_shirt [332 entries]

├── examples

│ ├── black_dress.jpg

│ ├── black_jeans.jpg

│ ├── blue_shoes.jpg

│ ├── red_shirt.jpg

│ └── red_shoes.jpg

├── output

│ ├── fashion.model

│ ├── category_lb.pickle

│ ├── color_lb.pickle

│ ├── output_accs.png

│ └── output_losses.png

├── model

│ ├── init.py

│ └── fashionnet.py

├── train.py

└── classify.py

在上面你可以找到我们的项目结构,但在我们继续之前,让我们先回顾一下内容。 有 3 个值得注意的 Python 文件:

  • model/fashionnet.py :我们的多输出分类网络文件包含由三种方法组成的 FashionNet 架构类: build_category_branch 、 build_color_branch 和 build 。我们将在下一节详细回顾这些方法。

  • train.py :此脚本将训练 FashionNet 模型并在此过程中生成输出文件夹中的所有文件。

  • category.py :此脚本加载我们训练好的网络并使用多输出分类对示例图像进行分类。

我们还有 4 个顶级目录:

  • dataset/ :我们的时尚数据集,是使用他们的 API 从 Bing Image Search 中抓取的。我们在上一节中介绍了数据集。要以与我相同的方式创建您自己的数据集,请参阅如何(快速)构建深度学习图像数据集。

  • examples/ :我们有一些示例图像,我们将在本博文的最后一节中将它们与我们的分类.py 脚本结合使用。

  • output/ :我们的 train.py 脚本生成了一些输出文件:

  • fashion.model :我们的序列化 Keras 模型。

  • category_lb.pickle :服装类别的序列化 LabelBinarizer 对象由 scikit-learn 生成。这个文件可以通过我们的classify.py 脚本加载(并调用标签

  • color_lb.pickle :颜色的 LabelBinarizer 对象。

  • output_accs.png :精度训练图图像。

  • output_losses.png :损失训练图图像。

  • model/ :这是一个包含 FashionNet 类的 Python 模块。

快速回顾我们的多输出 Keras 架构

==============================================================================

为了使用 Keras 执行多输出预测,我们将实现一个名为 FashionNet 的特殊网络架构(我为这篇博文而创建)。

FashionNet 架构包含两个特殊组件,包括:

  • 网络早期的一个分支,将网络分成两个“子网络”——一个负责服装类型分类,另一个负责颜色分类。

  • 网络末端的两个(不相交)全连接头,每个头负责各自的分类职责。

在我们开始实现 FashionNet 之前,让我们可视化这些组件中的每一个,第一个是分支:

在这里插入图片描述

在这个网络架构图中,您可以看到我们的网络接受 96 x 96 x 3 的输入图像。

然后我们立即创建两个分支:

  1. 左边的分支负责对服装类别进行分类。

  2. 右侧的分支处理颜色分类。

每个分支执行其各自的一组卷积、激活、批量归一化、池化和 dropout 操作,直到我们达到最终输出:

img

图 5:我们的深度学习 Keras 多输出分类网络可以学习不相交的标签组合。

请注意这些全连接 (FC) 头集如何与我们在本博客中研究过的其他架构中的 FC 层相似——但现在有两个,每个都负责其给定的分类任务。

网络右侧的分支明显比左侧分支浅(没有那么深)。 预测颜色比预测服装类别要容易得多,因此颜色分支相对较浅。

为了了解我们如何实现这样的架构,让我们继续下一节。

实施我们的“FashionNet”架构

==============================================================================

img

图 6:Keras 深度学习库具有执行多输出分类所需的所有功能。

新建fashionnet.py 在里面增加:

import the necessary packages

from tensorflow.keras.models import Model

from tensorflow.keras.layers import BatchNormalization

from tensorflow.keras.layers import Conv2D

from tensorflow.keras.layers import MaxPooling2D

from tensorflow.keras.layers import Activation

from tensorflow.keras.layers import Dropout

from tensorflow.keras.layers import Lambda

from tensorflow.keras.layers import Dense

from tensorflow.keras.layers import Flatten

from tensorflow.keras.layers import Input

import tensorflow as tf

我们首先从 Keras 库导入模块,然后导入 TensorFlow 本身。

由于我们的网络由两个子网络组成,我们将定义两个函数来负责构建各自的分支。

第一个, build_category_branch ,用于分类服装类型,定义如下:

class FashionNet:

@staticmethod

def build_catego

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值