Python深度学习基于Tensorflow(8)自然语言处理基础

RNN 模型

与前后顺序有关的数据称为序列数据,对于序列数据,我们可以使用循环神经网络进行处理,循环神经网络RNN已经成功的运用于自然语言处理,语音识别,图像标注,机器翻译等众多时序问题;RNN模型有以下类别:

![[RNN.jpg]]

SRNN模型

对于全连接模型, X ∈ R n d X \in \mathcal{R}^{nd} XRnd W X ∈ R d h W_X \in \mathcal{R}^{dh} WXRdh B ∈ R 1 h B \in \mathcal{R}^{1h} BR1h H = f ( X W X + B ) H=f(XW_X+B) H=f(XWX+B)
H ∈ R n h H \in \mathcal{R}^{nh} HRnh,当 X i ∈ R 1 d X_i \in \mathcal{R}^{1d} XiR1d,有 H i = f ( X i W X + B ) H_i = f(X_iW_X+B) Hi=f(XiWX+B)
为了让隐藏层当前位置结合上一个位置的信息,我们可以把函数更改为: H i = f ( X i W X + B + H i − 1 ) H_i=f(X_iW_X+B+H_{i-1}) Hi=f(XiWX+B+Hi1)
这样上一个位置的信息不够灵活,为了让信息更加灵活,最好也给上一个位置的信息加个权重进行处理,有 H i = f ( X i W X + H i − 1 W H + B ) H_i=f(X_iW_X+H_{i-1}W_H+B) Hi=f(XiWX+Hi1WH+B)
最后优化一下: H i = f ( [ X i , H t − 1 ] W + B ) H_i=f([X_i,H_{t-1}]W+B) Hi=f([Xi,Ht1]W+B)
如此便是RNN的核心,输出可以利用如下生成: O t = H i W O + B O O_t=H_iW_O+B_O Ot=HiWO+BO
不加 W H W_H WH会出现这样的结果 H t = f ( T i + f ( T i − 1 + ⋯ + f ( T 1 + H 0 ) ) ) H_t=f(T_i+f(T_{i-1}+\dots+f(T_{1}+H_{0}))) Ht=f(Ti+f(Ti1++f(T1+H0)))
很明显,只是单纯的加减变换转非线性,灵活性不够,如果去掉激活函数,明显只是前一个位置的值和本位置的值相加;

由于每一个单元都对应一个隐藏单元,最后一个隐藏单元的信息结合了前面所有单元的信息,同时每一个输出单元是依据对应的隐藏单元决定的,这样可以对应多对一任务(最后一个隐藏单元)和多对多任务(所有的隐藏单元);

SRNN的不足

对应添加 W H W_{H} WH,有这样的结果 H t = f ( T i + f ( T i − 1 + ⋯ + f ( T 1 + H 0 W H ) W H ) ) … ) W H ) H_t=f(T_i+f(T_{i-1}+\dots+f(T_{1}+H_{0}W_H)W_H))\dots )W_H) Ht=f(Ti+f(Ti1++f(T1+H0WH)WH)))WH)
可以发现 W H W_H WH被反复的相乘了,由于其是方阵,假设可对角化,有 W H = P − 1 Λ P W_H=P^{-1} \Lambda P WH=P1ΛP
如果 n n n W H W_H WH 相乘有 W H n = P − 1 Λ n P W_H^n=P^{-1}\Lambda^n P WHn=P1ΛnP
这样随着 n n n 的增大, Λ \Lambda Λ 对角线上大于1的值就会越来越大, 对角线上小于1的值就会越来越小,趋近于0;这就照成了RNN的短记忆性问题,为了延长记忆性,提取了LSTM和GRU模型;

LSTM

LSTM(Long Short-Term Memory)称为长短期记忆网络,最早是由 Hochreiter 和 Schmidhuber 在1997年提出,能够有效的解决信息的长期依赖,避免梯度消失或者爆炸;

LSTM在SRNN内部添加了很多的门控元素,这些元素可以把数据中的重要特征保存下来,可以有效的延长模型的记忆长度,但是LSTM的缺点十分明显,那就是模型结构过于复杂导致计算量太大,模型训练速度过慢。

