深入了解前馈网络、CNN、RNN 和 Hugging Face 的 Transformer 技术!

news2024/11/17 7:33:32

   一、说明

        本篇在此对自然语言模型做一个简短总结,从CNN\RNN\变形金刚,和抱脸的变形金刚库说起。

二、基本前馈神经网络:

        让我们分解一个基本的前馈神经网络,也称为多层感知器(MLP)。此代码示例将:

  1. 定义神经网络的架构。
  2. 初始化权重和偏差。
  3. 使用 sigmoid 激活函数实现前向传播。
  4. 使用均方误差损失函数实现训练的反向传播。
  5. 演示在简单数据集上的训练。
import numpy as np

class NeuralNetwork:
    def __init__(self, input_size, hidden_size, output_size):
        # Initialize weights and biases with random values
        self.weights1 = np.random.randn(input_size, hidden_size)
        self.weights2 = np.random.randn(hidden_size, output_size)
        self.bias1 = np.random.randn(1, hidden_size)
        self.bias2 = np.random.randn(1, output_size)
    
    def sigmoid(self, x):
        return 1 / (1 + np.exp(-x))
    
    def sigmoid_derivative(self, x):
        return x * (1 - x)
    
    def forward(self, X):
        self.hidden = self.sigmoid(np.dot(X, self.weights1) + self.bias1)
        output = self.sigmoid(np.dot(self.hidden, self.weights2) + self.bias2)
        return output
    
    def train(self, X, y, epochs, learning_rate):
        for epoch in range(epochs):
            # Forward propagation
            output = self.forward(X)
            
            # Compute error
            error = y - output
            
            # Backward propagation
            d_output = error * self.sigmoid_derivative(output)
            error_hidden = d_output.dot(self.weights2.T)
            d_hidden = error_hidden * self.sigmoid_derivative(self.hidden)
            
            # Update weights and biases
            self.weights2 += self.hidden.T.dot(d_output) * learning_rate
            self.bias2 += np.sum(d_output, axis=0, keepdims=True) * learning_rate
            self.weights1 += X.T.dot(d_hidden) * learning_rate
            self.bias1 += np.sum(d_hidden, axis=0, keepdims=True) * learning_rate

            # Print the error at every 1000 epochs
            if epoch % 1000 == 0:
                print(f"Epoch {epoch}, Error: {np.mean(np.abs(error))}")

# Sample data for XOR problem
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])

# Create neural network instance and train
nn = NeuralNetwork(input_size=2, hidden_size=4, output_size=1)
nn.train(X, y, epochs=10000, learning_rate=0.1)

# Test the neural network
print("Predictions after training:")
for data in X:
    print(f"{data} => {nn.forward(data)}")

在这个例子中,我们使用神经网络来解决异或问题,这是一个单层感知器无法解决的经典问题。

这种前馈神经网络只有一个隐藏层,这使得它能够学习非线性关系。调整隐藏层大小、学习率和周期数等参数会影响神经网络的性能和准确性。

三、卷积神经网络 (CNN)

CNN 专为图像处理而设计,包括称为卷积层的层,这些层对输入数据应用卷积运算,强调局部特征。

3.1 CNN的基本结构:

        以下是使用 TensorFlow 和 Keras 库的基本卷积神经网络 (CNN) 的更全面实现。此示例将:

  1. 加载 MNIST 数据集,这是一个用于手写数字识别的常用数据集。
  2. 对数据进行预处理。
  3. 定义基本的 CNN 架构。
  4. 使用优化器、损失函数和度量编译模型。
  5. 在 MNIST 数据集上训练 CNN。
  6. 评估经过训练的 CNN 在测试数据上的准确性。

3.2 相关代码实现

# Import necessary libraries
import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical

# Load and preprocess the dataset
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

# Define the CNN architecture
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

# Compile the model
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# Train the model
model.fit(train_images, train_labels, epochs=5, batch_size=64)

# Evaluate the model's accuracy on the test data
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f'Test accuracy: {test_acc}')

在此示例中,基本 CNN 有三个卷积层,后跟最大池化层。在卷积层之后,我们将输出展平,并将其传递到两个密集(全连接)层。

最后的密集层有 10 个神经元,每个神经元代表一个从 0 到 9 的数字,具有 softmax 激活函数来产生类概率。

这是MNIST数据集的一个简单而有效的CNN。您可以通过添加更多层、使用正则化 dropout 等技术或采用高级优化技术来进一步改进网络。

四、循环神经网络 (RNN)

RNN 旨在识别数据序列中的模式,例如文本或时间序列。它们保留对先前输入的记忆。

4.1 基本RNN结构:

        让我们使用 TensorFlow 和 Keras 创建一个基本的递归神经网络 (RNN)。此示例将演示:

  1. 加载序列数据集(我们将使用 IMDB 情感分析数据集)。
  2. 预处理数据。
  3. 定义一个简单的 RNN 架构。
  4. 使用优化器、损失函数和度量编译模型。
  5. 在数据集上训练 RNN。
  6. 评估经过训练的 RNN 在测试数据上的准确性。

