政安晨:【Keras机器学习示例演绎】(四十一)—— 使用预先训练的词嵌入

目录

设置

简介

下载新闻组 20 数据

让我们来看看这些数据

清洗数据并将数据分成训练集和验证集

创建词汇索引

加载预训练的词嵌入

建立模型

训练模型

导出端到端模型


政安晨的个人主页政安晨

欢迎 👍点赞✍评论⭐收藏

收录专栏: TensorFlow与Keras机器学习实战

希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正!

本文目标:使用预训练的 GloVe 词嵌入对 Newsgroup20 数据集进行文本分类。

设置

import os# Only the TensorFlow backend supports string inputs.
os.environ["KERAS_BACKEND"] = "tensorflow"import pathlib
import numpy as np
import tensorflow.data as tf_data
import keras
from keras import layers

简介


在本例中,我们将展示如何使用预训练的单词嵌入来训练文本分类模型。

我们将使用 Newsgroup20 数据集,该数据集包含 20,000 条属于 20 个不同主题类别的留言板信息。

对于预训练的词嵌入,我们将使用 GloVe 嵌入。

下载新闻组 20 数据

data_path = keras.utils.get_file("news20.tar.gz","http://www.cs.cmu.edu/afs/cs.cmu.edu/project/theo-20/www/data/news20.tar.gz",untar=True,
)

让我们来看看这些数据

data_dir = pathlib.Path(data_path).parent / "20_newsgroup"
dirnames = os.listdir(data_dir)
print("Number of directories:", len(dirnames))
print("Directory names:", dirnames)fnames = os.listdir(data_dir / "comp.graphics")
print("Number of files in comp.graphics:", len(fnames))
print("Some example filenames:", fnames[:5])
Number of directories: 20
Directory names: ['comp.sys.ibm.pc.hardware', 'comp.os.ms-windows.misc', 'comp.windows.x', 'sci.space', 'sci.crypt', 'sci.med', 'alt.atheism', 'rec.autos', 'rec.sport.hockey', 'talk.politics.misc', 'talk.politics.mideast', 'rec.motorcycles', 'talk.politics.guns', 'misc.forsale', 'sci.electronics', 'talk.religion.misc', 'comp.graphics', 'soc.religion.christian', 'comp.sys.mac.hardware', 'rec.sport.baseball']
Number of files in comp.graphics: 1000
Some example filenames: ['39638', '38747', '38242', '39057', '39031']

下面举例说明一个文件的内容:

print(open(data_dir / "comp.graphics" / "38987").read())
Newsgroups: comp.graphics
Path: cantaloupe.srv.cs.cmu.edu!das-news.harvard.edu!noc.near.net!howland.reston.ans.net!agate!dog.ee.lbl.gov!network.ucsd.edu!usc!rpi!nason110.its.rpi.edu!mabusj
From: mabusj@nason110.its.rpi.edu (Jasen M. Mabus)
Subject: Looking for Brain in CAD
Message-ID: <c285m+p@rpi.edu>
Nntp-Posting-Host: nason110.its.rpi.edu
Reply-To: mabusj@rpi.edu
Organization: Rensselaer Polytechnic Institute, Troy, NY.
Date: Thu, 29 Apr 1993 23:27:20 GMT
Lines: 7
Jasen Mabus
RPI student
I am looking for a hman brain in any CAD (.dxf,.cad,.iges,.cgm,etc.) or picture (.gif,.jpg,.ras,etc.) format for an animation demonstration. If any has or knows of a location please reply by e-mail to mabusj@rpi.edu.
Thank you in advance,
Jasen Mabus  

正如你所看到的,有一些标题行明确(第一行就是类别名称)或隐含地(例如,通过 "组织 "存档)泄露了文件的类别。让我们去掉这些标题:

samples = []
labels = []
class_names = []
class_index = 0
for dirname in sorted(os.listdir(data_dir)):class_names.append(dirname)dirpath = data_dir / dirnamefnames = os.listdir(dirpath)print("Processing %s, %d files found" % (dirname, len(fnames)))for fname in fnames:fpath = dirpath / fnamef = open(fpath, encoding="latin-1")content = f.read()lines = content.split("\n")lines = lines[10:]content = "\n".join(lines)samples.append(content)labels.append(class_index)class_index += 1print("Classes:", class_names)
print("Number of samples:", len(samples))
Processing alt.atheism, 1000 files found
Processing comp.graphics, 1000 files found
Processing comp.os.ms-windows.misc, 1000 files found
Processing comp.sys.ibm.pc.hardware, 1000 files found
Processing comp.sys.mac.hardware, 1000 files found
Processing comp.windows.x, 1000 files found
Processing misc.forsale, 1000 files found
Processing rec.autos, 1000 files found
Processing rec.motorcycles, 1000 files found
Processing rec.sport.baseball, 1000 files found
Processing rec.sport.hockey, 1000 files found
Processing sci.crypt, 1000 files found
Processing sci.electronics, 1000 files found
Processing sci.med, 1000 files found
Processing sci.space, 1000 files found
Processing soc.religion.christian, 997 files found
Processing talk.politics.guns, 1000 files found
Processing talk.politics.mideast, 1000 files found
Processing talk.politics.misc, 1000 files found
Processing talk.religion.misc, 1000 files found
Classes: ['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale', 'rec.autos', 'rec.motorcycles', 'rec.sport.baseball', 'rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space', 'soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast', 'talk.politics.misc', 'talk.religion.misc']
Number of samples: 19997

实际上,有一个类别的文件数量并没有达到预期,但差异很小,所以这个问题仍然是一个平衡分类问题。

清洗数据并将数据分成训练集和验证集

# Shuffle the data
seed = 1337
rng = np.random.RandomState(seed)
rng.shuffle(samples)
rng = np.random.RandomState(seed)
rng.shuffle(labels)# Extract a training & validation split
validation_split = 0.2
num_validation_samples = int(validation_split * len(samples))
train_samples = samples[:-num_validation_samples]
val_samples = samples[-num_validation_samples:]
train_labels = labels[:-num_validation_samples]
val_labels = labels[-num_validation_samples:]

创建词汇索引

让我们使用 TextVectorization 对数据集中的词汇进行索引。稍后,我们将使用同一层实例对样本进行矢量化。

我们的图层将只考虑前 20,000 个单词,并截断或填充序列,使其实际长度为 200 个词组。

vectorizer = layers.TextVectorization(max_tokens=20000, output_sequence_length=200)
text_ds = tf_data.Dataset.from_tensor_slices(train_samples).batch(128)
vectorizer.adapt(text_ds)

你可以通过 vectorizer.get_vocabulary() 来获取计算出的词汇量。让我们打印前 5 个词:

vectorizer.get_vocabulary()[:5]
['', '[UNK]', 'the', 'to', 'of']

让我们来矢量化一个测试句子:

output = vectorizer([["the cat sat on the mat"]])
output.numpy()[0, :6]
array([   2, 3480, 1818,   15,    2, 5830])

如您所见,"the "被表示为 "2"。既然 "the "是词汇表中的第一个词,为什么不是 0 呢?这是因为索引 0 是为填充保留的,而索引 1 则是为 "词汇表外 "标记保留的。

下面是一个将单词映射到其索引的 dict:

voc = vectorizer.get_vocabulary()
word_index = dict(zip(voc, range(len(voc))))

正如您所看到的,我们为测试句子获得了与上述相同的编码:

test = ["the", "cat", "sat", "on", "the", "mat"]
[word_index[w] for w in test]
[2, 3480, 1818, 15, 2, 5830]

加载预训练的词嵌入

让我们下载预训练的 GloVe 嵌入(压缩文件 822M)。
您需要运行以下命令:

!wget https://downloads.cs.stanford.edu/nlp/data/glove.6B.zip
!unzip -q glove.6B.zip
--2023-11-19 22:45:27--  https://downloads.cs.stanford.edu/nlp/data/glove.6B.zip
Resolving downloads.cs.stanford.edu (downloads.cs.stanford.edu)... 171.64.64.22
Connecting to downloads.cs.stanford.edu (downloads.cs.stanford.edu)|171.64.64.22|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 862182613 (822M) [application/zip]
Saving to: ‘glove.6B.zip’
glove.6B.zip        100%[===================>] 822.24M  5.05MB/s    in 2m 39s  
2023-11-19 22:48:06 (5.19 MB/s) - ‘glove.6B.zip’ saved [862182613/862182613]

该档案包含不同大小的文本编码向量:50 维、100 维、200 维、300 维。我们将使用 100 维的向量。

让我们创建一个将单词(字符串)映射到其 NumPy 向量表示的 dict:

path_to_glove_file = "glove.6B.100d.txt"embeddings_index = {}
with open(path_to_glove_file) as f:for line in f:word, coefs = line.split(maxsplit=1)coefs = np.fromstring(coefs, "f", sep=" ")embeddings_index[word] = coefsprint("Found %s word vectors." % len(embeddings_index))
Found 400000 word vectors.

现在,让我们准备一个相应的嵌入矩阵,以便在 Keras 嵌入层中使用。这是一个简单的 NumPy 矩阵,其中索引 i 处的条目是我们的向量机词汇表中索引 i 的单词的预训练向量。

num_tokens = len(voc) + 2
embedding_dim = 100
hits = 0
misses = 0# Prepare embedding matrix
embedding_matrix = np.zeros((num_tokens, embedding_dim))
for word, i in word_index.items():embedding_vector = embeddings_index.get(word)if embedding_vector is not None:# Words not found in embedding index will be all-zeros.# This includes the representation for "padding" and "OOV"embedding_matrix[i] = embedding_vectorhits += 1else:misses += 1
print("Converted %d words (%d misses)" % (hits, misses))
Converted 18021 words (1979 misses)

接下来,我们将预先训练好的单词嵌入矩阵载入嵌入层。
请注意,我们设置 trainable=False 是为了保持嵌入式的固定性(我们不想在训练过程中更新它们)。

from keras.layers import Embeddingembedding_layer = Embedding(num_tokens,embedding_dim,trainable=False,
)
embedding_layer.build((1,))
embedding_layer.set_weights([embedding_matrix])

建立模型


一个简单的 1D convnet,全局最大池化,最后是分类器。

int_sequences_input = keras.Input(shape=(None,), dtype="int32")
embedded_sequences = embedding_layer(int_sequences_input)
x = layers.Conv1D(128, 5, activation="relu")(embedded_sequences)
x = layers.MaxPooling1D(5)(x)
x = layers.Conv1D(128, 5, activation="relu")(x)
x = layers.MaxPooling1D(5)(x)
x = layers.Conv1D(128, 5, activation="relu")(x)
x = layers.GlobalMaxPooling1D()(x)
x = layers.Dense(128, activation="relu")(x)
x = layers.Dropout(0.5)(x)
preds = layers.Dense(len(class_names), activation="softmax")(x)
model = keras.Model(int_sequences_input, preds)
model.summary()
Model: "functional_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape              ┃    Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
│ input_layer (InputLayer)        │ (None, None)              │          0 │
├─────────────────────────────────┼───────────────────────────┼────────────┤
│ embedding (Embedding)           │ (None, None, 100)         │  2,000,200 │
├─────────────────────────────────┼───────────────────────────┼────────────┤
│ conv1d (Conv1D)                 │ (None, None, 128)         │     64,128 │
├─────────────────────────────────┼───────────────────────────┼────────────┤
│ max_pooling1d (MaxPooling1D)    │ (None, None, 128)         │          0 │
├─────────────────────────────────┼───────────────────────────┼────────────┤
│ conv1d_1 (Conv1D)               │ (None, None, 128)         │     82,048 │
├─────────────────────────────────┼───────────────────────────┼────────────┤
│ max_pooling1d_1 (MaxPooling1D)  │ (None, None, 128)         │          0 │
├─────────────────────────────────┼───────────────────────────┼────────────┤
│ conv1d_2 (Conv1D)               │ (None, None, 128)         │     82,048 │
├─────────────────────────────────┼───────────────────────────┼────────────┤
│ global_max_pooling1d            │ (None, 128)               │          0 │
│ (GlobalMaxPooling1D)            │                           │            │
├─────────────────────────────────┼───────────────────────────┼────────────┤
│ dense (Dense)                   │ (None, 128)               │     16,512 │
├─────────────────────────────────┼───────────────────────────┼────────────┤
│ dropout (Dropout)               │ (None, 128)               │          0 │
├─────────────────────────────────┼───────────────────────────┼────────────┤
│ dense_1 (Dense)                 │ (None, 20)                │      2,580 │
└─────────────────────────────────┴───────────────────────────┴────────────┘
 Total params: 2,247,516 (8.57 MB)
 Trainable params: 2,247,516 (8.57 MB)
 Non-trainable params: 0 (0.00 B)

训练模型


首先,将字符串列表数据转换为整数索引的 NumPy 数组。数组采用右填充。

x_train = vectorizer(np.array([[s] for s in train_samples])).numpy()
x_val = vectorizer(np.array([[s] for s in val_samples])).numpy()y_train = np.array(train_labels)
y_val = np.array(val_labels)