f t = σ ( W x f x t + W h f h t − 1 + W c f c t − 1 + b f ) i t = σ ( W x i x t + W h i h t − 1 + W c i c t − 1 + b i ) o t = σ ( W x o x t + W h o h t − 1 + W c o c t + b o ) c t = f t ∘ c t − 1 + i t ∘ tanh ⁡ ( W x c x t + W h c h t − 1 + b c ) h t = o t ∘ tanh ⁡ ( c t ) y t = W h y h t + b y \begin{align} \begin{split} f_t & = \sigma(W_{xf} x_t + W_{hf} h_{t-1} + W_{cf} c_{t-1} + b_f) \\ i_t & = \sigma(W_{xi} x_t + W_{hi} h_{t-1} + W_{ci} c_{t-1} + b_i) \\ o_t & = \sigma(W_{xo} x_t + W_{ho} h_{t-1} + W_{co} c_t + b_o) \\ c_t & = f_t \circ c_{t-1} + i_t \circ \tanh(W_{xc} x_t + W_{hc} h_{t-1} + b_c) \\ h_t & = o_t \circ \tanh(c_t) \\ y_t & = W_{hy} h_t + b_y \end{split} \end{align} ftitotcthtyt=σ(Wxfxt+Whfht1+Wcfct1+bf)=σ(Wxixt+Whiht1+Wcict1+bi)=σ(Wxoxt+Whoht1+Wcoct+bo)=ftct1+ittanh(Wxcxt+Whcht1+bc)=ottanh(ct)=Whyht+by

GRU

GRU(Gated Recurrent Unit)在LSTM的基础上进行了改良,通过损失了一些记忆力的方式加快训练速度。GRU相较于LSTM少了一个记忆单元,其记忆长度相对减弱了一些,但是仍然远超过RNN,遗忘问题相对不容易发生。

z t = σ ( W x z x t + W h z h t − 1 + b z ) r t = σ ( W x r x t + W h r h t − 1 + b r ) h t ~ = tanh ⁡ ( W x h x t + W h h ( r t ∘ h t − 1 ) + b h ) h t = ( 1 − z t ) ∘ h t − 1 + z t ∘ h t ~ y t = W h y h t + b y \begin{align} \begin{split} z_t & = \sigma(W_{xz} x_t + W_{hz} h_{t-1} + b_z) \\ r_t & = \sigma(W_{xr} x_t + W_{hr} h_{t-1} + b_r) \\ \tilde{h_t} & = \tanh(W_{xh} x_t + W_{hh} (r_t \circ h_{t-1}) + b_h) \\ h_t & = (1 - z_t) \circ h_{t-1} + z_t \circ \tilde{h_t} \\ y_t & = W_{hy} h_t + b_y \end{split} \end{align} ztrtht~htyt=σ(Wxzxt+Whzht1+bz)=σ(Wxrxt+Whrht1+br)=tanh(Wxhxt+Whh(rtht1)+bh)=(1zt)ht1+ztht~=Whyht+by

Bi-RNN

由于RNN只能单项传播信息,Bi-RNN利用两个单项RNN解决这一问题
在这里插入图片描述

Bi-RNN 模型 的输出值是通过前向和后向两个的输出值拼接得到;

使用LSTM完成文本分类

这里以互联网电影资料库(Internet Movie Database)的评论来做一个评价好坏的二分类任务;

数据导入:

import numpy as np
import tensorflow as tfmaxlen = 200
max_features = 20000(x_train, y_train), (x_val, y_val) = tf.keras.datasets.imdb.load_data(num_words=max_features)

数据集构建:

x_train = tf.keras.preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen)
x_val = tf.keras.preprocessing.sequence.pad_sequences(x_val, maxlen=maxlen)train_data = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(64)
val_data = tf.data.Dataset.from_tensor_slices((x_val, y_val)).batch(64)

模型创建:

class CustomModel(tf.keras.Model):def __init__(self):super(CustomModel, self).__init__()self.embedding = tf.keras.layers.Embedding(max_features, 128)self.lstm_1 = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64, return_sequences=True))self.lstm_2 = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64))self.dense_final = tf.keras.layers.Dense(1, activation='sigmoid')def call(self, x):x = self.embedding(x)x = self.lstm_1(x)x = self.lstm_2(x)x = self.dense_final(x)return x

模型配置:

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

开始训练:

model.fit(train_data, epochs=10, validation_data=val_data)