4.2 相关代码实现

# Import necessary libraries
import tensorflow as tf
from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing.sequence import pad_sequences

# Constants
VOCAB_SIZE = 10000
MAX_LEN = 500
EMBEDDING_DIM = 32

# Load and preprocess the dataset
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=VOCAB_SIZE)

# Pad sequences to the same length
train_data = pad_sequences(train_data, maxlen=MAX_LEN)
test_data = pad_sequences(test_data, maxlen=MAX_LEN)

# Define the RNN architecture
model = tf.keras.Sequential([
    tf.keras.layers.Embedding(VOCAB_SIZE, EMBEDDING_DIM, input_length=MAX_LEN),
    tf.keras.layers.SimpleRNN(32, return_sequences=True),
    tf.keras.layers.SimpleRNN(32),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

# Compile the model
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])

# Train the model
model.fit(train_data, train_labels, epochs=10, batch_size=128, validation_split=0.2)

# Evaluate the model's accuracy on the test data
test_loss, test_acc = model.evaluate(test_data, test_labels)
print(f'Test accuracy: {test_acc}')

在此示例中,我们首先使用嵌入层将整数序列转换为固定大小的密集向量。然后,两个 RNN 层处理序列。

具有 sigmoid 激活函数的最后一个密集层输出一个概率,指示评论的情绪(0 表示负面,1 表示正面)。

值得注意的是,在实际应用中,您可能需要考虑使用更高级的递归层,如 LSTM 或 GRU,因为它们可以比基本 RNN 更好地捕获远程依赖关系。

此外,可以根据特定的应用程序和数据集对超参数(如 、 和)进行微调,以获得最佳结果。VOCAB_SIZEMAX_LENEMBEDDING_DIM

五、变形金刚

Transformer 最初是为自然语言处理任务而设计的,具有自注意力机制,允许它们权衡输入不同部分的重要性。

5.1 Transformer 片段(使用 Hugging Face 的 Transformers 库):

Hugging Face 的 Transformers 库使使用 BERT、GPT-2 等 Transformer 架构变得非常容易。让我们创建一个基本示例:

  1. 加载用于文本分类的预训练 BERT 模型。
  2. 标记化一些输入句子。
  3. 通过 BERT 模型传递标记化输入。
  4. 输出预测的类概率。

5.2 相关代码实现

        在本演示中,让我们使用 BERT 模型进行序列分类:

# Installation (if you haven't done it yet)
#!pip install transformers

# Import required libraries
from transformers import BertTokenizer, BertForSequenceClassification
import torch

# Load pretrained model and tokenizer
model_name = 'bert-base-uncased'
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)  # For binary classification
tokenizer = BertTokenizer.from_pretrained(model_name)

# Tokenize input data
input_texts = ["I love using transformers!", "This library is difficult to understand."]
inputs = tokenizer(input_texts, return_tensors='pt', padding=True, truncation=True, max_length=512)

# Forward pass: get model predictions
with torch.no_grad():
    outputs = model(**inputs)
    logits = outputs.logits
    probabilities = torch.nn.functional.softmax(logits, dim=-1)

# Display predicted class probabilities
print(probabilities)

此脚本初始化用于二进制序列分类的 BERT 模型,对输入句子进行标记,然后根据模型的对数进行预测。

最终输出 , 包含输入句子的预测类概率。probabilities

请注意,此模型已针对二元分类(使用 )进行了初始化,因此它最适合情绪分析等任务。num_labels=2

对于多类分类或其他任务,您可以调整并可能选择不同的预训练模型,或者在特定数据集上微调模型。num_labels

六、结论

        深度学习的世界是广阔的,正如所展示的那样,其算法可能会根据其应用领域变得复杂。然而,多亏了 TensorFlow 和 Hugging Face 等高级库,使用这些算法变得越来越容易。

旅程

 

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

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

相关文章

玻色量子“揭秘”之集合划分问题与QUBO建模

摘要:集合划分问题(Set Partitioning Problem)是一种组合优化问题,其中给定一个集合S和其若干个不同的子集S1,S2,...,Sn后,需要找到子集的有效组合,使得集合S的每个元素正…

高通Camera HAL3: CamX、Chi-CDK要点

目录 一、概述 二、目录 三、CamX组件之前的关系 一、概述 高通CamX架构是高通实现的相机HAL3架构,被各OEM厂商广泛采用。 二、目录 代码位于vendor/qcom/proprietary下: camx:通用功能性接口的代码实现集合chi-cdk:可定制化…

shell循环语句 for while until

目录 什么是循环语句 概念 for循环 格式 while循环 格式 until 循环 格式 实验 for (1)计算1到100的和 ​编辑 (2)100以内的偶数 (从0开始到100结束,每次加2步 打印的都是偶数) &…

ELK架构

