当前位置: 首页 > news >正文

NLP实战(3):RNN英文名国家分类

目录

1. 项目需求

2. 模型解析

2.1 网络模型

2.2 准备数据

2.3 双向循环神经网络

3. 代码解析

4. 完整代码

5. 结果


1. 项目需求

对名字的分类,几千个名字,总共来自于18个国家

2. 模型解析

对于自然语言处理来说,输入是一个序列, 需要编码成one-hot的形式

由于其是一个高维的稀疏的向量,所以通常经过embed层变成稀疏的稠密的向量

经过RNN循环神经网络后,对其分类

但是对本文的任务,输出的o1、o2我们不在乎,因为这是序列的分类形式,而不是对自然语言的序列进行字词的重组等

所以网络可以进行优化

网络的结构:

2.1 网络模型

输入虽然是单个名字,但是因为名字的长短不一样,因此要进行处理

2.2 准备数据

这里通过ASCII变成字符序列

因为数据的长短不一,要进行padding

分类的类别索引:18类别

2.3 双向循环神经网络

一般的RNN,Xn-1 只是和之前的信息有关

双向的循环神经网络就是反向来一次传播,把h的结果进行concat拼接

3. 代码解析

本文实现了一个基于双向GRU的RNN模型,用于对名字进行国家分类。

以下是详细的模块解析和功能说明:


1. 环境配置与设备检测

  • 环境变量KMP_DUPLICATE_LIB_OK用于避免OpenMP库重复加载的冲突。

  • 设备选择:自动检测GPU(CUDA)是否可用,优先使用GPU加速计算。


2. 模型定义(RNNClassifier)

class RNNClassifier(torch.nn.Module):def __init__(self, input_size, hidden_size, output_size, n_layers=1, bidirectional=True):super(RNNClassifier, self).__init__()self.hidden_size = hidden_sizeself.n_layers = n_layersself.n_directions = 2 if bidirectional else 1self.embedding = torch.nn.Embedding(input_size, hidden_size)self.gru = torch.nn.GRU(hidden_size, hidden_size, n_layers,bidirectional=bidirectional)self.fc = torch.nn.Linear(hidden_size * self.n_directions, output_size)def _init_hidden(self, batch_size):return torch.zeros(self.n_layers * self.n_directions,batch_size,self.hidden_size).to(device)def forward(self, input, seq_lengths):# 确保lengths在CPU上seq_lengths = seq_lengths.cpu()  # 关键修复input = input.t()batch_size = input.size(1)hidden = self._init_hidden(batch_size)embedding = self.embedding(input)# 打包序列(lengths必须在CPU)packed = pack_padded_sequence(embedding, seq_lengths)output, hidden = self.gru(packed, hidden)# 处理双向输出if self.n_directions == 2:hidden = torch.cat([hidden[-1], hidden[-2]], dim=1)else:hidden = hidden[-1]return self.fc(hidden)
  • 结构

    • Embedding层:将输入的ASCII字符编码映射到隐藏空间(input_size=128对应ASCII字符数)。

    • GRU层:支持双向设置(bidirectional=True),通过n_layers指定层数。

    • 全连接层:将GRU的最终隐藏状态映射到国家分类的输出维度。

  • 核心逻辑

    • 前向传播:输入序列通过Embedding层后,使用pack_padded_sequence处理变长序列,提升计算效率。GRU的输出经过双向拼接(如果是双向),最终通过全连接层生成分类结果。

    • 隐藏状态初始化:初始隐藏状态为全零张量,形状为(n_layers * n_directions, batch_size, hidden_size)


3. 数据加载与处理(NameDataset)

class NameDataset(Dataset):def __init__(self, is_train_set=True):filename = './data/names_train.csv' if is_train_set else './data/names_test.csv'with open(filename, 'r') as f:lines = f.read().splitlines()self.names = [line.split(',')[0] for line in lines]self.countries = [line.split(',')[1] for line in lines]self.country_list = sorted(set(self.countries))self.country_dict = {c: i for i, c in enumerate(self.country_list)}self.n_countries = len(self.country_list)def __getitem__(self, index):return self.names[index], self.country_dict[self.countries[index]]def __len__(self):return len(self.names)def getCountriesNum(self):return self.n_countriesdef idx2country(self, index):return self.country_list[index]
  • 数据格式:从CSV文件加载数据,格式为名字,国家(如"John,USA")。

  • 功能

    • 国家编码:将国家名称转换为唯一的整数索引(通过country_dict)。

    • 数据集接口:继承Dataset类,实现__getitem____len__方法,支持PyTorch的DataLoader

    • 辅助方法getCountriesNum获取国家数量,idx2country通过索引反向查询国家名称。


4. 数据预处理(name2list与make_tensors)

  • 字符编码name2list将名字转换为ASCII码列表(如"John"[74, 111, 104, 110])并记录长度。

  • 张量生成make_tensors将数据填充为等长张量,并按序列长度降序排列(优化pack_padded_sequence性能):

    • 填充:短序列补零,长序列截断。

    • 设备分配:数据张量(seq_tensorcountries)移动到指定设备(GPU/CPU),lengths保留在CPU(因pack_padded_sequence要求)。


5. 训练与测试流程

def train():total_loss = 0for i, (names, countries) in enumerate(train_loader, 1):inputs, lengths, labels = make_tensors(names, countries)outputs = model(inputs, lengths)loss = criterion(outputs, labels)optimizer.zero_grad()loss.backward()optimizer.step()total_loss += loss.item()if i % 10 == 0:print(f'[{time_since(start)}] Epoch {epoch} 'f'[{i * len(inputs)}/{len(train_set)}] 'f'loss={total_loss / (i * len(inputs)):.4f}')return total_loss / len(train_set)
  • 训练函数(train)

    • 前向计算:输入数据通过模型,计算交叉熵损失。

    • 反向传播:优化器(Adam)更新参数,每10个batch输出平均损失。

    • 损失计算:累积损失除以总样本数,确保不同batch大小的可比性。

  • 测试函数(test)

    • 推理模式:禁用梯度计算,计算测试集准确率。

    • 结果输出:打印正确样本数和总准确率。

def test():correct = 0with torch.no_grad():for names, countries in test_loader:inputs, lengths, labels = make_tensors(names, countries)outputs = model(inputs, lengths)pred = outputs.argmax(dim=1)correct += (pred == labels).sum().item()acc = correct / len(test_set)print(f'Test Accuracy: {correct}/{len(test_set)} ({acc:.2%})\n')return acc

6. 主程序与超参数

  • 超参数

    • HIDDEN_SIZE=128:GRU隐藏层维度。

    • BATCH_SIZE=256:批量大小。

    • N_LAYERS=2:GRU层数。

    • N_EPOCHS=50:训练轮次。

    • N_CHARS=128:输入字符的ASCII码范围(0-127)。

  • 训练循环

    • 初始化模型、损失函数(交叉熵)和优化器(学习率0.001)。

    • 每个epoch结束后在测试集上评估准确率,记录到acc_history

  • 结果可视化:使用matplotlib绘制准确率随epoch变化的曲线。


