多层神经网络及TensorFlow使用

一、文本预处理—文本转数字列表

Keras 库具有文本预处理功能。是一个用于向量化文本或将文本转换为序列的类(即字典中单词的下标列表,从 1 开始计数)。如下例所示:

实验代码如下:

import tensorflow as tf
somestr = ['ha ha gua angry','howa ha gua excited naive']
tok = tf.keras.preprocessing.text.Tokenizer(num_words=20)
tok.fit_on_texts(somestr)  #装入文档,转数字列表
train_sequences=tok.texts_to_sequences(somestr)
print(train_sequences)
x_train=tf.keras.preprocessing.sequence.pad_sequences(train_sequences,   #补齐,每行字符串用10列表示,不够补0
                                                      padding="post",
                                                      truncating="post",
                                                      maxlen=10)
#x_train输出结果为:
[[1 1 2 3 0 0 0 0 0 0]
 [4 1 2 5 6 0 0 0 0 0]]

二、词嵌入层设计–数字序列转换词向量表示

文档转换为数字表示后,仍然不方便表示单词的特征。这些数字需要再次编码。例如,以下文本之一的编号列表如下:

我  从  哪  里  来  要  到  何  处  去
0    1    2    3   4    5   6    7    8   9`

1.One-Hot 编码

one-hot ,体现one-hot编码的优点,计算方便快捷,表达能力强。使用稀疏矩阵进行矩阵计算时,只需将1的位置对应的数相乘和相加即可。

# 我从哪里来,要到何处去
[
[1 0 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0 0]
[0 0 0 1 0 0 0 0 0 0]
[0 0 0 0 1 0 0 0 0 0]
[0 0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 0 1 0 0 0]
[0 0 0 0 0 0 0 1 0 0]
[0 0 0 0 0 0 0 0 1 0]
[0 0 0 0 0 0 0 0 0 1]
]

最明显的缺点。当它太稀疏时,它会占用太多资源。比如有几十万个中文,大大小小的,简繁体,常用的和不常用的,然后一篇100W字的文章,你想表达成一个100W×10W的矩阵吗?这时,图层横空出世。降维函数。

那么,图层有什么作用?它通过一些线性变换(在CNN中用全连接层变换,也称为查表操作)将我们的稀疏矩阵变成了密集矩阵,而这个密集矩阵使用了N个(在例子中N=3)特征来表示所有字符。在这个稠密矩阵中,外表代表稠密矩阵与单个字符的一一对应关系,实际上它还包含大量的词与词、词与词、句子之间的内在关系甚至是句子(比如我们得到的公主和公主的关系)。它们之间的关系用层学习到的参数来表示。从稀疏矩阵到密集矩阵的过程,叫做,很多人也称之为look -up table,因为它们也是一对一的映射关系。后面的词向量表示如下:

公 [ 0.5 0.125 0.5]
主 [ 0.5 0.125 0.5]
王 [ 0.3 0.375 0.5]
妃 [ 0.3 0.375 0.5]

更重要的是,这个关系在反向传播的过程中一直在更新,所以经过多个epoch后,关系可以变得比较成熟,也就是整个语义和每条语句之间的关系都能正确表达。关系。这个成熟的关系就是layer的所有权重参数。

2.嵌入层代码调试

model = keras.models.Sequential()
model.add(keras.layers.Embedding(input_dim=10, output_dim=2, input_length=10)) 
#input_dim:字典长度,即输入数据最大下标+1 ,有多少个文本。output_dim:大于0的整数,代表全连接嵌入的维度,nput_length:当输入序列的长度固定时,该值为其长度。
#该层输入数据个数:10,每个数据词向量维度为2,数据有10个。
#输入形如(samples,sequence_length)的2D张量。这里是个二维数据,一维数组务必再加一层[],改二维。
#输出形如(samples, sequence_length, output_dim)的3D张量,(1,(10,2))
model.compile('rmsprop', 'mse')
print(model.summary())
p=model.predict([[1, 1, 2, 3,0,0,0,0,0,0]])
#p的输出结果如下:
[[[-0.04306092 -0.03373697]
  [-0.04306092 -0.03373697]
  [-0.03351045 -0.03122779]
  [ 0.01788462  0.0147854 ]
  [ 0.01061829 -0.00132079]
  [ 0.01061829 -0.00132079]
  [ 0.01061829 -0.00132079]
  [ 0.01061829 -0.00132079]
  [ 0.01061829 -0.00132079]
  [ 0.01061829 -0.00132079]]]

三、keras建模及应用构建多层神经网络模型

1. 构建情感评论模型的模型构建代码:

import tensorflow as tf
model=tf.keras.models.Sequential() #序列化
model.add(tf.keras.layers.Embedding(output_dim=32,   #词向量输出为32维度的0,1编码
                                    input_dim=4000,
                                    input_length=400))
model.add(tf.keras.layers.Flatten())  #类似池化
model.add(tf.keras.layers.Dense(units=256,activation="relu")) #全连接隐藏层
model.add(tf.keras.layers.Dropout(0.3)) #丢弃层
model.add(tf.keras.layers.Dense(units=2,activation='sigmoid'))#输出层
model.compile(optimizer='adam',loss="binary_crossentropy",
              metrics=['accuracy'])  #loss为损失函数,二分类选择binary_crossentropy,多分类选择categorical_crossentropy
print(model.summary())
history=model.fit(x_train,y_train,validation_split=0.2,
                  epochs=10,batch_size=128,verbose=1)  #batch_size一次带128个数据进去
#x_train:训练数据集,y_train为标签数据集,用ont-hot编码。若[1,0]表示正向,[0,1】表示负向。
#多分类的one-hot编码[1,0,0,0]
model.save("d:/film.h5")  #模型保存

2.模型可视化

等待

3.模型评估

test_loss,test_acc=model.evaluate(x_test,y_test,verbose=1) #verbose为1,可以看到每轮训练结果
print("test accuracy:",test_acc)

4.模型预测

predictions=model.predict(x_test)
print(predictions[0])
结果如下:
[9.9994373e-01 5.6257828e-05],表示正向。

参考文献

1)中层的介绍

© 版权声明
THE END
喜欢就支持一下吧
点赞9赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容