训练结果:

Epoch 1/4
391/391 [==============================] - 43s 100ms/step - loss: 0.3848 - accuracy: 0.8215 - val_loss: 0.3382 - val_accuracy: 0.8538
Epoch 2/4
391/391 [==============================] - 38s 98ms/step - loss: 0.1943 - accuracy: 0.9288 - val_loss: 0.3826 - val_accuracy: 0.8511
Epoch 3/4
391/391 [==============================] - 38s 98ms/step - loss: 0.1680 - accuracy: 0.9397 - val_loss: 0.3751 - val_accuracy: 0.8548
Epoch 4/4
391/391 [==============================] - 38s 98ms/step - loss: 0.1076 - accuracy: 0.9629 - val_loss: 0.5110 - val_accuracy: 0.8176

结合使用CNN和RNN完成图片分类

这里继续使用CIFAR-10分类任务的数据

数据导入:

import matplotlib.pyplot as plt
import tensorflow as tf(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
# x_train.shape, y_train.shape, x_test.shape, y_test.shape
# ((50000, 32, 32, 3), (50000, 1), (10000, 32, 32, 3), (10000, 1))index_name = {0:'airplane',1:'automobile',2:'bird',3:'cat',4:'deer',5:'dog',6:'frog',7:'horse',8:'ship',9:'truck'
}

数据集创建:

x_train = x_train / 255.0
x_test = x_test / 255.0y_train = tf.keras.utils.to_categorical(y_train)
y_test = tf.keras.utils.to_categorical(y_test)
train_data = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(64)
test_data = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(64)

先CNN,再RNN

创建模型:

class CustomModel(tf.keras.Model):def __init__(self):super(CustomModel, self).__init__()self.conv = tf.keras.layers.Conv2D(32, 3, padding='same')self.bn = tf.keras.layers.BatchNormalization(axis=-1)self.max_pool = tf.keras.layers.MaxPooling2D(strides=2, padding='same')self.reshape = tf.keras.layers.Reshape(target_shape=(-1, 32))self.lstm = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(50, return_sequences=False))self.flatten = tf.keras.layers.Flatten()self.dense_final = tf.keras.layers.Dense(10, activation='softmax')def call(self, x):x = self.conv(x)x = self.bn(x)x = self.max_pool(x)x = self.reshape(x)x = self.lstm(x)x = self.flatten(x)x = self.dense_final(x)return x

定义模型:

model = CustomModel()
model.compile(loss=tf.keras.losses.CategoricalCrossentropy(),optimizer='adam',metrics=['accuracy']
)
model.fit(train_data, epochs=3, validation_data=test_data)

训练结果:

Epoch 1/3
782/782 [==============================] - 36s 40ms/step - loss: 1.7976 - accuracy: 0.3488 - val_loss: 2.3082 - val_accuracy: 0.2340
Epoch 2/3
782/782 [==============================] - 30s 39ms/step - loss: 1.5557 - accuracy: 0.4350 - val_loss: 1.5993 - val_accuracy: 0.4222
Epoch 3/3
782/782 [==============================] - 30s 39ms/step - loss: 1.4037 - accuracy: 0.4898 - val_loss: 1.5229 - val_accuracy: 0.4519

结合使用CNN和RNN

class CustomModel(tf.keras.Model):def __init__(self):super(CustomModel, self).__init__()self.flatten = tf.keras.layers.Flatten()self.conv = tf.keras.layers.Conv2D(32, 3, padding='same')self.bn = tf.keras.layers.BatchNormalization(axis=-1)self.max_pool = tf.keras.layers.MaxPooling2D(strides=2, padding='same')self.dense_final_1 = tf.keras.layers.Dense(60, activation='relu')self.reshape = tf.keras.layers.Reshape(target_shape=[-1, 32])self.lstm = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(50, return_sequences=False))self.dense_final_2 = tf.keras.layers.Dense(60, activation='relu')self.concat = tf.keras.layers.Concatenate()self.dense_final = tf.keras.layers.Dense(10, activation='softmax')def call(self, x):x1 = self.conv(x)x1 = self.bn(x1)x1 = self.max_pool(x1)x1 = self.flatten(x1)x1 = self.dense_final_1(x1)x2 = self.reshape(x)x2 = self.lstm(x2)x2 = self.flatten(x2)x2 = self.dense_final_2(x2)x = self.concat([x1, x2])x = self.dense_final(x)return x