7. 关键实现细节

  • 变长序列处理:通过pack_padded_sequence压缩填充后的序列,避免无效计算。

  • 双向GRU输出拼接:双向GRU的最终隐藏状态是前向和后向的拼接(hidden[-1]hidden[-2])。

  • 设备管理:数据张量(输入、标签)和模型参数需在同一设备(GPU/CPU),但lengths必须保留在CPU。


8. 潜在优化点

  • 学习率调整:可引入学习率调度器(如ReduceLROnPlateau)提升收敛性。

  • 早停机制:根据验证集准确率提前终止训练,防止过拟合。

  • 字符嵌入维度:调整Embedding层的输出维度(hidden_size)可能影响模型表达能力。

  • 数据增强:对名字进行扰动(如增删字符)提升泛化性。


9. 代码执行流程

  1. 加载训练集和测试集。

  2. 初始化模型并移至GPU(若可用)。

  3. 训练50个epoch,每个epoch结束后测试准确率。

  4. 绘制准确率变化曲线,观察模型性能。


该代码完整实现了从数据加载、模型定义到训练测试的全流程,适用于基于字符级别的短文本分类任务(如名字国籍分类)。通过调整超参数和模型结构,可适配其他类似场景。

4. 完整代码

完整代码:

import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'  # 允许重复加载OpenMP库import torch
import time
import matplotlib.pyplot as plt
import math
from torch.utils.data import DataLoader, Dataset
from torch.nn.utils.rnn import pack_padded_sequence# 设备检测
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")class RNNClassifier(torch.nn.Module):def __init__(self, input_size, hidden_size, output_size, n_layers=1, bidirectional=True):super(RNNClassifier, self).__init__()self.hidden_size = hidden_sizeself.n_layers = n_layersself.n_directions = 2 if bidirectional else 1self.embedding = torch.nn.Embedding(input_size, hidden_size)self.gru = torch.nn.GRU(hidden_size, hidden_size, n_layers,bidirectional=bidirectional)self.fc = torch.nn.Linear(hidden_size * self.n_directions, output_size)def _init_hidden(self, batch_size):return torch.zeros(self.n_layers * self.n_directions,batch_size,self.hidden_size).to(device)def forward(self, input, seq_lengths):# 确保lengths在CPU上seq_lengths = seq_lengths.cpu()  # 关键修复input = input.t()batch_size = input.size(1)hidden = self._init_hidden(batch_size)embedding = self.embedding(input)# 打包序列(lengths必须在CPU)packed = pack_padded_sequence(embedding, seq_lengths)output, hidden = self.gru(packed, hidden)# 处理双向输出if self.n_directions == 2:hidden = torch.cat([hidden[-1], hidden[-2]], dim=1)else:hidden = hidden[-1]return self.fc(hidden)class NameDataset(Dataset):def __init__(self, is_train_set=True):filename = './data/names_train.csv' if is_train_set else './data/names_test.csv'with open(filename, 'r') as f:lines = f.read().splitlines()self.names = [line.split(',')[0] for line in lines]self.countries = [line.split(',')[1] for line in lines]self.country_list = sorted(set(self.countries))self.country_dict = {c: i for i, c in enumerate(self.country_list)}self.n_countries = len(self.country_list)def __getitem__(self, index):return self.names[index], self.country_dict[self.countries[index]]def __len__(self):return len(self.names)def getCountriesNum(self):return self.n_countriesdef idx2country(self, index):return self.country_list[index]def name2list(name):return [ord(c) for c in name], len(name)def make_tensors(names, countries):# 生成序列和长度sequences_and_lengths = [name2list(name) for name in names]sequences = [s[0] for s in sequences_and_lengths]lengths = torch.LongTensor([s[1] for s in sequences_and_lengths])countries = torch.LongTensor(countries)# 创建填充张量seq_tensor = torch.zeros(len(sequences), lengths.max()).long()for idx, (seq, length) in enumerate(zip(sequences, lengths)):seq_tensor[idx, :length] = torch.LongTensor(seq)# 按长度排序(保持lengths在CPU)lengths, perm_idx = lengths.sort(dim=0, descending=True)seq_tensor = seq_tensor[perm_idx].to(device)  # 数据到GPUcountries = countries[perm_idx].to(device)  # 数据到GPUreturn seq_tensor, lengths, countries  # lengths保留在CPUdef time_since(since):s = time.time() - sincem = math.floor(s / 60)s -= m * 60return f'{m}m {s:.0f}s'def train():total_loss = 0for i, (names, countries) in enumerate(train_loader, 1):inputs, lengths, labels = make_tensors(names, countries)outputs = model(inputs, lengths)loss = criterion(outputs, labels)optimizer.zero_grad()loss.backward()optimizer.step()total_loss += loss.item()if i % 10 == 0:print(f'[{time_since(start)}] Epoch {epoch} 'f'[{i * len(inputs)}/{len(train_set)}] 'f'loss={total_loss / (i * len(inputs)):.4f}')return total_loss / len(train_set)def test():correct = 0with torch.no_grad():for names, countries in test_loader:inputs, lengths, labels = make_tensors(names, countries)outputs = model(inputs, lengths)pred = outputs.argmax(dim=1)correct += (pred == labels).sum().item()acc = correct / len(test_set)print(f'Test Accuracy: {correct}/{len(test_set)} ({acc:.2%})\n')return accif __name__ == '__main__':# 超参数HIDDEN_SIZE = 128BATCH_SIZE = 256N_LAYERS = 2N_EPOCHS = 50N_CHARS = 128  # ASCII字符数# 数据加载train_set = NameDataset(is_train_set=True)train_loader = DataLoader(train_set, batch_size=BATCH_SIZE, shuffle=True)test_set = NameDataset(is_train_set=False)test_loader = DataLoader(test_set, batch_size=BATCH_SIZE)N_COUNTRIES = train_set.getCountriesNum()# 模型初始化model = RNNClassifier(N_CHARS, HIDDEN_SIZE, N_COUNTRIES, N_LAYERS).to(device)criterion = torch.nn.CrossEntropyLoss()optimizer = torch.optim.Adam(model.parameters(), lr=0.001)# 训练循环start = time.time()acc_history = []for epoch in range(1, N_EPOCHS + 1):print(f"=== Epoch {epoch}/{N_EPOCHS} ===")train_loss = train()val_acc = test()acc_history.append(val_acc)# 结果可视化plt.plot(acc_history)plt.title('Training Accuracy')plt.xlabel('Epoch')plt.ylabel('Accuracy')plt.show()

5. 结果

下载:基于RNN循环神经网络实现的时间序列英文name国家分类资源-CSDN文库

如下:

日志:

Using device: cuda
=== Epoch 1/50 ===
[0m 0s] Epoch 1 [2560/13374] loss=0.0082
[0m 0s] Epoch 1 [5120/13374] loss=0.0073
[0m 1s] Epoch 1 [7680/13374] loss=0.0067
[0m 1s] Epoch 1 [10240/13374] loss=0.0063
[0m 1s] Epoch 1 [12800/13374] loss=0.0059
Test Accuracy: 4524/6700 (67.52%)