经典的ELK 经典的ELK主要是由Filebeat Logstash Elasticsearch Kibana组成,如下图:(早期的ELK只有Logstash Elasticsearch Kibana) 此架构主要适用于数据量小的开发环境,存在数据丢失的危险。 整合消息队列Ngin…

Spring框架学习 -- 读取和存储Bean对象

目录 🚀🚀 回顾 getBean()方法的使用 根据name来获取对象 再谈getBean() (1) 配置扫描路径 (2) 添加注解 ① spring注解简介 ② 对类注解的使用 ③ 注解Bean对象的命名问题 ④ 方法加Bean注解 (3) Bean 注解的重命名 (4) 获取Bean对象 -- …

投标文件的注意事项

一、检查标书 1.1有时候标书需要从别的地方复制黏贴文件,记住复制内容可以,但是不要复制“落款和时间”的格式,落款和时间的格式借鉴你的招标文件中给响应文件格式的落款和时间,切记! 1.2检查标书是否有空页&#xf…

数据中心运维管理:从人工到智能需要走几步?

一切的变化来自于数据中心规模、复杂度、设备多样性的挑战,将运维平台的重要性推向历史高点。 此外,基于业务连续性方面的考虑,分布式数据中心成为越来越多客户的选择。 一、数据中心面临的挑战 运维管理分散,缺乏统一的管理 I…

Linux:设置Ubuntu的root用户密码

执行以下命令: 给root用户设置密码 sudo passwd 输入两次密码 切换root su root 退出root用户 exit

地埋式积水监测仪厂家直销推荐,致力于积水监测

地埋式积水监测仪是一种高科技设备,能够实时监测地面积水深度,并及时发出预警信息,有效避免因积水而产生的安全隐患。这种智能监测仪可以安装在城市道路、立交桥、地下车库等易积水地势较低的地方,以确保及时监测特殊地段的积水&a…

【Sorted Set】Redis常用数据类型: ZSet [使用手册]

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 目录 ⑤Redis Zset 操作命令汇总1. zadd 添加或…

APM工具skywalking部署

一 整体架构 整个架构,分成上、下、左、右四部分: 上部分 Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而我们目前采用的是&…

css渐变详解(重复性线性渐变、径向渐变、重复性径向渐变的使用)

目录 线性渐变 重复性线性渐变 径向渐变 重复性径向渐变的使用 线性渐变 线性渐变是向下、向上、向左、向右、对角方向的颜色渐变。 其语法格式为: background-image: linear-gradient(side-or-corner|angle, linear-color-stop); 参数说明如下: …

mongo DB -- aggregate分组查询后字段展示

一、分组查询 在mongoDB中可以使用aggregate中的$group操作对集合中的文档进行分组,但是查询后的数据不显示其他字段,只显示分组字段 aggregate进行分组示例 db.collection.aggregate([{$group: {_id: "$field"}},]) 查询后显示 展开只显示两个字段 二、显示所有字段…

10.分组循环练习题

分组循环 https://leetcode.cn/problems/longest-even-odd-subarray-with-threshold/solutions/2528771/jiao-ni-yi-ci-xing-ba-dai-ma-xie-dui-on-zuspx/?envTypedaily-question&envId2023-11-16 分组循环 适用场景: 按照题目要求,数组会被分割成若…

微信运营神器:从群发到批量添加,让你的微信营销更轻松

在这个数字化时代,微信已经成为了我们生活中不可或缺的一部分。对于许多企业和个人来说,微信营销也是非常重要的一部分。但是,微信营销并不是一件容易的事情,需要花费大量的时间和精力。为了解决这个问题,今天我们将向…

邻趣连接力:如何无代码集成CRM、电商平台和营销系统,提升广告推广效率

连接即服务:邻趣无代码集成方法 传统的电商系统集成过程需要大量的时间和资源进行API开发,这不仅耗时耗力,还需要专业的技术团队支持。然而,邻趣通过提供一种无需API开发的连接方法,极大地简化了整个集成过程。商家只…

3D人脸扫描设备助力企业家数字人复刻,打破商业边界

京都薇薇推出数字人VN,以京都薇薇董事长为原型制作,赋能品牌直播、短片宣传、线上面诊等活动,进一步增强消费者对品牌的交互体验,把元宇宙与品牌相融合,推动品牌线上服务与线下服务实现数字一体化,打造一个…

【C/C++】排序算法代码实现

这里&#xff0c;汇总了常见的排序算法具体代码实现。使用C语言编写。 排序算法实现 插入排序冒泡排序选择排序快速排序希尔排序归并排序 插入排序 #include <stdio.h> #include <stdlib.h>void InsertSort(int arr[],int n){int i,j,temp;for(i 1;i < n;i){ …

捷诚管理信息系统 SQL注入漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、产品介绍 捷诚管理信息系统是一款功能全面&#xff0c;可以支持自…

【独家发布】抖音半蓝V官方免费认证技术

先在巨量引擎升级dou账号 随后上传资料进行验证即可 逐步操作 全程实操保姆及教程 后续0粉点亮蓝v技术教程 来自&#xff1a;人类小徐-分享有价值的资源