Hanlp训练模型代码

时间: 2023-03-02 19:20:34 浏览: 54
Hanlp是一款基于Python的自然语言处理工具包,其中包含了许多预训练好的模型,同时也支持用户自己训练模型。下面是一个简单的示例,演示如何使用Hanlp训练命名实体识别模型。 首先,需要准备好训练数据。假设我们的训练数据存储在文件`train.txt`中,每行包含一个句子及其对应的命名实体标注,例如: ``` 华为是一家伟大的公司 B-ORG O O O O O 小明在上海工作 B-PER O O B-LOC O ``` 其中,`B-ORG`表示一个实体的开始,`I-ORG`表示实体的中间部分,`O`表示非实体。在本示例中,我们只考虑三种实体类型:人名(`PER`)、地名(`LOC`)和组织机构名(`ORG`)。 接下来,使用Hanlp提供的工具类来读取训练数据,并将其转换为模型需要的格式: ```python from hanlp.datasets.ner.conll03 import CONLL03EnglishDataset from hanlp.pretrained.word2vec import CONLL03_ENGLISH_GLOVE_6B_100D trainset = CONLL03EnglishDataset() trainset.load('train.txt') # 加载预训练的词向量,用于提取句子中的词特征 word2vec = CONLL03_ENGLISH_GLOVE_6B_100D ``` 接下来,定义模型的结构和训练参数: ```python from hanlp.components.ner import TransformerNamedEntityRecognizer model = TransformerNamedEntityRecognizer(word2vec, max_seq_length=128, num_labels=3, hidden_size=128, num_hidden_layers=2, num_attention_heads=2, intermediate_size=512, batch_size=32, lr=5e-5, num_train_epochs=5) ``` 其中,`max_seq_length`表示输入句子的最大长度,`num_labels`表示命名实体的类别数,`hidden_size`表示Transformer模型中隐藏层的大小,`num_hidden_layers`表示隐藏层的数量,`num_attention_heads`表示注意力头的数量,`intermediate_size`表示Transformer中间层的大小,`batch_size`表示每个batch中的样本数量,`lr`表示学习率,`num_train_epochs`表示训练的轮数。 最后,开始训练模型: ```python model.fit(trainset, save_dir='model', pretrained_embeddings_trainable=True) ``` 其中,`save_dir`表示训练好的模型将会保存在哪个文件夹中,`pretrained_embeddings_trainable`表示是否训练预训练的词向量。 训练完成后,我们就可以使用训练好的模型来进行命名实体识别了: ```python text = '小明在上海工作' model.predict(text) ``` 上述代码将输出: ``

相关推荐