=== Epoch 2/50 ===
[0m 1s] Epoch 2 [2560/13374] loss=0.0043
[0m 1s] Epoch 2 [5120/13374] loss=0.0040
[0m 2s] Epoch 2 [7680/13374] loss=0.0039
[0m 2s] Epoch 2 [10240/13374] loss=0.0038
[0m 2s] Epoch 2 [12800/13374] loss=0.0037
Test Accuracy: 4995/6700 (74.55%)

=== Epoch 3/50 ===
[0m 2s] Epoch 3 [2560/13374] loss=0.0030
[0m 2s] Epoch 3 [5120/13374] loss=0.0029
[0m 2s] Epoch 3 [7680/13374] loss=0.0029
[0m 3s] Epoch 3 [10240/13374] loss=0.0029
[0m 3s] Epoch 3 [12800/13374] loss=0.0028
Test Accuracy: 5261/6700 (78.52%)

=== Epoch 4/50 ===
[0m 3s] Epoch 4 [2560/13374] loss=0.0025
[0m 3s] Epoch 4 [5120/13374] loss=0.0025
[0m 3s] Epoch 4 [7680/13374] loss=0.0025
[0m 4s] Epoch 4 [10240/13374] loss=0.0024
[0m 4s] Epoch 4 [12800/13374] loss=0.0024
Test Accuracy: 5435/6700 (81.12%)

=== Epoch 5/50 ===
[0m 4s] Epoch 5 [2560/13374] loss=0.0020
[0m 4s] Epoch 5 [5120/13374] loss=0.0021
[0m 4s] Epoch 5 [7680/13374] loss=0.0021
[0m 4s] Epoch 5 [10240/13374] loss=0.0021
[0m 5s] Epoch 5 [12800/13374] loss=0.0020
Test Accuracy: 5544/6700 (82.75%)

=== Epoch 6/50 ===
[0m 5s] Epoch 6 [2560/13374] loss=0.0018
[0m 5s] Epoch 6 [5120/13374] loss=0.0019
[0m 5s] Epoch 6 [7680/13374] loss=0.0018
[0m 5s] Epoch 6 [10240/13374] loss=0.0018
[0m 6s] Epoch 6 [12800/13374] loss=0.0018
Test Accuracy: 5578/6700 (83.25%)

=== Epoch 7/50 ===
[0m 6s] Epoch 7 [2560/13374] loss=0.0015
[0m 6s] Epoch 7 [5120/13374] loss=0.0016
[0m 6s] Epoch 7 [7680/13374] loss=0.0016
[0m 6s] Epoch 7 [10240/13374] loss=0.0016
[0m 7s] Epoch 7 [12800/13374] loss=0.0016
Test Accuracy: 5600/6700 (83.58%)

=== Epoch 8/50 ===
[0m 7s] Epoch 8 [2560/13374] loss=0.0013
[0m 7s] Epoch 8 [5120/13374] loss=0.0014
[0m 7s] Epoch 8 [7680/13374] loss=0.0014
[0m 8s] Epoch 8 [10240/13374] loss=0.0014
[0m 8s] Epoch 8 [12800/13374] loss=0.0014
Test Accuracy: 5565/6700 (83.06%)

=== Epoch 9/50 ===
[0m 8s] Epoch 9 [2560/13374] loss=0.0012
[0m 8s] Epoch 9 [5120/13374] loss=0.0012
[0m 8s] Epoch 9 [7680/13374] loss=0.0012
[0m 9s] Epoch 9 [10240/13374] loss=0.0013
[0m 9s] Epoch 9 [12800/13374] loss=0.0013
Test Accuracy: 5611/6700 (83.75%)

=== Epoch 10/50 ===
[0m 9s] Epoch 10 [2560/13374] loss=0.0011
[0m 9s] Epoch 10 [5120/13374] loss=0.0011
[0m 9s] Epoch 10 [7680/13374] loss=0.0011
[0m 10s] Epoch 10 [10240/13374] loss=0.0011
[0m 10s] Epoch 10 [12800/13374] loss=0.0011
Test Accuracy: 5650/6700 (84.33%)

=== Epoch 11/50 ===
[0m 10s] Epoch 11 [2560/13374] loss=0.0010
[0m 10s] Epoch 11 [5120/13374] loss=0.0010
[0m 11s] Epoch 11 [7680/13374] loss=0.0010
[0m 11s] Epoch 11 [10240/13374] loss=0.0010
[0m 11s] Epoch 11 [12800/13374] loss=0.0010
Test Accuracy: 5653/6700 (84.37%)

=== Epoch 12/50 ===
[0m 11s] Epoch 12 [2560/13374] loss=0.0008
[0m 12s] Epoch 12 [5120/13374] loss=0.0008
[0m 12s] Epoch 12 [7680/13374] loss=0.0008
[0m 12s] Epoch 12 [10240/13374] loss=0.0008
[0m 12s] Epoch 12 [12800/13374] loss=0.0008
Test Accuracy: 5657/6700 (84.43%)

=== Epoch 13/50 ===
[0m 12s] Epoch 13 [2560/13374] loss=0.0008
[0m 13s] Epoch 13 [5120/13374] loss=0.0007
[0m 13s] Epoch 13 [7680/13374] loss=0.0007
[0m 13s] Epoch 13 [10240/13374] loss=0.0007
[0m 13s] Epoch 13 [12800/13374] loss=0.0007
Test Accuracy: 5662/6700 (84.51%)

=== Epoch 14/50 ===
[0m 13s] Epoch 14 [2560/13374] loss=0.0006
[0m 14s] Epoch 14 [5120/13374] loss=0.0006
[0m 14s] Epoch 14 [7680/13374] loss=0.0006
[0m 14s] Epoch 14 [10240/13374] loss=0.0006
[0m 14s] Epoch 14 [12800/13374] loss=0.0006
Test Accuracy: 5659/6700 (84.46%)

=== Epoch 15/50 ===
[0m 14s] Epoch 15 [2560/13374] loss=0.0005
[0m 14s] Epoch 15 [5120/13374] loss=0.0005
[0m 15s] Epoch 15 [7680/13374] loss=0.0005
[0m 15s] Epoch 15 [10240/13374] loss=0.0005
[0m 15s] Epoch 15 [12800/13374] loss=0.0005
Test Accuracy: 5656/6700 (84.42%)

=== Epoch 16/50 ===
[0m 15s] Epoch 16 [2560/13374] loss=0.0004
[0m 15s] Epoch 16 [5120/13374] loss=0.0004
[0m 16s] Epoch 16 [7680/13374] loss=0.0004
[0m 16s] Epoch 16 [10240/13374] loss=0.0005
[0m 16s] Epoch 16 [12800/13374] loss=0.0005
Test Accuracy: 5638/6700 (84.15%)