我们使用分类交叉熵作为损失,因为我们进行的是软最大分类。此外,由于我们的标签是整数,因此我们使用稀疏分类交叉熵(sparse_categorical_crossentropy)。

model.compile(loss="sparse_categorical_crossentropy", optimizer="rmsprop", metrics=["acc"]
)
model.fit(x_train, y_train, batch_size=128, epochs=20, validation_data=(x_val, y_val))
Epoch 1/202/125 [37m━━━━━━━━━━━━━━━━━━━━  9s 78ms/step - acc: 0.0352 - loss: 3.2164 WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1700434131.619687    6780 device_compiler.h:187] Compiled cluster using XLA!  This line is logged at most once for the lifetime of the process.125/125 ━━━━━━━━━━━━━━━━━━━━ 22s 123ms/step - acc: 0.0926 - loss: 2.8961 - val_acc: 0.2451 - val_loss: 2.1965
Epoch 2/20125/125 ━━━━━━━━━━━━━━━━━━━━ 10s 78ms/step - acc: 0.2628 - loss: 2.1377 - val_acc: 0.4421 - val_loss: 1.6594
Epoch 3/20125/125 ━━━━━━━━━━━━━━━━━━━━ 10s 78ms/step - acc: 0.4504 - loss: 1.5765 - val_acc: 0.5849 - val_loss: 1.2577
Epoch 4/20125/125 ━━━━━━━━━━━━━━━━━━━━ 10s 76ms/step - acc: 0.5711 - loss: 1.2639 - val_acc: 0.6277 - val_loss: 1.1153
Epoch 5/20125/125 ━━━━━━━━━━━━━━━━━━━━ 9s 74ms/step - acc: 0.6430 - loss: 1.0318 - val_acc: 0.6684 - val_loss: 0.9902
Epoch 6/20125/125 ━━━━━━━━━━━━━━━━━━━━ 9s 72ms/step - acc: 0.6990 - loss: 0.8844 - val_acc: 0.6619 - val_loss: 1.0109
Epoch 7/20125/125 ━━━━━━━━━━━━━━━━━━━━ 9s 70ms/step - acc: 0.7330 - loss: 0.7614 - val_acc: 0.6832 - val_loss: 0.9585
Epoch 8/20125/125 ━━━━━━━━━━━━━━━━━━━━ 8s 68ms/step - acc: 0.7795 - loss: 0.6328 - val_acc: 0.6847 - val_loss: 0.9917
Epoch 9/20125/125 ━━━━━━━━━━━━━━━━━━━━ 8s 64ms/step - acc: 0.8203 - loss: 0.5242 - val_acc: 0.7187 - val_loss: 0.9224
Epoch 10/20125/125 ━━━━━━━━━━━━━━━━━━━━ 8s 60ms/step - acc: 0.8506 - loss: 0.4265 - val_acc: 0.7342 - val_loss: 0.9098
Epoch 11/20125/125 ━━━━━━━━━━━━━━━━━━━━ 7s 56ms/step - acc: 0.8756 - loss: 0.3659 - val_acc: 0.7204 - val_loss: 1.0022
Epoch 12/20125/125 ━━━━━━━━━━━━━━━━━━━━ 7s 54ms/step - acc: 0.8921 - loss: 0.3079 - val_acc: 0.7209 - val_loss: 1.0477
Epoch 13/20125/125 ━━━━━━━━━━━━━━━━━━━━ 7s 54ms/step - acc: 0.9077 - loss: 0.2767 - val_acc: 0.7169 - val_loss: 1.0915
Epoch 14/20125/125 ━━━━━━━━━━━━━━━━━━━━ 6s 50ms/step - acc: 0.9244 - loss: 0.2253 - val_acc: 0.7382 - val_loss: 1.1397
Epoch 15/20125/125 ━━━━━━━━━━━━━━━━━━━━ 6s 49ms/step - acc: 0.9301 - loss: 0.2054 - val_acc: 0.7562 - val_loss: 1.0984
Epoch 16/20125/125 ━━━━━━━━━━━━━━━━━━━━ 5s 42ms/step - acc: 0.9373 - loss: 0.1769 - val_acc: 0.7387 - val_loss: 1.2294
Epoch 17/20125/125 ━━━━━━━━━━━━━━━━━━━━ 5s 41ms/step - acc: 0.9467 - loss: 0.1626 - val_acc: 0.7009 - val_loss: 1.4906
Epoch 18/20125/125 ━━━━━━━━━━━━━━━━━━━━ 5s 39ms/step - acc: 0.9471 - loss: 0.1544 - val_acc: 0.7184 - val_loss: 1.6050
Epoch 19/20125/125 ━━━━━━━━━━━━━━━━━━━━ 5s 37ms/step - acc: 0.9532 - loss: 0.1388 - val_acc: 0.7407 - val_loss: 1.4360
Epoch 20/20125/125 ━━━━━━━━━━━━━━━━━━━━ 5s 37ms/step - acc: 0.9519 - loss: 0.1388 - val_acc: 0.7309 - val_loss: 1.5327<keras.src.callbacks.history.History at 0x7fbf50e6b910>