Java 使用 HanLP 训练模型的代码主要分为以下几个步骤: 1. 首先,你需要下载 HanLP 的源代码,并将其导入到你的 Java 项目中。可以从 GitHub 上下载 HanLP 源代码:https://github.com/hankcs/HanLP。 2. 然后,你需要加载 HanLP 的配置文件,并创建一个 PerceptronTrainer 对象来训练模型。下面是一个示例代码: java Properties props = new Properties(); props.setProperty("model", "perceptron"); props.setProperty("input", "data/training/pku98/199801.txt"); props.setProperty("output", "data/test/pku98/199801.txt"); PerceptronTrainer trainer = new PerceptronTrainer(props); trainer.train(); 在这个示例中,我们使用 PerceptronTrainer 对象来训练一个感知机模型。我们需要指定以下三个属性: - model:指定要训练的模型类型,这里我们选择了感知机模型。 - input:指定训练数据的路径。 - output:指定输出的模型文件路径。 3. 接下来,你需要将训练好的模型加载到你的 Java 代码中。你可以使用 PerceptronSegmenter 类来加载模型并进行分词。下面是一个示例代码: java PerceptronSegmenter segmenter = new PerceptronSegmenter("data/model/perceptron/pku199801/cws.bin"); List<Term> termList = segmenter.segment("这是一段测试文本"); System.out.println(termList); 在这个示例中,我们使用 PerceptronSegmenter 类来加载训练好的模型,并对一段文本进行分词。我们需要指定模型文件的路径作为参数。在这个示例中,我们加载了训练好的感知机模型。 以上就是 Java 使用 HanLP 训练模型的基本步骤。需要注意的是,在实际应用中,你需要选择适合你的场景的模型和训练数据,并根据具体的需求对代码进行适当的修改。
以下是 HanLP 在 Java 中进行情感分析的代码及相关导包: java import com.hankcs.hanlp.classification.classifiers.NaiveBayesClassifier; import com.hankcs.hanlp.classification.corpus.ClassPathCorpusLoader; import com.hankcs.hanlp.classification.models.NaiveBayesModel; import com.hankcs.hanlp.classification.tokenizers.NGramTokenizer; import com.hankcs.hanlp.classification.utilities.TextUtility; import com.hankcs.hanlp.utility.TestUtility; import java.io.IOException; public class HanLPSentimentAnalysisDemo { public static void main(String[] args) throws IOException { // 1. 加载训练集 ClassPathCorpusLoader corpusLoader = new ClassPathCorpusLoader(); corpusLoader.load("ClassicsCorpus/SogouC.mini"); // 2. 构建模型 NaiveBayesModel model = NaiveBayesModel.train(corpusLoader.getCategories(), corpusLoader.getDocuments(), TextUtility::normalizeText, new NGramTokenizer(1, 2)); // 3. 保存模型 model.save("sentiment.m"); // 4. 加载模型 model = new NaiveBayesModel("sentiment.m"); // 5. 使用模型进行情感分析 NaiveBayesClassifier classifier = new NaiveBayesClassifier(model); String text = "这是一篇正面的文章"; System.out.println(text + " 的情感极性是 " + classifier.classify(text)); text = "这是一篇负面的文章"; System.out.println(text + " 的情感极性是 " + classifier.classify(text)); // 6. 测试模型 TestUtility.testClassifier(classifier, corpusLoader.getCorpus()); } } 需要导入的包括: java import com.hankcs.hanlp.classification.classifiers.NaiveBayesClassifier; import com.hankcs.hanlp.classification.corpus.ClassPathCorpusLoader; import com.hankcs.hanlp.classification.models.NaiveBayesModel; import com.hankcs.hanlp.classification.tokenizers.NGramTokenizer; import com.hankcs.hanlp.classification.utilities.TextUtility; import com.hankcs.hanlp.utility.TestUtility; import java.io.IOException;
使用Java运行训练好的文本分类模型,可以按照以下步骤进行: 1. 准备训练好的模型文件 首先,需要准备训练好的文本分类模型文件。这个模型文件通常包含模型的结构和参数,可以使用Python的PyTorch或TensorFlow等框架训练得到。 2. 加载模型文件 使用Java的PyTorch API或TensorFlow API,可以加载训练好的模型文件。在这里,以PyTorch模型举例,可以使用PyTorch Java API的Module类来加载PyTorch模型文件。示例代码如下: java import org.pytorch.Module; Module module = Module.load("/path/to/model.pt"); 3. 对文本进行预处理 在输入文本进行分类之前,需要对其进行预处理。通常包括分词、去除停用词、转化为向量等步骤。可以使用Java的自然语言处理库,如HanLP或Stanford NLP等,来实现这些步骤。 4. 将预处理后的文本转化为PyTorch tensor PyTorch模型的输入是PyTorch tensor,因此需要将预处理后的文本转化为PyTorch tensor。可以使用PyTorch Java API的Tensor类来实现。示例代码如下: java import org.pytorch.Tensor; // 文本经过预处理后得到一个向量,假设为 vector Tensor inputTensor = Tensor.fromBlob(vector, new long[]{1, vector.length}); 5. 运行模型 将预处理后的文本转化为PyTorch tensor后,可以将其输入到模型中进行分类。使用PyTorch Java API的Module类的forward方法可以实现模型的前向传播。示例代码如下: java Tensor outputTensor = module.forward(inputTensor).toTensor(); 6. 处理模型输出 模型的输出是一个PyTorch tensor,需要将其转化为Java数据类型进行处理。例如,如果模型输出是一个概率向量,可以通过以下代码得到分类结果: java float[] outputArray = outputTensor.getDataAsFloatArray(); int maxIdx = 0; float maxVal = 0; for (int i = 0; i < outputArray.length; i++) { if (outputArray[i] > maxVal) { maxIdx = i; maxVal = outputArray[i]; } } 在上述代码中,首先将PyTorch tensor转化为一个Java数组,然后遍历数组找到最大值,即为分类结果。 以上是使用Java运行训练好的文本分类模型的一般步骤,具体实现需要根据模型的具体情况进行调整。
### 回答1: PyTorch是目前非常流行的深度学习框架之一,它提供了许多强大的工具来实现各种深度学习模型,包括卷积神经网络(CNN)等。 汉字预测是一项非常有趣和有挑战的任务,通常使用循环神经网络(RNN)实现。但是,我们也可以使用CNN来实现这项任务。 下面是一个简单的PyTorch CNN汉字预测代码示例: import torch import torch.nn as nn import torch.optim as optim import torchvision.transforms as transforms import torchvision.datasets as datasets # 定义一个卷积神经网络类 class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.conv1 = nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1) self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1) self.fc1 = nn.Linear(32 * 7 * 7, 100) self.fc2 = nn.Linear(100, 5000) self.out = nn.Linear(5000, 500) def forward(self, x): x = nn.functional.relu(self.conv1(x)) x = nn.functional.max_pool2d(x, 2) x = nn.functional.relu(self.conv2(x)) x = nn.functional.max_pool2d(x, 2) x = x.view(-1, 32 * 7 * 7) x = nn.functional.relu(self.fc1(x)) x = nn.functional.dropout(x, training=self.training) x = nn.functional.relu(self.fc2(x)) x = nn.functional.dropout(x, training=self.training) x = self.out(x) return x # 训练函数 def train(model, device, train_loader, optimizer, epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = nn.functional.cross_entropy(output, target) loss.backward() optimizer.step() if batch_idx % 100 == 0: print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format( epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), loss.item())) # 测试函数 def test(model, device, test_loader): model.eval() test_loss = 0 correct = 0 with torch.no_grad(): for data, target in test_loader: data, target = data.to(device), target.to(device) output = model(data) test_loss += nn.functional.cross_entropy(output, target, reduction='sum').item() pred = output.argmax(dim=1, keepdim=True) correct += pred.eq(target.view_as(pred)).sum().item() test_loss /= len(test_loader.dataset) print('Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)'.format( test_loss, correct, len(test_loader.dataset), 100. * correct / len(test_loader.dataset))) def main(): # 超参数 batch_size = 64 epochs = 10 lr = 0.01 # 加载数据集 transform = transforms.Compose([ transforms.Grayscale(), transforms.Resize(28), transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) train_set = datasets.ImageFolder(root='./train', transform=transform) train_loader = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True, num_workers=4) test_set = datasets.ImageFolder(root='./test', transform=transform) test_loader = torch.utils.data.DataLoader(test_set, batch_size=batch_size, shuffle=False, num_workers=4) # GPU加速 device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # 创建模型并将其移动到设备上 model = CNN().to(device) # 定义优化器和学习率 optimizer = optim.SGD(model.parameters(), lr=lr) # 训练和测试 for epoch in range(1, epochs + 1): train(model, device, train_loader, optimizer, epoch) test(model, device, test_loader) if __name__ == '__main__': main() 上面的代码定义了一个简单的CNN模型,并使用MNIST图片数据集进行训练和测试。我们可以对其进行修改,以使用汉字数据集进行训练和预测。关键是要将数据预处理为CNN所期望的形状和范围,然后使用适当的损失函数以及基于类别的准确性指标进行训练和测试。 ### 回答2: PyTorch是一种基于Python的深度学习库,被各行各业广泛应用。CNN是一种经典的神经网络结构,常用于图像识别和分类。 HanLP是国内知名的自然语言处理库,其中包含了一个汉字预测模型。下面给出使用PyTorch实现HanLP汉字预测模型的代码: 首先,我们需要导入需要的库: import torch import torch.nn as nn import torch.optim as optim import numpy as np 接着,定义模型结构和超参数: class HanLP_CNN(nn.Module): def __init__(self): super(HanLP_CNN, self).__init__() self.conv1 = nn.Conv2d(1, 8, kernel_size=(3, 50)) self.pool1 = nn.MaxPool2d(kernel_size=(3,1), stride=(3,1)) self.conv2 = nn.Conv2d(8, 16, kernel_size=(3, 1)) self.pool2 = nn.MaxPool2d(kernel_size=(3,1), stride=(3,1)) self.fc = nn.Linear(16*20, 5000) def forward(self, x): x = self.pool1(torch.relu(self.conv1(x))) x = self.pool2(torch.relu(self.conv2(x))) x = x.view(-1, 16*20) x = self.fc(x) return x model = HanLP_CNN() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=1e-3) batch_size = 64 epochs = 30 接下来,读入数据集: # 使用numpy读入数据 x_train = np.load("data/x_train.npy") y_train = np.load("data/y_train.npy") x_val = np.load("data/x_val.npy") y_val = np.load("data/y_val.npy") # 转换为PyTorch张量 x_train = torch.from_numpy(x_train).float() y_train = torch.from_numpy(y_train).long() x_val = torch.from_numpy(x_val).float() y_val = torch.from_numpy(y_val).long() # 构建数据集和数据加载器 train_dataset = torch.utils.data.TensorDataset(x_train, y_train) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True) val_dataset = torch.utils.data.TensorDataset(x_val, y_val) val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=batch_size, shuffle=False) 接着,开始训练模型: # 定义训练函数 def train(model, loader, criterion, optimizer): model.train() epoch_loss = 0 for batch_idx, (data, target) in enumerate(loader): optimizer.zero_grad() output = model(data.unsqueeze(1)) loss = criterion(output, target) epoch_loss += loss.item() loss.backward() optimizer.step() return epoch_loss / len(loader) # 定义测试函数 def test(model, loader, criterion): model.eval() epoch_loss = 0 correct = 0 with torch.no_grad(): for batch_idx, (data, target) in enumerate(loader): output = model(data.unsqueeze(1)) loss = criterion(output, target) epoch_loss += loss.item() pred = output.argmax(dim=1, keepdim=True) correct += pred.eq(target.view_as(pred)).sum().item() return epoch_loss / len(loader), correct / len(loader.dataset) # 开始训练 for epoch in range(epochs): train_loss = train(model, train_loader, criterion, optimizer) val_loss, val_acc = test(model, val_loader, criterion) print('Epoch:{}\t Training Loss:{:.3f}\t Validation Loss:{:.3f}\t Validation Acc:{:.3f}'.format(epoch+1, train_loss, val_loss, val_acc)) 最后,我们可以用训练好的模型对汉字进行预测: # 载入测试集 x_test = np.load("data/x_test.npy") y_test = np.load("data/y_test.npy") # 转换为PyTorch张量 x_test = torch.from_numpy(x_test).float() # 预测结果并计算准确率 model.eval() with torch.no_grad(): output = model(x_test.unsqueeze(1)) pred = output.argmax(dim=1, keepdim=True) correct = pred.eq(y_test.view_as(pred)).sum().item() acc = correct / len(y_test) print('Test Acc:{:.3f}'.format(acc)) 以上就是使用PyTorch实现汉字预测模型的完整代码,通过这个模型可以实现输入一段中文文本,预测下一个汉字是什么。 ### 回答3: Pytorch是一种基于Python的科学计算框架,该框架提供了自动求导技术,方便了深度学习算法的实现。我们可以使用Pytorch来构建卷积神经网络,用来预测汉字。下面是一个简单的汉字预测代码: 1.准备数据集:我们可以从网上下载一些手写汉字的样本数据集,然后将其转换成灰度图像进行处理。 2.构建模型:我们需要定义一个包含卷积层、池化层、全连接层等的CNN模型来对图像进行训练和预测。 3.定义损失函数:我们使用交叉熵损失函数来计算损失值,然后使用优化器来更新模型参数。 4.训练模型:我们对构建好的模型进行训练,然后通过预测结果和实际标签的对比,来评估模型的准确性。 5.预测结果:我们通过将测试数据输入到CNN模型中,得到模型的输出结果,然后根据输出结果得到汉字的预测结果。 这个代码的主要思路就是通过CNN对汉字进行分类和预测,提高模型的准确性和稳定性。在实际应用中,我们还可以使用数据增强技术、dropout等来加强模型的泛化能力和鲁棒性。
可以使用HanLP中的KMeans算法进行聚类。首先,在pom.xml文件中导入HanLP的依赖,如下所示: xml <dependency> <groupId>com.hankcs</groupId> <artifactId>hanlp</artifactId> <version>portable-1.2.10</version> </dependency> 接下来,你需要编写代码实现KMeans聚类算法的应用。以下是一个使用HanLP进行KMeans聚类的示例代码: java import com.hankcs.hanlp.mining.cluster.ClusterAnalyzer; import com.hankcs.hanlp.mining.cluster.ClusterModel; import com.hankcs.hanlp.mining.cluster.KMeansClustering; import com.hankcs.hanlp.mining.word2vec.WordVectorModel; import java.io.IOException; import java.util.List; public class KMeansExample { public static void main(String[] args) throws IOException { // 加载预训练的词向量模型 WordVectorModel wordVectorModel = new WordVectorModel("your_word2vec_model_path"); // 创建KMeans聚类器 KMeansClustering kMeansClustering = new KMeansClustering(wordVectorModel); // 加载待聚类的文档列表 List<String> documents = loadDocuments("your_documents_path"); // 创建聚类分析器 ClusterAnalyzer<String> analyzer = new ClusterAnalyzer<>(); // 添加文档到聚类分析器 for (String document : documents) { analyzer.addDocument(document); } // 进行KMeans聚类 ClusterModel clusterModel = kMeansClustering.train(analyzer.getDocumentVector(), 10); // 聚类数目为10 // 输出聚类结果 System.out.println(clusterModel); // 获取某个文档所属的类别 int clusterId = analyzer.predict(document); System.out.println("Document belongs to cluster " + clusterId); } private static List<String> loadDocuments(String path) { // 加载文档的代码 // 返回包含所有文档内容的列表 } } 在以上示例代码中,首先需要加载预训练的词向量模型,然后创建KMeans聚类器。接下来,加载待聚类的文档列表,并将文档添加到聚类分析器中。然后,使用KMeans聚类算法进行聚类,指定聚类数目。最后,输出聚类结果,以及给定文档所属的类别。 请注意,示例代码中的your_word2vec_model_path和your_documents_path需要替换为实际的词向量模型路径和待聚类的文档路径。另外,你还可以根据实际需求对代码进行适当的修改。 希望以上信息对你有帮助!1 #### 引用[.reference_title] - *1* [自然语言处理NLP中文分词,词性标注,关键词提取和文本摘要](https://blog.csdn.net/qq_34516746/article/details/124059685)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

最新推荐

数据翻译再造轮子:支持枚举翻译、字典翻译、外键翻译、级联翻译、方法翻译

数据翻译再造轮子:支持枚举翻译、字典翻译、外键翻译、级联翻译、方法翻译

天池比赛:津南数字制造算法挑战赛【赛场一】初赛 17 名 Drop 队代码.zip

比赛项目源码

基于Asp+web的旅游网站系统源码.zip

基于Asp+web的旅游网站系统源码.zip

基于Asp的网络招聘系统源码.zip

基于Asp的网络招聘系统源码.zip

高低温试验箱的日常维护.zip

高低温试验箱的日常维护.zip

代码随想录最新第三版-最强八股文

这份PDF就是最强⼋股⽂! 1. C++ C++基础、C++ STL、C++泛型编程、C++11新特性、《Effective STL》 2. Java Java基础、Java内存模型、Java面向对象、Java集合体系、接口、Lambda表达式、类加载机制、内部类、代理类、Java并发、JVM、Java后端编译、Spring 3. Go defer底层原理、goroutine、select实现机制 4. 算法学习 数组、链表、回溯算法、贪心算法、动态规划、二叉树、排序算法、数据结构 5. 计算机基础 操作系统、数据库、计算机网络、设计模式、Linux、计算机系统 6. 前端学习 浏览器、JavaScript、CSS、HTML、React、VUE 7. 面经分享 字节、美团Java面、百度、京东、暑期实习...... 8. 编程常识 9. 问答精华 10.总结与经验分享 ......

基于交叉模态对应的可见-红外人脸识别及其表现评估

12046通过调整学习:基于交叉模态对应的可见-红外人脸识别Hyunjong Park*Sanghoon Lee*Junghyup Lee Bumsub Ham†延世大学电气与电子工程学院https://cvlab.yonsei.ac.kr/projects/LbA摘要我们解决的问题,可见光红外人重新识别(VI-reID),即,检索一组人的图像,由可见光或红外摄像机,在交叉模态设置。VI-reID中的两个主要挑战是跨人图像的类内变化,以及可见光和红外图像之间的跨模态假设人图像被粗略地对准,先前的方法尝试学习在不同模态上是有区别的和可概括的粗略的图像或刚性的部分级人表示然而,通常由现成的对象检测器裁剪的人物图像不一定是良好对准的,这分散了辨别性人物表示学习。在本文中,我们介绍了一种新的特征学习框架,以统一的方式解决这些问题。为此,我们建议利用密集的对应关系之间的跨模态的人的形象,年龄。这允许解决像素级中�

javascript 中字符串 变量

在 JavaScript 中,字符串变量可以通过以下方式进行定义和赋值: ```javascript // 使用单引号定义字符串变量 var str1 = 'Hello, world!'; // 使用双引号定义字符串变量 var str2 = "Hello, world!"; // 可以使用反斜杠转义特殊字符 var str3 = "It's a \"nice\" day."; // 可以使用模板字符串,使用反引号定义 var str4 = `Hello, ${name}!`; // 可以使用 String() 函数进行类型转换 var str5 = String(123); //

数据结构1800试题.pdf

你还在苦苦寻找数据结构的题目吗?这里刚刚上传了一份数据结构共1800道试题,轻松解决期末挂科的难题。不信?你下载看看,这里是纯题目,你下载了再来私信我答案。按数据结构教材分章节,每一章节都有选择题、或有判断题、填空题、算法设计题及应用题,题型丰富多样,共五种类型题目。本学期已过去一半,相信你数据结构叶已经学得差不多了,是时候拿题来练练手了,如果你考研,更需要这份1800道题来巩固自己的基础及攻克重点难点。现在下载,不早不晚,越往后拖,越到后面,你身边的人就越卷,甚至卷得达到你无法想象的程度。我也是曾经遇到过这样的人,学习,练题,就要趁现在,不然到时你都不知道要刷数据结构题好还是高数、工数、大英,或是算法题?学完理论要及时巩固知识内容才是王道!记住!!!下载了来要答案(v:zywcv1220)。

通用跨域检索的泛化能力

12056通用跨域检索:跨类和跨域的泛化2* Soka Soka酒店,Soka-马上预订;1印度理工学院,Kharagpur,2印度科学学院,班加罗尔soumava2016@gmail.com,{titird,somabiswas} @ iisc.ac.in摘要在这项工作中,我们第一次解决了通用跨域检索的问题,其中测试数据可以属于在训练过程中看不到的类或域。由于动态增加的类别数量和对每个可能的域的训练的实际约束,这需要大量的数据,所以对看不见的类别和域的泛化是重要的。为了实现这一目标,我们提出了SnMpNet(语义Neighbourhood和混合预测网络),它包括两个新的损失,以占在测试过程中遇到的看不见的类和域。具体来说,我们引入了一种新的语义邻域损失,以弥合可见和不可见类之间的知识差距,并确保潜在的空间嵌入的不可见类是语义上有意义的,相对于其相邻的类。我们还在图像级以及数据的语义级引入了基于混