=== Epoch 17/50 ===
[0m 16s] Epoch 17 [2560/13374] loss=0.0004
[0m 16s] Epoch 17 [5120/13374] loss=0.0004
[0m 16s] Epoch 17 [7680/13374] loss=0.0004
[0m 17s] Epoch 17 [10240/13374] loss=0.0004
[0m 17s] Epoch 17 [12800/13374] loss=0.0004
Test Accuracy: 5596/6700 (83.52%)

=== Epoch 18/50 ===
[0m 17s] Epoch 18 [2560/13374] loss=0.0004
[0m 17s] Epoch 18 [5120/13374] loss=0.0004
[0m 17s] Epoch 18 [7680/13374] loss=0.0004
[0m 18s] Epoch 18 [10240/13374] loss=0.0004
[0m 18s] Epoch 18 [12800/13374] loss=0.0004
Test Accuracy: 5627/6700 (83.99%)

=== Epoch 19/50 ===
[0m 18s] Epoch 19 [2560/13374] loss=0.0003
[0m 18s] Epoch 19 [5120/13374] loss=0.0003
[0m 18s] Epoch 19 [7680/13374] loss=0.0003
[0m 18s] Epoch 19 [10240/13374] loss=0.0003
[0m 19s] Epoch 19 [12800/13374] loss=0.0003
Test Accuracy: 5636/6700 (84.12%)

=== Epoch 20/50 ===
[0m 19s] Epoch 20 [2560/13374] loss=0.0003
[0m 19s] Epoch 20 [5120/13374] loss=0.0003
[0m 19s] Epoch 20 [7680/13374] loss=0.0003
[0m 19s] Epoch 20 [10240/13374] loss=0.0003
[0m 20s] Epoch 20 [12800/13374] loss=0.0003
Test Accuracy: 5622/6700 (83.91%)

=== Epoch 21/50 ===
[0m 20s] Epoch 21 [2560/13374] loss=0.0003
[0m 20s] Epoch 21 [5120/13374] loss=0.0003
[0m 20s] Epoch 21 [7680/13374] loss=0.0003
[0m 20s] Epoch 21 [10240/13374] loss=0.0003
[0m 21s] Epoch 21 [12800/13374] loss=0.0003
Test Accuracy: 5636/6700 (84.12%)

=== Epoch 22/50 ===
[0m 21s] Epoch 22 [2560/13374] loss=0.0003
[0m 21s] Epoch 22 [5120/13374] loss=0.0003
[0m 21s] Epoch 22 [7680/13374] loss=0.0003
[0m 21s] Epoch 22 [10240/13374] loss=0.0003
[0m 21s] Epoch 22 [12800/13374] loss=0.0003
Test Accuracy: 5603/6700 (83.63%)

=== Epoch 23/50 ===
[0m 22s] Epoch 23 [2560/13374] loss=0.0002
[0m 22s] Epoch 23 [5120/13374] loss=0.0002
[0m 22s] Epoch 23 [7680/13374] loss=0.0002
[0m 22s] Epoch 23 [10240/13374] loss=0.0003
[0m 22s] Epoch 23 [12800/13374] loss=0.0003
Test Accuracy: 5590/6700 (83.43%)

=== Epoch 24/50 ===
[0m 23s] Epoch 24 [2560/13374] loss=0.0002
[0m 23s] Epoch 24 [5120/13374] loss=0.0002
[0m 23s] Epoch 24 [7680/13374] loss=0.0002
[0m 23s] Epoch 24 [10240/13374] loss=0.0002
[0m 23s] Epoch 24 [12800/13374] loss=0.0003
Test Accuracy: 5600/6700 (83.58%)

=== Epoch 25/50 ===
[0m 24s] Epoch 25 [2560/13374] loss=0.0002
[0m 24s] Epoch 25 [5120/13374] loss=0.0002
[0m 24s] Epoch 25 [7680/13374] loss=0.0002
[0m 24s] Epoch 25 [10240/13374] loss=0.0002
[0m 24s] Epoch 25 [12800/13374] loss=0.0003
Test Accuracy: 5622/6700 (83.91%)

=== Epoch 26/50 ===
[0m 25s] Epoch 26 [2560/13374] loss=0.0002
[0m 25s] Epoch 26 [5120/13374] loss=0.0002
[0m 25s] Epoch 26 [7680/13374] loss=0.0002
[0m 25s] Epoch 26 [10240/13374] loss=0.0002
[0m 25s] Epoch 26 [12800/13374] loss=0.0002
Test Accuracy: 5605/6700 (83.66%)

=== Epoch 27/50 ===
[0m 26s] Epoch 27 [2560/13374] loss=0.0002
[0m 26s] Epoch 27 [5120/13374] loss=0.0002
[0m 26s] Epoch 27 [7680/13374] loss=0.0002
[0m 26s] Epoch 27 [10240/13374] loss=0.0002
[0m 26s] Epoch 27 [12800/13374] loss=0.0002
Test Accuracy: 5610/6700 (83.73%)

=== Epoch 28/50 ===
[0m 26s] Epoch 28 [2560/13374] loss=0.0002
[0m 27s] Epoch 28 [5120/13374] loss=0.0002
[0m 27s] Epoch 28 [7680/13374] loss=0.0002
[0m 27s] Epoch 28 [10240/13374] loss=0.0002
[0m 27s] Epoch 28 [12800/13374] loss=0.0002
Test Accuracy: 5606/6700 (83.67%)

=== Epoch 29/50 ===
[0m 27s] Epoch 29 [2560/13374] loss=0.0002
[0m 28s] Epoch 29 [5120/13374] loss=0.0002
[0m 28s] Epoch 29 [7680/13374] loss=0.0002
[0m 28s] Epoch 29 [10240/13374] loss=0.0002
[0m 28s] Epoch 29 [12800/13374] loss=0.0002
Test Accuracy: 5621/6700 (83.90%)

=== Epoch 30/50 ===
[0m 28s] Epoch 30 [2560/13374] loss=0.0002
[0m 28s] Epoch 30 [5120/13374] loss=0.0002
[0m 29s] Epoch 30 [7680/13374] loss=0.0002
[0m 29s] Epoch 30 [10240/13374] loss=0.0002
[0m 29s] Epoch 30 [12800/13374] loss=0.0002
Test Accuracy: 5609/6700 (83.72%)

=== Epoch 31/50 ===
[0m 29s] Epoch 31 [2560/13374] loss=0.0002
[0m 29s] Epoch 31 [5120/13374] loss=0.0002
[0m 30s] Epoch 31 [7680/13374] loss=0.0002
[0m 30s] Epoch 31 [10240/13374] loss=0.0002
[0m 30s] Epoch 31 [12800/13374] loss=0.0002
Test Accuracy: 5607/6700 (83.69%)

=== Epoch 32/50 ===
[0m 30s] Epoch 32 [2560/13374] loss=0.0001
[0m 30s] Epoch 32 [5120/13374] loss=0.0002
[0m 30s] Epoch 32 [7680/13374] loss=0.0002
[0m 31s] Epoch 32 [10240/13374] loss=0.0002
[0m 31s] Epoch 32 [12800/13374] loss=0.0002
Test Accuracy: 5614/6700 (83.79%)