导出端到端模型


现在,我们可能想导出一个模型对象,它的输入是任意长度的字符串,而不是索引序列。这将大大提高模型的可移植性,因为你不必担心输入预处理管道。

我们的矢量器实际上是 Keras 层,因此非常简单:

string_input = keras.Input(shape=(1,), dtype="string")
x = vectorizer(string_input)
preds = model(x)
end_to_end_model = keras.Model(string_input, preds)probabilities = end_to_end_model(keras.ops.convert_to_tensor([["this message is about computer graphics and 3D modeling"]])
)print(class_names[np.argmax(probabilities[0])])
comp.graphics

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

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

相关文章

Python批量修改图片文件名中的指定名称

批量处理图像时&#xff0c;图片名有时需要统一&#xff0c;本教程仅针对图片中名如&#xff1a;0001x4.png&#xff0c;批量将图片名中的x4去除&#xff0c;只留下0001.png的情况。 如果想要按照原图片顺序批量修改图片名&#xff0c;参考其它博文&#xff1a;按照原顺序批量…

Vue中常用指令

Vue中的常用指令 Vue中的常用指令内容渲染指令条件渲染指令事件绑定指令内联语句事件处理函数给事件处理函数传参 属性绑定指令列表渲染指令v-for中的key 双向绑定指令 Vue中的常用指令 概念&#xff1a;指令 是 Vue 提供的带有 v- 前缀 的 特殊 标签属性。Vue 会根据不同的【…

硬性清空缓存的方法

前端发布代码后&#xff0c;我们是需要刷新页面再验证的。有时候仅仅f5 或者ctrlshiftdelete快捷键仍然有历史缓存&#xff0c;这时可以通过下面的方法硬性清空缓存。 以谷歌浏览器为例&#xff0c;打开f12&#xff0c;右键点击刷新按钮&#xff0c;选择【清空缓存并硬性加载】…

JavaScript异步编程——07-Promise实例的方法【万字长文,感谢支持】

Promise 实例的方法简介 Promise 的 API 分为两种&#xff1a; Promise 实例的方法&#xff08;也称为&#xff1a;Promis的实例方法&#xff09; Promise 类的方法&#xff08;也称为&#xff1a;Promise的静态方法&#xff09; Promise 实例的方法&#xff1a;我们需要实…

PyTorch机器学习实现液态神经网络

大家好&#xff0c;人工智能的发展催生了神经网络这一强大的预测工具&#xff0c;这些网络通过数据和参数优化生成预测&#xff0c;每个神经元像逻辑回归门一样工作。结合反向传播技术&#xff0c;模型能够根据损失函数来调整参数权重&#xff0c;实现自我优化。 然而&#xf…

等保测评技术方案

等保&#xff0c;即“网络安全等级保护”&#xff0c;是中国实施的一项信息安全保护制度&#xff0c;旨在对不同重要性的信息和信息系统实行分等级保护&#xff0c;保障国家安全、社会秩序以及公共利益。等保技术方案是指为了达到国家网络安全等级保护标准要求&#xff0c;针对…

Mock.js 问题记录

文章目录 Mock.js 问题记录1. 浮点数范围限制对小数不起效2. increment 全局共用 Mock.js 问题记录 最新写网页的时候引入了 Mock.js 来生成模拟数据&#xff1b; Mock使用起来很方便&#xff0c;具体可以参考 官网 很快就能上手&#xff0c; 但是这个项目最近一次提交还是在2…

誉天教育近期开班计划

云计算HCIE 晚班 2024/5/13 大数据直通车 周末班 2024/5/25 数通直通车 晚班 2024/5/27 云服务HCIP 周末班 2024/6/1 云计算HCIP 周未班 2024/6/1 RHCA442 晚班 2024/6/17 周末班&#xff1a;周六-周日9:00-17:00晚 班&#xff1a;周一到周五19:00-21:30注&…

