.IMDB,THUCNews数据集下载和探索

IMDB
参考Tensorflow官网代码

模型如下

vocab_size = 10000

model = keras.Sequential()
model.add(keras.layers.Embedding(vocab_size, 16))
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16, activation=tf.nn.relu))
model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid))

model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
embedding (Embedding)        (None, None, 16)          160000
_________________________________________________________________
global_average_pooling1d (Gl (None, 16)                0
_________________________________________________________________
dense (Dense)                (None, 16)                272
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 17
=================================================================
Total params: 160,289
Trainable params: 160,289
Non-trainable params: 0
_________________________________________________________________

按顺序堆叠各个层以构建分类器:

  1. 第一层是 Embedding 层。该层会在整数编码的词汇表中查找每个字词-索引的嵌入向量。模型在接受训练时会学习这些向量。这些向量会向输出数组添加一个维度。生成的维度为:(batch, sequence, embedding)。
  2. 接下来,一个 GlobalAveragePooling1D 层通过对序列维度求平均值,针对每个样本返回一个长度固定的输出向量。这样,模型便能够以尽可能简单的方式处理各种长度的输入。
  3. 该长度固定的输出向量会传入一个全连接 (Dense) 层(包含 16 个隐藏单元)。
  4. 最后一层与单个输出节点密集连接。应用 sigmoid 激活函数后,结果是介于 0 到 1 之间的浮点值,表示概率或置信水平。

流程=》
1、下载数据集,查看数据集格式,标签格式,建立词表,加入[""] ,[""]
[""]
2、建立word_id和id_word,词嵌入,每个句子翻译成数字
3、思考用什么模型去预测,Tensorflow使用的是GlobalAveragePooling1D 降维,然后用两个全连接最后维度是1,与标签维度对应
4、建立优化器model.compile(optimizer=tf.train.AdamOptimizer(), loss='binary_crossentropy', metrics=['accuracy'])
5、训练模型

history = model.fit(partial_x_train,
                    partial_y_train,
                    epochs=40,
                    batch_size=512,
                    validation_data=(x_val, y_val),
                    verbose=1)

THUCNews
相关代码 https://github.com/gaussic/text-classification-cnn-rnn
Text Classification with CNN
处理数据集
read_file(): 读取文件数据;
build_vocab(): 构建词汇表,使用字符级的表示,这一函数会将词汇表存储下来,避免每一次重复处理;
read_vocab(): 读取上一步存储的词汇表,转换为{词:id}表示;
read_category(): 将分类目录固定,转换为{类别: id}表示;
to_words(): 将一条由id表示的数据重新转换为文字;
process_file(): 将数据集从文字转换为固定长度的id序列表示;
batch_iter(): 为神经网络的训练准备经过shuffle的批次的数据。

CNN模型

词嵌入
 embedding = tf.get_variable('embedding', [self.config.vocab_size, self.config.embedding_dim])
 embedding_inputs = tf.nn.embedding_lookup(embedding, self.input_x)

卷积池化

conv = tf.layers.conv1d(embedding_inputs, self.config.num_filters, self.config.kernel_size, name='conv')
 # global max pooling layer
  gmp = tf.reduce_max(conv, reduction_indices=[1], name='gmp')

全连接然后找出预测值的最大索引

fc = tf.layers.dense(gmp, self.config.hidden_dim, name='fc1')
fc = tf.contrib.layers.dropout(fc, self.keep_prob)
fc = tf.nn.relu(fc)

# 分类器
 self.logits = tf.layers.dense(fc, self.config.num_classes, name='fc2')
 self.y_pred_cls = tf.argmax(tf.nn.softmax(self.logits), 1)  # 预测类别

建立优化器

# 损失函数,交叉熵
 cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=self.logits, labels=self.input_y)
  self.loss = tf.reduce_mean(cross_entropy)
  # 优化器
  self.optim = tf.train.AdamOptimizer(learning_rate=self.config.learning_rate).minimize(self.loss)

总结
通过以上两个模型,可以看出处理文字任务流程都是:
1、处理数据集,建立词表,建立词汇和数字的映射表
2、词嵌入 把句子转化为数字
3、思考用什么模型,把经过转化为数字的句子 加入到模型
4、建立优化器
5、训练

你可能感兴趣的:(DataWhale)