定义模型:

model = CustomModel()
model.compile(loss=tf.keras.losses.CategoricalCrossentropy(),optimizer='adam',metrics=['accuracy']
)model.fit(train_data, epochs=3, validation_data=test_data)

训练结果:

Epoch 1/3
782/782 [==============================] - 19s 22ms/step - loss: 1.5181 - accuracy: 0.4642 - val_loss: 1.4310 - val_accuracy: 0.4992
Epoch 2/3
782/782 [==============================] - 16s 21ms/step - loss: 1.1988 - accuracy: 0.5753 - val_loss: 1.4605 - val_accuracy: 0.5062
Epoch 3/3
782/782 [==============================] - 16s 21ms/step - loss: 1.0663 - accuracy: 0.6258 - val_loss: 1.5351 - val_accuracy: 0.5000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/9458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s 使用Docker和Containerd对比分析

目录 k8s 使用Docker和Containerd对比分析 互动1:docker build构建的镜像和containerd镜像通用吗? 互动2:k8s1.24之前版本和1.24及1.24之后版本区别? k8s 使用Docker和Containerd对比分析 如果你使用Docker作为K8S容器运行时的…

企业内外网隔离后的文件传输解决方案

一、企业为什么要进行内外网隔离 在当今信息化快速发展的时代,企业内部网络的构建和管理显得尤为重要。为了更好地保护企业信息安全和提高工作效率,许多企业选择将网络划分为内网和外网。那么,企业划分内外网的作用具体体现在哪些方面呢&…

图片批量高效美化,轻松为图片进行消浊美化,让图片焕然一新

图片已经成为我们传递信息、表达情感的重要媒介。无论是社交媒体的分享,还是工作文档的展示,精美的图片总能吸引更多人的目光。然而,对于许多人来说,图片的美化却是一个令人头疼的问题。一张张手动调整,既耗时又费力&a…

数学AI解题软件有哪些?一分钟分享4款工具

数学AI解题软件有哪些?数学AI解题软件在现代教育中扮演着越来越重要的角色,它们不仅为学生提供了前所未有的解题速度和准确性,还通过个性化的学习建议和资源推荐,促进了学生的自主学习和深度学习。这些软件不仅提高了教育效率&…

Django开发实战之单元测试和集成测试之依赖包的安装

测试有哪些功能: 验证功能质量控制重构基础回归基础 1、安装依赖 pdm add -d black isort flake8 pytest pytest-django pytest-coverage使用依赖 在使用flake8时,需要把venv排除,这里是通过添加配置文件来进行管理,所以接下来…

企业必备:加密软件如何保障商业数据安全

在数字化时代,商业数据安全已成为企业运营中不可忽视的一环。在这个信息爆炸的时代,企业面临着诸多安全威胁,如数据泄露、黑客攻击等。因此,如何有效保障商业数据安全成为了每个企业都必须面对和解决的问题。而加密软件&#xff0…

webstorm 常用插件

安装插件步骤: 打开软件,文件 -- 设置-- 插件 -- 输入插件名称 -- 安装 代码截图: code screenShots 先选中代码,按 ctrl shift alt a,就可截取选中的代码颜色注释: comments highlighter 对注释的文字改变颜色高亮成对符号: h…

新一代多模态合规分析平台,炼就服务洞察火眼金睛

得益于5G技术的深入应用和大模型技术的持续创新,企业与客户间的沟通方式已从单一的语音交流拓展到视频通话、内容共享等多模态互动。 这种通话形式的演变,极大地丰富了沟通手段,并为企业提供了更多洞察客户需求、提供精准服务的机遇。 与此…

上海AI Lab开源首个可替代GPT-4V的多模态大模型

与开源和闭源模型相比,InternVL 1.5 在 OCR、多模态、数学和多轮对话等 18 个基准测试中的 8 个中取得了最先进的结果。 上海AI Lab 推出的 InternVL 1.5 是一款开源的多模态大语言模型 (MLLM),旨在弥合开源模型和专有商业模型在多模态理解方面的能力差距…

【智能算法应用】麻雀搜索算法求解非线性方程组问题