@Test测试Mapper接口报错java.lang.NullPointerException

Test测试Mapper接口报错java.lang.NullPointerException 报错原因&#xff1a;没有注入依赖 解决方法&#xff1a;在测试类上面添加SpringBootTest

winform图书销售管理系统+mysql

winform图书销售管理系统mysql数据库说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 功能模块&#xff1a; 管理员:ttt 123 登陆可以操作我的 个人信息 修改密码 用户信息 添加删除用户 图书 添加删除图书信息 购物车 购买订单信息 充值 退出账户 …

【SRC实战】遍历手机号给全站用户发放优惠券

挖个洞先 https://mp.weixin.qq.com/s/m8ULZ52p1q_mKrCRnaI_7A “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合 ” 01 — 漏洞证明 一、遍历手机号 “ 没有验证码二次校验的漏洞如何扩大危害&#xff1f;” 1、输入手机号码&#xff0c;领取优惠券场景…

笨方法自学python(六)

上一节中出现了\n&#xff0c;这个作用是换行。\后面带不同字符有不同的作用&#xff0c;我们先简单了解几个&#xff0c; 使用反斜杠 \ (back-slash) 可以将难打印出来的字符放到字符串。针对不同的符号有很多这样的所谓“转义序列(escape sequences)”&#xff0c;我们来练习…

哇哦,一个超级牛逼的图片格式!!使用它之后我们系统加载图片快了一倍!!! 图片格式转换webp学习!

什么是webp格式&#xff1f; WebP 格式是一种图像文件格式。 它是由谷歌开发的&#xff0c;旨在提供一种高效的图像压缩方式&#xff0c;同时保持较好的图像质量。WebP 格式具有较小的文件体积&#xff0c;能够在一定程度上减少网络传输的数据量&#xff0c;提升网页加载速度…

数据链路层之 以太网协议

以太网协议 这个协议即规定了数据链路层&#xff0c;同时也规定了物理层的内容。平时使用到的网线&#xff0c;其实也叫做“以太网线”&#xff08;遵守以太网协议的网线&#xff09;。 以太网帧格式 以太网数据帧 帧头 载荷 帧尾。 帧头&#xff1a;目的地址、源地址、类型…

SpringMVC传递参数

1.RequestMapping RequestMapping本身可以处理&#xff0c;get或post,指定了get或post之后&#xff0c;就只能处理对应的请求。 RequestMapping(value{"haihiyo","goodMoring"},methodRequestMethod.POST)2.RestFul风格 RestFul是一种风格 比如:网站的访…

人脸可调色美颜SDK解决方案,让妆容更加自然、真实

在追求个性化和差异化的美妆时代&#xff0c;美摄科技以其前沿技术&#xff0c;为企业带来了一场美妆革新的风暴。我们全新推出的人脸可调色美颜SDK解决方案&#xff0c;将为您提供前所未有的美妆体验&#xff0c;让每一位用户都能轻松打造属于自己的独特妆容。 可调色技术&am…

护肤升级:如何选择最适合您的AI皮肤技术解决方案?

在不断变化的护肤行业中&#xff0c;人工智能技术的整合已经彻底改变了企业满足个人护肤需求的方式。了解人工智能在美容行业的重要性以及提供的解决方案&#xff0c;是选择最合适的解决方案至关重要的。领先的主要参与者之一是玩美移动&#xff0c;他们提供了一套全面的AI皮肤…

有了这张“表”,印章什么情况契约锁帮您一查便知

随着电子签章的普及&#xff0c;企业法人、印章管理员最关心的问题就是“印章现在怎么样了”。等人汇报不仅存在时差、整理起来工作量大、数据精准性也没法保证… 契约锁推出“印章数据看板”&#xff0c;帮您连接各类业务软件&#xff0c;将所有真实印章操作数据自动沉淀下来&…

武汉星起航:五对一精细化服务助力合作伙伴开启亚马逊新篇章

武汉星起航电子商务有限公司以其专业的服务和独特的模式&#xff0c;为合作伙伴在亚马逊自营领域开拓了一片新天地。自2017年专注于亚马逊自营以来&#xff0c;武汉星起航不仅积累了丰富的经验&#xff0c;更在2020年成立了武汉星起航电子商务有限公司&#xff0c;进一步提升了…

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

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