=== Epoch 33/50 ===
[0m 31s] Epoch 33 [2560/13374] loss=0.0001
[0m 31s] Epoch 33 [5120/13374] loss=0.0002
[0m 31s] Epoch 33 [7680/13374] loss=0.0002
[0m 32s] Epoch 33 [10240/13374] loss=0.0002
[0m 32s] Epoch 33 [12800/13374] loss=0.0002
Test Accuracy: 5618/6700 (83.85%)

=== Epoch 34/50 ===
[0m 32s] Epoch 34 [2560/13374] loss=0.0002
[0m 32s] Epoch 34 [5120/13374] loss=0.0002
[0m 32s] Epoch 34 [7680/13374] loss=0.0002
[0m 33s] Epoch 34 [10240/13374] loss=0.0002
[0m 33s] Epoch 34 [12800/13374] loss=0.0002
Test Accuracy: 5605/6700 (83.66%)

=== Epoch 35/50 ===
[0m 33s] Epoch 35 [2560/13374] loss=0.0002
[0m 33s] Epoch 35 [5120/13374] loss=0.0002
[0m 33s] Epoch 35 [7680/13374] loss=0.0002
[0m 33s] Epoch 35 [10240/13374] loss=0.0002
[0m 34s] Epoch 35 [12800/13374] loss=0.0002
Test Accuracy: 5610/6700 (83.73%)

=== Epoch 36/50 ===
[0m 34s] Epoch 36 [2560/13374] loss=0.0002
[0m 34s] Epoch 36 [5120/13374] loss=0.0002
[0m 34s] Epoch 36 [7680/13374] loss=0.0002
[0m 34s] Epoch 36 [10240/13374] loss=0.0002
[0m 35s] Epoch 36 [12800/13374] loss=0.0002
Test Accuracy: 5625/6700 (83.96%)

=== Epoch 37/50 ===
[0m 35s] Epoch 37 [2560/13374] loss=0.0001
[0m 35s] Epoch 37 [5120/13374] loss=0.0002
[0m 35s] Epoch 37 [7680/13374] loss=0.0002
[0m 35s] Epoch 37 [10240/13374] loss=0.0002
[0m 35s] Epoch 37 [12800/13374] loss=0.0002
Test Accuracy: 5605/6700 (83.66%)

=== Epoch 38/50 ===
[0m 36s] Epoch 38 [2560/13374] loss=0.0001
[0m 36s] Epoch 38 [5120/13374] loss=0.0001
[0m 36s] Epoch 38 [7680/13374] loss=0.0002
[0m 36s] Epoch 38 [10240/13374] loss=0.0002
[0m 36s] Epoch 38 [12800/13374] loss=0.0002
Test Accuracy: 5610/6700 (83.73%)

=== Epoch 39/50 ===
[0m 37s] Epoch 39 [2560/13374] loss=0.0002
[0m 37s] Epoch 39 [5120/13374] loss=0.0002
[0m 37s] Epoch 39 [7680/13374] loss=0.0002
[0m 37s] Epoch 39 [10240/13374] loss=0.0002
[0m 37s] Epoch 39 [12800/13374] loss=0.0002
Test Accuracy: 5605/6700 (83.66%)

=== Epoch 40/50 ===
[0m 38s] Epoch 40 [2560/13374] loss=0.0002
[0m 38s] Epoch 40 [5120/13374] loss=0.0002
[0m 38s] Epoch 40 [7680/13374] loss=0.0002
[0m 38s] Epoch 40 [10240/13374] loss=0.0002
[0m 38s] Epoch 40 [12800/13374] loss=0.0002
Test Accuracy: 5609/6700 (83.72%)

=== Epoch 41/50 ===
[0m 39s] Epoch 41 [2560/13374] loss=0.0001
[0m 39s] Epoch 41 [5120/13374] loss=0.0002
[0m 39s] Epoch 41 [7680/13374] loss=0.0002
[0m 39s] Epoch 41 [10240/13374] loss=0.0002
[0m 39s] Epoch 41 [12800/13374] loss=0.0002
Test Accuracy: 5605/6700 (83.66%)

=== Epoch 42/50 ===
[0m 40s] Epoch 42 [2560/13374] loss=0.0001
[0m 40s] Epoch 42 [5120/13374] loss=0.0002
[0m 40s] Epoch 42 [7680/13374] loss=0.0002
[0m 40s] Epoch 42 [10240/13374] loss=0.0002
[0m 40s] Epoch 42 [12800/13374] loss=0.0002
Test Accuracy: 5609/6700 (83.72%)

=== Epoch 43/50 ===
[0m 41s] Epoch 43 [2560/13374] loss=0.0001
[0m 41s] Epoch 43 [5120/13374] loss=0.0002
[0m 41s] Epoch 43 [7680/13374] loss=0.0002
[0m 41s] Epoch 43 [10240/13374] loss=0.0002
[0m 41s] Epoch 43 [12800/13374] loss=0.0002
Test Accuracy: 5605/6700 (83.66%)

=== Epoch 44/50 ===
[0m 41s] Epoch 44 [2560/13374] loss=0.0002
[0m 42s] Epoch 44 [5120/13374] loss=0.0002
[0m 42s] Epoch 44 [7680/13374] loss=0.0002
[0m 42s] Epoch 44 [10240/13374] loss=0.0002
[0m 42s] Epoch 44 [12800/13374] loss=0.0002
Test Accuracy: 5594/6700 (83.49%)

=== Epoch 45/50 ===
[0m 42s] Epoch 45 [2560/13374] loss=0.0001
[0m 43s] Epoch 45 [5120/13374] loss=0.0002
[0m 43s] Epoch 45 [7680/13374] loss=0.0002
[0m 43s] Epoch 45 [10240/13374] loss=0.0002
[0m 43s] Epoch 45 [12800/13374] loss=0.0002
Test Accuracy: 5621/6700 (83.90%)

=== Epoch 46/50 ===
[0m 43s] Epoch 46 [2560/13374] loss=0.0002
[0m 44s] Epoch 46 [5120/13374] loss=0.0001
[0m 44s] Epoch 46 [7680/13374] loss=0.0002
[0m 44s] Epoch 46 [10240/13374] loss=0.0002
[0m 44s] Epoch 46 [12800/13374] loss=0.0002
Test Accuracy: 5594/6700 (83.49%)

=== Epoch 47/50 ===
[0m 44s] Epoch 47 [2560/13374] loss=0.0001
[0m 45s] Epoch 47 [5120/13374] loss=0.0002
[0m 45s] Epoch 47 [7680/13374] loss=0.0002
[0m 45s] Epoch 47 [10240/13374] loss=0.0002
[0m 45s] Epoch 47 [12800/13374] loss=0.0002
Test Accuracy: 5624/6700 (83.94%)