目录 1.算法原理2.数学模型3.结果展示4.代码获取 1.算法原理 【智能算法】麻雀搜索算法(SSA)原理及实现 2.数学模型 非线性方程组为: 2 x 1 − x 2 e − x 1 − x 1 2 x 2 e − x 2 (1) \begin{aligned}&2x_1-x_2e^{-x_1}\\&-…

基于机器学习的学生学习行为自主评价设计与实现

管理员功能: a)学生学习数据管理:可查看学生学习的详情,编辑学生学习的内容,删除和添加学生学习,设置学生学习库存。 b)角色管理:增加删除学生用户,分配学生用户权限,查看学生用户…

油猴脚本:BOSS候选人简历工作履历时间自动计算显示

BOSS的候选人工作履历时间不计算,不符合我的查看习惯,很容易让那种经常跳槽的人简历通过,容易遗漏,特编写此程序! 使用前:使用后: 代码如下: // UserScript // name BOSS网页版辅助器…

马蹄集oj赛(双周赛第二十六次)

目录 斐波那契数列的组合 三国杀 数列分段 小码哥的跳棋游戏新编 能量供应 小码哥爱数字 最小串 小船过河 摘果子 泼墨淋漓 很重的枪 小码哥的布阵指挥 斐波那契数列的组合 #include<bits/stdc.h> using namespace std;// 斐波那契数列 1 1 2 3 5 8 13 21 34…

LeetCode HOT 100刷题总结

文章目录 1 哈希1.1 1-1.两数之和&#x1f7e2;1.2 2-49.字母异位词分组&#x1f7e1;1.3 3-128.最长连续序列&#x1f7e1; 2 双指针2.1 4-283.移动零&#x1f7e2;2.2 6-15.三数之和&#x1f7e1;2.3 7-11.盛最多水的容器&#x1f7e1;2.4 8-42.接雨水&#x1f534; 3 滑动窗…

程控负载的功能实现原理

程控负载&#xff0c;顾名思义&#xff0c;就是可以通过程序控制其工作状态的负载设备。它的主要功能是模拟实际负载的工作状态&#xff0c;为电源、电子设备等提供稳定的工作电流或电压。程控负载的功能实现原理主要包括以下几个方面&#xff1a; 1. 电流和电压调节&#xff1…

开源模型应用落地-CodeQwen模型小试-SQL专家测试(二)

一、前言 代码专家模型是基于人工智能的先进技术&#xff0c;它能够自动分析和理解大量的代码库&#xff0c;并从中学习常见的编码模式和最佳实践。这种模型可以提供准确而高效的代码建议&#xff0c;帮助开发人员在编写代码时避免常见的错误和陷阱。 通过学习代码专家模型&…

ChatGPT开源的whisper音频生成字幕

1、前言 好了&#xff0c;那接下来看一下whisper开源库的介绍 有五种模型大小&#xff0c;其中四种仅支持英语&#xff0c;提供速度和准确性的权衡。上面便是可用模型的名称、大致的内存需求和相对速度。如果是英文版的语音&#xff0c;直接想转换为英文。 本来我是想直接在我的…

魔法程序员的奥妙指南:Java基本语法

作为一名魔法程序员&#xff0c;精通Java语言是至关重要的。Java作为一种强大的编程语言&#xff0c;在编写优质代码和开发强大应用程序时发挥着重要作用。让我们深入探讨Java基本语法的关键要点&#xff0c;从注释到变量&#xff0c;无所不包&#xff01; Java基本语法的神秘魔…

Linux网络编程:TCP并发服务器实现

目录 1、前言 2、多进程代码实现 2.1 创建新的进程 2.2 客户端接收响应函数 2.3 僵尸进程处理 2.4 完整代码 2.5 代码测试 3、多线程代码实现 3.1 创建新的线程 3.2 线程函数定义 3.3 完整代码 3.4 代码测试 4、总结 1、前言 前面实现了基本的TCP编程&#xf…

一文了解美国洛杉矶私有云的亮点优势

美国洛杉矶作为全球科技与经济的重要中心&#xff0c;其私有云服务的亮点优势备受瞩目。以下是对洛杉矶私有云优势的科普介绍。 首先&#xff0c;洛杉矶私有云的核心优势在于其安全性。在私有云环境中&#xff0c;数据被存储在专有的、隔离的服务器上&#xff0c;这意味着只有授…