Tensorflow2.0学习笔记之二

概述

前一篇文章笔者用一个图像领域的例子来展示了一下使用tensorflow2.0进行图像分类的流程。与图像领域有点不同,自然语言处理在使用过程中有一些小的方面需要注意,这里笔者也使用两个NLP相关的实验来介绍一下。

电影评论情感分类

这是经典任务之一,不管是淘宝京东,还是美团豆瓣,对用户评论进行分类是必要的任务之一。这里我们使用的是电影评论的情感分类,使用keras自带的imdb数据集,虽然简单,但是这个数据集目前也应用广泛。
首先,我们需要导入必要的模块:

# 导包
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import os
import tensorflow as tf
from tensorflow import keras

然后加载数据集,这里我们使用10000个字。这里稍微补充说一下,新华字典包含10000多个字,在汉语中10000字已经覆盖正常人的常用字了。

# 加载数据集
imdb = keras.datasets.imdb
(train_x_all, train_y_all),(test_x, test_y)=imdb.load_data(num_words=10000)
print(train_x_all[0])

我们随便看一句话,其实数据集中这是一串数字,这些数据对应着子表中的每个字。所以我们需要把这些数字与文字对应起来。
在这里插入图片描述我们构建字典,并且加入一些特殊字符。第一个是PAD,用于不全短句子,第二个是START,用作一个句子的开始。UNK是没有出现的,UNUSED是没用用到的。

# 构建字典
word_index = imdb.get_word_index()

word2id = { k:(v+3) for k, v in word_index.items()}
word2id['<PAD>'] = 0
word2id['START'] = 1
word2id['<UNK>'] = 2
word2id['UNUSED'] = 3

id2word = {v:k for k, v in word2id.items()}
def get_words(sent_ids):
    return ' '.join([id2word.get(i, '?') for i in sent_ids])

我们可以看一下转换后的字表:
在这里插入图片描述在这里插入图片描述我们看一下数据:
在这里插入图片描述我们查看了一下第一句和第二句,可见句子长度是不一样的,所以我们在短句子的后面补零。先看一下第一句:
在这里插入图片描述句子末尾填充操作:

# 句子末尾进行填充
train_x_all = keras.preprocessing.sequence.pad_sequences(
    train_x_all,
    value=word2id['<PAD>'],
    padding='post', #pre表示在句子前面填充, post表示在句子末尾填充
    maxlen=256
)

test_x = keras.preprocessing.sequence.pad_sequences(
    test_x,
    value=word2id['<PAD>'],
    padding='post',
    maxlen=256
)
print(train_x_all[0])
print(len(train_x_all[0]))
print(len(train_x_all[1]))

我们看一下结果,这样两个句子应该是一样长的。
在这里插入图片描述接下来我们构建模型:

#模型编写
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='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))

在这里插入图片描述嵌入的维度是16,注意第二步有个全局平均池化的工作。
构建完了模型开始编译模型:

model.compile(optimizer='adam', loss=keras.losses.binary_crossentropy, metrics=['accuracy'])

我们划分一下数据集,然后传入数据集开始训练:

train_x, valid_x = train_x_all[10000:], train_x_all[:10000]
train_y, valid_y = train_y_all[10000:], train_y_all[:10000]
history = model.fit(train_x, train_y, epochs=40, batch_size=512, validation_data=(valid_x, valid_y), verbose=1)

最后看一下结果:

def plot_learing_show(history):
    pd.DataFrame(history.history).plot(figsize=(8,5))
    plt.grid(True)
    plt.gca().set_ylim(0,1)
    plt.show()
plot_learing_show(history)

在这里插入图片描述

Tips

1.Embedding(input_dim, output_dim, input_length) 第一个参数是词汇量,第二个参数是输出的维度,第三个参数是输入的句子的长度。
2.为了使用全连接层,所以我们需要这样一个类似于打平的操作:
keras.layers.GlobalAveragePooling1D()。

发布了30 篇原创文章 · 获赞 16 · 访问量 1151

猜你喜欢

转载自blog.csdn.net/qq_34523665/article/details/105402378