=== Epoch 48/50 ===
[0m 45s] Epoch 48 [2560/13374] loss=0.0002
[0m 46s] Epoch 48 [5120/13374] loss=0.0002
[0m 46s] Epoch 48 [7680/13374] loss=0.0002
[0m 46s] Epoch 48 [10240/13374] loss=0.0002
[0m 46s] Epoch 48 [12800/13374] loss=0.0002
Test Accuracy: 5612/6700 (83.76%)

=== Epoch 49/50 ===
[0m 47s] Epoch 49 [2560/13374] loss=0.0001
[0m 47s] Epoch 49 [5120/13374] loss=0.0001
[0m 47s] Epoch 49 [7680/13374] loss=0.0001
[0m 47s] Epoch 49 [10240/13374] loss=0.0002
[0m 47s] Epoch 49 [12800/13374] loss=0.0002
Test Accuracy: 5608/6700 (83.70%)

=== Epoch 50/50 ===
[0m 48s] Epoch 50 [2560/13374] loss=0.0001
[0m 48s] Epoch 50 [5120/13374] loss=0.0001
[0m 48s] Epoch 50 [7680/13374] loss=0.0002
[0m 48s] Epoch 50 [10240/13374] loss=0.0002
[0m 48s] Epoch 50 [12800/13374] loss=0.0002
Test Accuracy: 5603/6700 (83.63%)

 

相关文章:

NLP实战(3):RNN英文名国家分类

目录 1. 项目需求 2. 模型解析 2.1 网络模型 2.2 准备数据 2.3 双向循环神经网络 3. 代码解析 4. 完整代码 5. 结果 1. 项目需求 对名字的分类,几千个名字,总共来自于18个国家 2. 模型解析 对于自然语言处理来说,输入是一个序列&am…...

东方博宜OJ ——1335 - 土地分割

递归 入门 ————1335 - 土地分割 1335 - 土地分割题目描述输入输出样例问题分析递归解法(欧几里得算法)代码实现总结 1335 - 土地分割 题目描述 把一块m * n米的土地分割成同样大的正方形,如果要求没有土地剩余,分割出的正方形…...

在轨道交通控制系统中如何实现μs级任务同步

轨道交通作为现代城市化进程中的重要支柱,承载着数以亿计的乘客出行需求,同时也是城市经济运行的命脉。无论是地铁、轻轨还是高速铁路,其控制系统的稳定性和可靠性直接关系到运营安全和效率。在这样一个高风险、高复杂度的环境中,…...

【C++教程】进制转换的实现方法

在C中进行进制转换可以通过标准库函数或自定义算法实现。以下是两种常见场景的转换方法及示例代码&#xff1a; 一、使用C标准库函数 任意进制转十进制 #include <string> #include <iostream>int main() {std::string num "1A3F"; // 十六进制数int…...

日志文件爆满_配置使用logback_只保留3天日志文件_每天定时生成一个日志文件---SpringCloud工作笔记206

日志文件爆满,springCloud微服务架构中的,日志爆满如何解决,使用脚本直接删除,会导致, 如果要删除的日志文件,还正在被进程占用,那么你即使使用脚本定时删除了,这个日志文件,那么这个日志文件实际上还是不会删除的,他的大小,依然占用磁盘,就是因为,有进程还在占用它,所以之前说…...

DICOM通讯(ACSE->DIMSE->Worklist)

DICOM 通讯协议中的 ACSE → DIMSE → Worklist 这条通讯链路。DICOM 通讯栈本身是一个多层的协议结构&#xff0c;就像 OSI 模型一样&#xff0c;逐层封装功能。 一、DICOM 通讯协议栈总体架构 DICOM 通讯使用 TCP/IP 建立连接&#xff0c;其上面封装了多个协议层次&#xf…...

QML与C++:基于ListView调用外部模型进行增删改查(附自定义组件)

目录 引言相关阅读项目结构文件组织 核心技术实现1. 数据模型设计联系人项目类 (datamodel.h)数据模型类 (datamodel.h)数据模型实现 (datamodel.cpp) 2. 主程序入口点 (main.cpp)3. 主界面设计 (Main.qml)4. 联系人对话框 (ContactDialog.qml)5. 自定义组件CustomTextField.qm…...

# linux 设置宽容模式

linux 设置宽容模式 在Linux系统中&#xff0c;通常没有直接称为“宽容模式”的设置选项&#xff0c;但你可以通过几种方式来模拟或调整系统行为&#xff0c;使其表现得更加“宽容”&#xff0c;特别是在处理错误、权限问题或其他潜在问题时。以下是一些常见的方法&#xff1a…...

#1 理解物联网

物联不是一个新概念&#xff0c;物联网如其中文译名&#xff0c; 虚拟和物的对应和联接。 对于人类的梦想而言&#xff0c;总是希望自己无比强大&#xff0c;但受限于外部条件而只能为此悻悻念念。 所以人们的目光聚焦在&#xff0c;上世纪70年代发展的传感器、大规模电路、通…...

物联网场景实战:智能电表数据管理与分析(二)

数据管理 数据清洗与预处理 智能电表在数据采集、传输和存储过程中&#xff0c;不可避免地会引入噪声、出现缺失值和异常值等问题&#xff0c;这些问题会严重影响数据的质量和后续分析的准确性&#xff0c;因此数据清洗至关重要。 噪声数据通常是由于测量误差、通信干扰等原…...

linux一次启动多个jar包

linux一次启动多个jar包并且可以自定义路径和端口号 代码使用 分享公司大神使用的一个脚步,可以一次启动多个jar包,也可以指定启动jar包 代码 #! /bin/sh # 端口号 PORTS(8080 8081 8082 8083) # 模块 MODULES(gateway auth system file) # 模块名称 MODULE_NAMES(网关服务 认…...

自然语言交互:NAS进化的下一站革命

自然语言交互&#xff1a;NAS进化的下一站革命 在数据爆炸式增长的数字时代&#xff0c;网络附加存储设备&#xff08;NAS&#xff09;早已突破企业级应用的边界&#xff0c;成为个人数字资产管理的核心枢纽。当全球NAS市场年复合增长率稳定在15%之际&#xff0c;耘想科技推出…...

go中我遇到的问题总结

go问题总结 1 - go中的nil等于java中的null吗 在 Go 和 Java 中,nil 和 null 都用于表示“空值”,但它们的实现和使用方式有所不同。 以下是 Go 中的 nil 和 Java 中的 null 之间的对比: 1. Go 中的 nil 在 Go 中,nil 是一个预定义的常量,表示零值。它的行为根据数据类…...

java面试题带答案2025最新整理

文章目录 一、java面试题集合框架1. 请简要介绍 Java 集合框架的体系结构2. ArrayList 和 LinkedList 的区别是什么3. HashMap 的工作原理是什么&#xff0c;它在 JDK 7 和 JDK 8 中有哪些不同4. 如何解决 HashMap 的线程安全问题5. TreeSet 是如何保证元素有序的 二、java面试…...

第七届浙江省大学生网络与信息安全竞赛决赛Unserialize深度解析 1.0

