Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
models
提交
55dc1a38
M
models
项目概览
PaddlePaddle
/
models
大约 1 年 前同步成功
通知
222
Star
6828
Fork
2962
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
602
列表
看板
标记
里程碑
合并请求
255
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
models
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
602
Issue
602
列表
看板
标记
里程碑
合并请求
255
合并请求
255
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
55dc1a38
编写于
5月 06, 2017
作者:
F
fengjiayi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add cnn_net.png and update README.md
上级
78531d85
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
53 addition
and
3 deletion
+53
-3
text_classification/README.md
text_classification/README.md
+53
-3
text_classification/images/cnn_net.png
text_classification/images/cnn_net.png
+0
-0
未找到文件。
text_classification/README.md
浏览文件 @
55dc1a38
...
...
@@ -4,7 +4,8 @@
## 实验数据
本例子的实验在IMDB数据集上进行。IMDB数据集包含了来自IMDb(互联网电影数据库)网站的5万条电影影评,并被标注为正面/负面两种评价。数据集被划分为train和test两部分,各2.5万条数据,正负样本的比例基本为1:1。样本直接以英文原文的形式表示。
## DNN模型结构
## DNN模型
#### DNN的模型结构入下图所示:
<p
align=
"center"
>
...
...
@@ -15,8 +16,12 @@
#### 可以看到,模型主要分为如下几个部分:
-
**embedding层**
:IMDB的样本由原始的英文单词组成,为了方便模型的训练,必须通过embedding将英文单词转化为固定维度的向量。
-
**max pooling**
:max pooling在时间序列上进行,pooling过程消除了不同语料样本在单词数量多少上的差异,并提炼出词向量中每一下标位置上的最大值。经过pooling后,样本被转化为一条固定维度的向量。
-
**全连接隐层**
:经过max pooling后的向量被送入一个具有两个隐层的DNN模型,隐层之间为全连接结构。
-
**全连接隐层**
:经过max pooling后的向量被送入一个具有两个隐层的DNN模型,隐层之间为全连接结构。
-
**输出层**
:输出层的神经元数量和样本的类别数一致,例如在二分类问题中,输出层会有2个神经元。通过Softmax激活函数,我们保证输出层各神经元的输出之和为1,因此第i个神经元的输出就可以认为是样本属于第i类的预测概率。
#### 通过Paddle实现该DNN结构的代码如下:
...
...
@@ -59,5 +64,50 @@ def fc_net(input_dim, class_dim=2, emb_dim=256):
return
cost
,
output
```
该DNN模型默认对输入的语料进行二分类(
`class_dim=2`
),embedding的词向量维度默认为256(
`emd_dim=256`
),两个隐层均使用Tanh激活函数(
`act=paddle.activation.Tanh()`
)。
该DNN模型默认对输入的语料进行二分类(
`class_dim=2`
),embedding的词向量维度默认为256(
`emd_dim=256`
),两个隐层均使用Tanh激活函数(
`act=paddle.activation.Tanh()`
)。
需要注意的是,该模型的输入数据为整数序列,而不是原始的英文单词序列。事实上,为了处理方便我们一般会事先将单词根据词频顺序进行id化,即将单词用整数替代。这一步一般在DNN模型之外完成。
##CNN模型
####CNN的模型结构如下图所示:
<p
align=
"center"
>
<img
src=
"images/cnn_net.png"
width =
"90%"
align=
"center"
/><br/>
图2. CNN文本分类模型
</p>
#### 可以看到,模型主要分为如下几个部分:
-
**embedding层**
:与DNN中embedding的作用一样,将英文单词转化为固定维度的向量。如图2中所示,将embedding得到的词向量定义为行向量,再将语料中所有的单词产生的行向量拼接在一起组成矩阵。假设embedding_size=5,语料“The cat sat on the read mat”包含7个单词,那么得到的矩阵维度为7
*
5。
-
**卷积层**
: 文本分类中的卷积在时间序列上进行,即卷积核的宽度和embedding得到的矩阵一致,卷积验证矩阵的高度方向进行。假设卷积核的高度为h,矩阵的高度为N,卷积的step_size为1,则卷积后得到的feature map为一个高度为N+1-h的向量。可以同时使用多个不同高度的卷积核,得到多个feature map。
-
**max pooling**
: 对卷积得到的各个feature map分别进行max pooling操作。由于feature map本身已经是向量,因此这里的max pooling实际上就是简单地选出各个向量中的最大元素。各个最大元素又被并置在一起,组成新的向量,显然,该向量的维度等于feature map的数量,也就是卷积核的数量。
-
**全连接与输出层**
:将max pooling的结果通过全连接层输出,与DNN模型一样,最后输出层的神经元个数与样本的类别数量一致,且输出之和为1。
#### 通过Paddle实现该CNN结构的代码如下:
```
python
import
paddle.v2
as
paddle
def
convolution_net
(
input_dim
,
class_dim
=
2
,
emb_dim
=
128
,
hid_dim
=
128
):
data
=
paddle
.
layer
.
data
(
"word"
,
paddle
.
data_type
.
integer_value_sequence
(
input_dim
))
lbl
=
paddle
.
layer
.
data
(
"label"
,
paddle
.
data_type
.
integer_value
(
2
))
emb
=
paddle
.
layer
.
embedding
(
input
=
data
,
size
=
emb_dim
)
conv_3
=
paddle
.
networks
.
sequence_conv_pool
(
input
=
emb
,
context_len
=
3
,
hidden_size
=
hid_dim
)
conv_4
=
paddle
.
networks
.
sequence_conv_pool
(
input
=
emb
,
context_len
=
4
,
hidden_size
=
hid_dim
)
output
=
paddle
.
layer
.
fc
(
input
=
[
conv_3
,
conv_4
],
size
=
class_dim
,
act
=
paddle
.
activation
.
Softmax
())
cost
=
paddle
.
layer
.
classification_cost
(
input
=
output
,
label
=
lbl
)
return
cost
,
output
```
该CNN网络的输入数据类型和前面介绍过的DNN一致。
`paddle.networks.sequence_conv_pool`
为Paddle中已经封装好的带有pooling的文本序列卷积模块,
`context_len`
参数用于指定卷积核在同一时间覆盖的文本长度,也即图2中的卷积核的高度;
`hidden_size`
用于指定该类型的卷积核的数量。可以看到,上述代码定义的结构中使用了128个大小为3的卷积核和128个大小为4的卷积核,这些卷积的结果经过max pooling和结果并置后产生一个256维的向量,向量经过一个全连接层输出最终预测结果。
text_classification/images/cnn_net.png
0 → 100644
浏览文件 @
55dc1a38
35.9 KB
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录