机器学习中的神经网络重难点!纯干货(下篇)

上篇文章地址:机器学习中的神经网络重难点!纯干货(上篇)-CSDN博客

目录

长短时记忆网络

基本原理

一个示例

自注意力模型

基本原理

自注意力机制

具体步骤

一个案例

生成对抗网络

基本原理

一个案例

长短时记忆网络

LSTM就像一个有记忆的人,可以记住重要的信息并且忘记不重要的。

特别擅长处理长序列数据,因为它可以在很长的序列中捕捉和保持关键信息,而不会被无关信息淹没。

基本原理

LSTM的核心思想是细胞状态(cell state)和门(gates)的概念。细胞状态就像LSTM的记忆,它可以传递信息并在必要时保留或删除。

门用于控制信息的流动,包括遗忘不必要的信息和记住重要的信息。

LSTM的工作过程分为三个主要步骤:遗忘、存储和更新。

1、遗忘:细胞状态决定哪些信息应该被遗忘,哪些信息应该保留。门控制着遗忘的过程。

2、存储:新的信息被添加到细胞状态中,以更新记忆。门还可以控制信息的存储。

3、更新:基于当前的输入和细胞状态,LSTM生成新的输出和细胞状态,这将成为下一个时间步的输入。

一个示例

使用Python和TensorFlow来构建一个LSTM模型,并将其应用于文本生成。


import tensorflow as tf
import numpy as np

# 创建示例数据
text = "这是一个示例文本。LSTM将学会预测下一个字符。"
chars = sorted(list(set(text)))
char_to_index = {char: index for index, char in enumerate(chars)}
index_to_char = {index: char for index, char in enumerate(chars)}

# 准备数据
max_sequence_length = 100
sequences = []
next_chars = []
for i in range(0, len(text) - max_sequence_length, 1):
    sequences.append(text[i:i + max_sequence_length])
    next_chars.append(text[i + max_sequence_length])

X = np.zeros((len(sequences), max_sequence_length, len(chars)), dtype=np.bool)
y = np.zeros((len(sequences), len(chars)), dtype=np.bool)
for i, sequence in enumerate(sequences):
    for t, char in enumerate(sequence):
        X[i, t, char_to_index[char]] = 1
    y[i, char_to_index[next_chars[i]]] = 1

# 构建LSTM模型
model = tf.keras.Sequential([
    tf.keras.layers.LSTM(128, input_shape=(max_sequence_length, len(chars))),
    tf.keras.layers.Dense(len(chars), activation='softmax')
])

# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy')

# 训练模型
model.fit(X, y, epochs=100)