花还会重新开&#xff0c;不同的春来了又来。 - 2025.4.11 0x01 声明 仅作为个人学习使用&#xff0c;仅供参考&#xff0c;欢迎交流 可能是新生赛缘故&#xff0c;突发奇想&#xff0c;想好好梳理此题&#xff0c;顺便写成参考&#xff0c;于是有了这篇文章 当然很多理解可…...

onlyoffice 在线编辑集成

onlyoffice 在线编辑集成 项目中要使用word在线编辑功能&#xff0c;记录一下过程 安装使用docker版本 docker run -itd -p 8001:80 --name kodoffice --restart always registry.cn-hangzhou.aliyuncs.com/kodcloud/kodoffice:7.4.1.1 启动后http://192.168.x.x:8001/web/…...

2.4goweb 项目1

mysql库和表 CREATE DATABASE IF NOT EXISTS book_manager CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;USE book_manager;-- 用户表&#xff08;用于登录&#xff09; CREATE TABLE IF NOT EXISTS users (user_id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(…...

ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(系列开篇)

目录 ESP-ADF外设子系统深度解析&#xff1a;esp_peripherals组件架构与核心设计&#xff08;系列开篇&#xff09;简介模块概述功能定义架构位置核心特性 接口分析公共API概述1. 外设集合管理API2. 单个外设管理API3. 事件通信API4. 定时器管理API 数据结构关键数据结构分析枚…...

供应链管理:供应链管理的边界

一、追根溯源&#xff0c;什么是真正的财富 序号财富解释1土地作为生产资料&#xff0c;土地是农业、工业、商业的基础 城市中心的土地因稀缺性而价值连城&#xff0c;农业土地的肥沃程度直接影响粮食产量。2资源、矿产提供能源和原材料&#xff0c;支撑工业生产和经济发展。 …...

【Linux网络编程】TCP Echo Server的实现

本文专栏&#xff1a;linux网络编程 本文的基础知识是基于上篇文章&#xff1a;UDP Echo Server的实现 传送门&#xff1a; 【Linux网络编程】UDP Echo Server的实现 -CSDN博客 目录 一&#xff0c;InetAddr类的编写 二&#xff0c;客户端代码编写 创建套接字&#xff08;s…...

信奥赛CSP-J复赛集训(数学思维专题)(11):P9585 「MXOI Round 2」酒店

信奥赛CSP-J复赛集训&#xff08;数学思维专题&#xff09;&#xff08;11&#xff09;&#xff1a;P9585 「MXOI Round 2」酒店 题目描述 小 C 开了一家酒店&#xff0c;叫做 CC Hotel。 一天&#xff0c;CC Hotel 来了 n n n 位客人。小 C 需要把他们都安排在酒店的某一层…...

python: audioFlux XXCC 提取梅尔频率倒谱系数 MFCC

承上一篇&#xff1a;python&#xff1a;audioFlux 使用教程 XXCC: 倒谱系数&#xff0c;支持所有频谱类型. 可以提取梅尔频率倒谱系数&#xff08;MFCC&#xff09; Cepstrum coefficients, supports all spectrum types. 以下是使用 audioflux 库中 XXCC 类计算倒谱系数…...

PHP + Go 如何协同打造高并发微服务?

为什么需要 PHP Go 协同&#xff1f; 在微服务架构中&#xff0c;PHP 和 Go 看似是“两个世界”的语言&#xff0c;但它们的互补性极强&#xff1a; PHP&#xff1a;开发效率高、生态成熟&#xff0c;适合快速实现复杂业务逻辑&#xff08;如电商订单、用户系统&#xff09;…...

k8s工具使用

Kubectl Cheat Sheet k8s的命令级别 1.基础命令(初级) 2.基础命令(中级) 3.部署命令 4.集群管理命令 5.故障排查和调试命令 6.高级命令 7.设置命令 8.其它命令 命令行提示 为了使用kubectl命令更加高效,我们可以选择安装一下开源软件来增加操作kubectl命令的快捷方式,同…...

uml制做参考-以代码画UML图

【PlantUML系列】类图&#xff08;一&#xff09;_plantuml skin-CSDN博客 UML入门以及Plant UML工具介绍_plantuml-CSDN博客 UML类图详解-CSDN博客 【PlantUML】-类图-CSDN博客 【掌握绘图艺术】用PlantUML绘制完美UML图表&#xff0c;编程开发者的福音 - 知乎 如何优化P…...

深入解析B站androidApp接口:从bilibili.api.ticket.v1.Ticket/GetTicket到SendMsg的技术分析

前言 最近一段时间&#xff0c;我对B站的App接口进行了深入分析&#xff0c;特别是关注了认证机制和私信功能的实现。通过逆向工程和网络抓包&#xff0c;发现了B站移动端API的底层工作原理&#xff0c;包括设备标识生成机制、认证流程和消息传输协议。本文将分享这些研究成果…...

[AI ][Dify] 构建一个自动化新闻编辑助手:Dify 工作流实战指南

在内容创作行业中,自动化辅助工具已成为提升编辑效率的重要利器。本文将通过 Dify 平台,演示如何构建一个**“新闻编辑助手”**,实现从网页抓取、文本翻译、标题生成,到新闻配图的全流程自动化。 🎯 目标概览 这个工作流旨在实现如下功能: 从指定网页抓取新闻内容; 使…...

Unity中国战略调整简讯:Unity6下架 团结引擎接棒

Unity中国战略调整简讯&#xff1a;Unity6下架 团结引擎接棒 免费版 2025年4月9日 —— Unity中国宣布自即日起&#xff0c;中国大陆及港澳地区停止提供Unity 6及后续版本下载与服务&#xff0c;相关功能由国产引擎“团结引擎”承接。国际版2022 LTS及更早版本仍由Unity中国维护…...

司美格鲁肽用SNAC市场报告:2024年全球市场销售额达到了0.14亿美元

引言&#xff1a;了解司美格鲁肽与SNAC的重要性 在当前的医药领域&#xff0c;司美格鲁肽&#xff08;Semaglutide&#xff09;作为一种创新性的治疗2型糖尿病和肥胖症的药物&#xff0c;受到了广泛关注。而SNAC&#xff08;N-&#xff08;8-&#xff08;2-羟苯基&#xff09;…...

自动驾驶第一性原理

所谓的第一性原理&#xff1a; 就是指从最基本的物理规律&#xff0c;数据逻辑及工程约束条件出发&#xff0c;剥离所有的非本质的假设&#xff0c;直接推导出自动驾驶最核心的要素。 自动驾驶核心框架分解&#xff1a; 1、根本目标&#xff1a; 安全高效的将人/物从A地运送…...

《UE5_C++多人TPS完整教程》学习笔记36 ——《P37 拾取组件(Pickup Widget)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P37 拾取组件&#xff08;Pickup Widget&#xff09;》 的学习笔记&#xff0c;该系列教学视频为计算机工程师、程序员、游戏开发者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; Steph…...

Uniswap V2/V3/V4 流动性与价格计算详解

Uniswap V2/V3/V4 流动性与价格计算详解 一、核心概念对比 Uniswap V2 流动性模型: 恒定乘积公式 (x * y = k)价格决定: 完全由池子中的代币数量决定 (price = y/x)流动性衡量: 总储备量代表流动性,直接通过 getReserves() 获取流动性分布: 均匀分布在所有价格点交易费用: 固…...