# 生成文本
seed_text = "这是一个示例文本。LSTM将学会预测下一个字符。"
generated_text = seed_text
for i in range(100):
    x = np.zeros((1, max_sequence_length, len(chars)))
    for t, char in enumerate(generated_text[-max_sequence_length:]):
        x[0, t, char_to_index[char]] = 1
    predicted_char = index_to_char[np.argmax(model.predict(x, verbose=0)]
    generated_text += predicted_char

代码中实现的是构建了一个LSTM模型,用于文本生成。模型学会了根据前面的文本生成后续文本,展示了LSTM如何捕捉文本中的序列信息。

自注意力模型

Transformer是一种能够理解文本和序列数据的神经网络模型。它的独特之处在于使用了自注意力机制,这意味着它能够同时关注输入数据中的不同部分,而不像传统的循环神经网络(RNN)或卷积神经网络(CNN)那样依赖于固定窗口大小或序列顺序。

Transformer的核心思想是将输入数据分为不同的“词嵌入”(word embeddings),然后使用自注意力机制来决定这些词嵌入之间的关联程度。这种方式使得模型可以处理长文本并捕捉到不同单词之间的复杂关系。

基本原理

自注意力机制

自注意力机制是Transformer的核心。它的思想是计算输入序列中每个位置对其他位置的重要性。这个重要性是通过计算一个权重值的方式来实现的,而这个权重值是根据输入的相似性来决定的。重要的是,这种计算是基于输入数据本身完成的,因此不受序列长度的限制。

具体步骤

1、嵌入层(Embedding Layer):将输入的文本序列转化为向量形式,每个词对应一个向量。这些向量被训练成具有语义信息的表示。

2、自注意力计算:对于每个词,计算它与所有其他词的相似性得分,然后将这些分数作为权重来加权其他词的嵌入向量。这个过程允许模型更关注与当前词相关的词。

3、多头自注意力:Transformer可以通过多个自注意力头来捕捉不同层次的关系,每个头都会生成一组权重,最后合并它们。

4、残差连接与层归一化:将多头自注意力的输出与输入相加,并应用层归一化,以防止梯度消失或爆炸。

5、前馈神经网络(Feed-Forward Network):对每个位置的向量进行非线性变换,以增强模型的表示能力。

6、编码器和解码器:在机器翻译等任务中,Transformer通常由编码器和解码器组成,它们分别用于处理输入和生成输出。

一个案例

首先,假设我们有一个文本分类任务,需要将文本句子分为正面和负面情感。

代码中,包括创建Transformer模型、输入数据和运行模型的步骤:

 
import torch
import torch.nn as nn

# 创建一个简化的Transformer模型类
class TransformerModel(nn.Module):
    def __init__(self, d_model, nhead, num_encoder_layers):
        super(TransformerModel, self).__init__()
        self.transformer = nn.Transformer(d_model, nhead, num_encoder_layers)
    
    def forward(self, src, tgt):
        output = self.transformer(src, tgt)
        return output

# 创建示例数据
# 假设我们有一个输入序列(src)和一个目标序列(tgt)
# 这里我们使用随机生成的数据,实际应用中应该替换为真实数据
src = torch.rand((10, 3, 512))  # 输入序列,形状:(sequence_length, batch_size, embedding_dim)
tgt = torch.rand((20, 3, 512))  # 目标序列,形状:(sequence_length, batch_size, embedding_dim)

# 初始化模型
model = TransformerModel(512, 8, 6)

# 运行模型
output = model(src, tgt)
print(output.shape)

在上述代码中:

1、我们创建了一个简化的Transformer模型(TransformerModel),它接受输入序列(src)和目标序列(tgt)。

2、我们使用torch.rand函数生成了随机的示例数据,其中src代表输入序列,tgt代表目标序列。这些数据应该由任务提供,实际应用中会更有意义。

3、我们初始化了模型并将输入数据传递给它,最后打印了输出的形状。

要注意的是,这个示例的数据和任务仅用于演示Transformer模型的使用方式。在实际情况下,需要准备适当的数据和任务设置来训练和使用Transformer模型。

生成对抗网络

生成对抗网络核心思想是模拟人类创造事物的方式。

GANs由两个主要部分组成:生成器(Generator)和判别器(Discriminator)。这两个部分之间进行博弈,使生成器逐渐学会创建逼真的数据,而判别器则逐渐变得更擅长区分真假数据。

基本原理

1、生成器(Generator):生成器的任务是接收一个随机噪声向量,然后将其转化为逼真的数据,例如图像。生成器是一个神经网络,通过不断调整其参数,使其生成的数据与真实数据尽可能相似。

2、判别器(Discriminator):判别器的任务是区分生成器生成的数据和真实数据。判别器也是一个神经网络,它会对输入的数据进行评估,输出一个0到1之间的概率值,表示数据的真实程度。

3、对抗训练:生成器和判别器交替进行训练。生成器努力生成更逼真的数据,而判别器努力变得更善于区分真伪。这种博弈过程推动了生成器不断提高生成的数据质量。

1、生成器的损失函数:生成器的目标是最小化,其中是判别器对生成器生成数据的评价。

2、判别器的损失函数:判别器的目标是最小化,其中是判别器对真实数据的评价,是对生成器生成数据的评价。

一个案例

我们以图像生成为例,使用Python和TensorFlow库来演示一个简单的GANs模型。

import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten, Reshape
from tensorflow.keras.models import Sequential

# 创建生成器和判别器网络
def build_generator():
    model = Sequential()
    model.add(Dense(128, input_dim=100, activation='relu'))
    model.add(Dense(784, activation='sigmoid'))
    model.add(Reshape((28, 28, 1)))
    return model

def build_discriminator():
    model = Sequential()
    model.add(Flatten(input_shape=(28, 28, 1)))
    model.add(Dense(128, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    return model

# 定义损失函数和优化器,并编译生成器和判别器
generator = build_generator()
discriminator = build_discriminator()

discriminator.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
discriminator.trainable = False

gan_input = tf.keras.Input(shape=(100,))
x = generator(gan_input)
gan_output = discriminator(x)

gan = tf.keras.Model(gan_input, gan_output)
gan.compile(loss='binary_crossentropy', optimizer='adam')


# 训练GANs模型
for epoch in range(epochs):
    for _ in range(batch_size):
        noise = np.random.normal(0, 1, [batch_size, 100])
        generated_images = generator.predict(noise)
        image_batch = x_train[np.random.randint(0, x_train.shape[0], size=batch_size)]

        discriminator.trainable = True
        d_loss_real = discriminator.train_on_batch(image_batch, np.ones((batch_size, 1)))
        d_loss_fake = discriminator.train_on_batch(generated_images, np.zeros((batch_size, 1)))
        d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)

        noise = np.random.normal(0, 1, [batch_size, 100])
        discriminator.trainable = False
        g_loss = gan.train_on_batch(noise, np.ones((batch_size, 1)))

# 生成并可视化手写数字图像
num_samples = 16
noise = np.random.normal(0, 1, [num_samples, 100])
generated_images = generator.predict(noise)

for i in range(num_samples):
    plt.subplot(4, 4, i + 1)
    plt.imshow(generated_images[i, :, :, 0] * 0.5 + 0.5, cmap='gray')
    plt.axis('off')

plt.show()

代码展示了一个简单的GANs模型,用于生成手写数字图像。

训练之后,生成器将生成逼真的手写数字图像,判别器将变得更难以区分真假图像。

生成对抗络是用于各种创意领域。它基于生成器和判别器的博弈,通过不断优化生成器来创造逼真的数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RTSP/Onvif安防监控平台EasyNVR抓包命令tcpdump使用不了,该如何解决?

安防视频监控汇聚EasyNVR智能安防视频监控平台,是基于RTSP/Onvif协议的安防视频平台,可支持将接入的视频流进行全平台、全终端分发,分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。平台可提供的视频能力包括:…

区间DP——AcWing 282. 石子合并

区间DP 定义 区间 DP 是动态规划的一种特殊形式,主要是在一段区间上进行动态规划计算。 运用情况 通常用于解决涉及在一段区间内进行操作、计算最优值等问题。比如计算一个区间内的最大子段和、最小分割代价等。一些常见的场景包括合并操作、划分操作等在区间上…

华火新能源集成灶评测:创新与品质的融合

在厨房电器的不断推陈出新中,华火新能源集成灶以其独特的魅力进入了人们的视野。今天,我们就来深入评测这款备受关注的产品——华火新能源集成灶 一、华火新能源集成灶的创新与环保 首先,我们先来探讨新能源集成灶的整体表现。华火新能源集成…

如何将扫描的 PDF 转换为 Word

您是否正在寻找一种可靠且轻松的方式将扫描的 PDF 文档转换为可编辑的 Word 文件?要将 PDF 转换为可编辑的 Word 文档,神奇之处在于光学字符识别(OCR)。 使用 PDFgear,您可以无缝地将扫描的 PDF 转换为 Word,无论是在线还是离线。…

【电子实验4】TDA2030功率放大电路

🚩 WRITE IN FRONT 🚩 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四" 🔎🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

【vue3|第8期】深入理解Vue 3 computed计算属性

日期:2024年6月10日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xf…

Aptos Builder Jam 亚洲首站|议程公布,无限畅想 Aptos 生态未来

作为一个新兴的 Layer1 公链,Aptos 自诞生之日起的理想便是 “A Layer 1 for everyone” 当 Web3 深陷熊市阴影之时,Aptos 奋力为开发者找到了全新的技术路径,正有 200 项目正在开发,并且已有大量 DeFi 项目落实部署工作&#xff…

【Kubernetes】k8s 自动伸缩机制—— HPA 部署

一、在K8s中扩缩容分为两种: ●Node层面:对K8s物理节点扩容和缩容,根据业务规模实现物理节点自动扩缩容 ●Pod层面:我们一般会使用Deployment中的Replicas参数,设置多个副本集来保证服务的高可用,但是这是…

【python中的转义字符】

在Python中,除了换行符(\n)和制表符(\t),还有许多其他的转义字符和字符串格式化符号可以使用。以下是一些常见的例子: 1、常见的转义字符 ### 常见的转义字符 1. **换行符**: \n 2. **制表符*…

高创新模型,基于STFT-SWT-双流CNN-SVM的小样本轴承故障诊断方法,MATLAB代码

。前言 现如今,大家为了找创新点发个小论文,也真是煞费苦心!各大博主推出的很多算法层出不穷,各式各样的组合真是看花了眼!但有时也不能为了创新而创新,效果好才是真的好! 本期推出一种《基于ST…

c语言哈夫曼中英文混合编码

一.需求文档 c语言实现哈夫曼编码 1.中文编码 2.英文编码 3.中英文混合编码 4.从文件读取进行编码 5.编码生成编码文件 6.从生成的编码文件进行解码 二.运行截图

洗护用品行业怎么做到数据安全管理?迅软DSE加密软件避免数据泄露

项目背景 公司全研发中心内部专家联合外部专家组织,充分发挥联合研究、探讨技术发展带来的重要性,产品开发、核心技术开发、工艺技术研究和创新,已形成了坚实的研发后盾,已拥有了大量的核心信息数据,为防患于未然&…

程序员画图工具?那必然是你了!!【送源码】

作为一个程序员,画图是必不可少的技巧。当然此画图不是搞艺术,而是画各种架构图、流程图、泳道图以及各种示意图。 平时我不论是记笔记、写技术文章,还是工作中写文档,都需要配上各种各样的示意图。不管是帮助自己更好的掌握知识…

【Netty】nio阻塞非阻塞Selector

阻塞VS非阻塞 阻塞 阻塞模式下,相关方法都会导致线程暂停。 ServerSocketChannel.accept() 会在没有建立连接的时候让线程暂停 SocketChannel.read()会在没有数据的时候让线程暂停。 阻塞的表现就是线程暂停了,暂停期间不会占用CPU,但线程…

1:25万基础电子地图(云南版)

我们在《50幅1:25万基础电子地图(四川版)》一文中,为你分享过四川的50幅基础电子地图。 现在我们再为你分享云南的1:25万基础电子地图,你可以在文末查看该数据的领取方法。 基础电子地图云南版 下载后可以看到该数据…

【S32K 进阶之旅】 将 EB 配置生成的 MCAL 代码集成到 S32DS 中

本文介绍如何使用 S32DS 进行 AUTOSAR MCAL 工程的编译和调试,重点在于将 EB 配置生成的 MCAL 代码集成到 S32DS 中。 虽然配置过程较为繁琐,实操过一遍就会熟悉整个工程的框架。以后每次在 EB 中更新配置,生成代码的文件夹已经集成在 S32DS…

代码随想录——分割回文串(Leetcode 131)

题目链接 回溯 class Solution {List<List<String>> res new ArrayList<List<String>>();List<String> list new ArrayList<String>();public List<List<String>> partition(String s) {backtracking(s, 0);return res;}p…

博瓦科技产品亮相湖北安博会啦!!!

6月12日&#xff0c;第二十三届2024中国&#xff08;武汉&#xff09;社会公共安全产品暨数字城市产业展览会&#xff08;简称&#xff1a;湖北安博会&#xff09;在武汉国际会展中心隆重开幕。作为行业内最具影响力的展会之一&#xff0c;此次盛会将汇聚来自全球的顶尖企业、专…

AbMole带你探索细胞的“铁”门:Piezo1通道在椎间盘退变中的关键角色

在生物医学领域&#xff0c;铁是细胞功能不可或缺的元素&#xff0c;但铁的异常积累却可能成为细胞的“隐形杀手”。最近&#xff0c;一项发表在《Bone Research》上的研究&#xff0c;为我们揭开了铁代谢与椎间盘退变之间神秘联系的一角。这项研究不仅深化了我们对铁离子通道P…

长难句打卡6.17

At a time when Thomas Piketty and other economists are warning of rising inequality and the increasing power of inherited wealth, it is bizarre that wealthy aristocratic families should still be the symbolic heart of modern democratic states. 在托马斯皮凯…