yum安装MySQL数据库

yum安装方式 优点&#xff1a;操作简单易用。不用单独下载&#xff0c;服务器可以联网且yum源没有问题即可(可以选择国内的163/阿里源) 安装步骤&#xff1a; 1.关闭防火墙和selinux: systemctl stop firewalld ##关闭防火墙 systemctl disable firewalld …...

大联盟(特别版)双端互动平台完整套件分享:含多模块源码+本地部署环境

这是一套结构清晰、功能完整的互动平台组件&#xff0c;适合有开发经验的技术人员进行模块参考、结构研究或本地部署实验使用。 该平台覆盖前端展示、后端服务、移动端资源以及完整数据库&#xff0c;采用模块化架构&#xff0c;整体部署流程简单清晰&#xff0c;适合自研团队参…...

【Code】《代码整洁之道》笔记-Chapter15-JUnit内幕

第15章 JUnit内幕 JUnit是最有名的Java框架之一。就像别的框架一样&#xff0c;它概念简单&#xff0c;定义精确&#xff0c;实现优雅。但它的代码是怎样的呢&#xff1f;本章将研判来自JUnit框架的一个代码例子。 15.1 JUnit框架 JUnit有很多位作者&#xff0c;但它始于K…...

【Java八股】

JVM JVM中有哪些引用 在Java中&#xff0c;引用&#xff08;Reference&#xff09;是指向对象的一个变量。Java中的引用不仅仅有常规的直接引用&#xff0c;还有不同类型的引用&#xff0c;用于控制垃圾回收&#xff08;GC&#xff09;的行为和优化性能。JVM中有四种引用类型…...

深入探究AI编程能力:ChatGPT及其大规模模型的实现原理

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4-turbo模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 随着人工智能的快速发展&#xff0c…...

高德地图 JS-SDK 实现教程

高德地图 JS-SDK 实现教程&#xff1a;定位、地图选点、地址解析等 适用地点选择、地址显示、表单填写等场景&#xff0c;全面支持移动端、手机浏览器和 PC端环境 一、创建应用&Key 前端&#xff08;JS-SDK、地图组件&#xff09; 登陆 高德开放平台创建应用&#xff0c;…...

【信息系统项目管理师】高分论文:论信息系统项目的整合管理(银行数据仓库项目)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 正文一、制定项目章程二、制定项目管理计划三、指导和管理项目的实施四、管理项目知识五、监控项目工作六、实施整体变更控制七、结束项目或阶段正文 2023年6月,我以项目经理的身份,参加了 xx银行xx省分行数…...

dev中使用auto的方法

在dev-c中使用新特性是一样的道理&#xff0c;在他启动编译器来编译代码的时候我们让他加上这个参数就行了&#xff0c;设置方法是:在Tools里面找到Compiler Options打开它&#xff0c;然后把那个Add the following commands when calling compiler:选上勾&#xff0c;在里面加…...

C 语言中经典的数据结构

在 C 语言中&#xff0c;经典的数据结构通常包括以下几种&#xff0c;每种都有其特定的应用场景和实现方式&#xff1a; 1. 数组&#xff08;Array&#xff09; 定义&#xff1a;连续内存空间存储相同类型的数据。 特点&#xff1a;随机访问快&#xff08;O(1)&#xff09;&am…...

小白学习java第12天(下):网络编程

上面我们了解TCP就是三次握手&#xff01;&#xff01;&#xff01; 下面我们就详细介绍一下UDP&#xff0c;就是进行发包&#xff08;TCP协议类似于就是打电话&#xff0c;你必须进行连接才能进行传输&#xff0c;但是UDP类似于发消息&#xff0c;连不连接我都是可以的&#…...

论文精度:双分支图Transformer网络:视频驱动的3D人体网格重建新突破

论文地址:https://arxiv.org/pdf/2412.01179 目录 一、背景与问题定义 1.1 3D人体网格重建的意义 1.2 现有方法的困境 二、核心创新:DGTR网络架构 2.1 整体框架设计 2.2 全局运动感知分支(GMA) 2.3 局部细节优化分支(LDR) 2.3.1 局部信息聚合 2.3.2 调制图卷积…...

华三IRF堆叠技术

IRF&#xff08;Intelligent Resilient Framework&#xff0c;智能弹性架构&#xff09;是华三通信&#xff08;H3C&#xff09;自主研发的网络设备虚拟化技术&#xff0c;通过将多台物理设备整合为单一逻辑设备&#xff0c;实现统一管理、高可靠性和灵活扩展。以下是其核心要点…...

第一阶段补充知识

目录 书写脚本使用的相关知识&#xff1f; 备份和冗灾的区别&#xff1f;什么叫DD备份&#xff0c;什么叫DD冗灾&#xff1f; 关于Linux系统优化以及Linux的安全加固&#xff1f; 系统优化 硬件系统优化&#xff1a; 内核参数优化&#xff1a; 网络性能优化&#xff1a; 进程管…...

STM32 HAL库 L298N电机驱动模块实现

一、引言 在机器人、自动化设备等众多应用场景中&#xff0c;电机驱动是一个关键的部分。L298N 是一款常用的电机驱动模块&#xff0c;它可以驱动两个直流电机或一个步进电机。STM32F407 是一款高性能的 ARM Cortex-M4 内核微控制器&#xff0c;结合 HAL 库可以方便地实现对 L…...

Redis的Key的过期策略

我们都知道Redis的键值对是可以设置过期时间的&#xff0c;那么就会涉及到一个问题&#xff0c;Redis到底是如何做到响应快的同时有能快速地释放掉过期的键值对的呢&#xff1f;不卖关子了&#xff0c;直接说答案&#xff0c;那就是Redis两个策略&#xff1a;定期删除和惰性删除…...

ubuntu桌面版使用root账号进行登录

这里写自定义目录标题 第一步&#xff1a;给root账户设置密码&#xff0c;并切换至root账户第二步&#xff1a;注释gdm-autologin文件内的相关内容第三步&#xff1a;注释gdm-password文件内的相关内容第四步&#xff1a;重启系统即可使用root账户登录 第一步&#xff1a;给roo…...

贪心算法(18)(java)距离相等的条形码

在一个仓库里&#xff0c;有一排条形码&#xff0c;其中第 i 个条形码为 barcodes[i]。 请你重新排列这些条形码&#xff0c;使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案&#xff0c;此题保证存在答案。 示例 1&#xff1a; 输入&#xff1a;barco…...

CentOS服务器能ping通却无法yum install:指定镜像源解决

文章目录 前言一、问题记录二、解决过程1.修改DNS无效2.指定镜像源 总结 前言 今天有一个项目现场要在一个远程centos服务器上部署产品服务&#xff0c;发现能ping通百度&#xff0c;但是无法yum install 安装基础软件包&#xff0c;开始以为DNS服务器的问题&#xff0c;结果配…...