基于图的去中心化社会推荐过滤器

目录

    • 原论文研究背景与研究意义概述
    • 论文所提出算法的主要贡献
    • GDSRec算法原理与流程
      • 问题定义
      • 去中心化图(decentralized graph)
      • 所提出方法(三种并行建模)
        • 用户建模(user modelling)
    • 模版代码讲解
      • main.py顶层文件:用于集成模与函数功能
      • preprocess.py:对输入数据进行预处理符合模型输入要求
      • model.py:GDSRec模型实现
    • 本地部署方法

原论文研究背景与研究意义概述

  • 本文所涉及的所有资源的获取方式:https://www.aspiringcode.com/content?id=17176636216843&uid=f0437094ce44404b8d9f47f62bbcf7ed

这篇论文由中国科学技术大学团队于2023年发表在TKDE期刊上,主要研究领域是基于用户-用户和用户-事件社会关系的推荐生成。由于这些社会关系可以轻松地用图结构数据来表示,因此图神经网络在这一领域具有很大的发展潜力。然而,现有的基于图的算法在处理数据时往往忽略了用户或事件的偏好偏移量。作者给出的一个示例说明了这种偏移量的重要性:挑剔的用户给出的低评分并不一定意味着他们对产品的态度是消极的,因为这些用户通常会给出低评分,这可能会导致图结构数据分析产生误差。现有的方法通常将这种偏差作为标量融入模型训练中,但作者认为这种做法不足以捕捉所有相关信息。此外,作者指出,用户之间的社会联系也应被考虑在内,因为具有相似偏好的用户往往会对彼此产生更大的影响。基于此,作者提出了一种新的算法来解决这些问题。

论文所提出算法的主要贡献

这篇文章的主要贡献包括: 首先,作者将评价偏移量处理为向量,并将其融入到用户和事件的表征学习中。具体做法是计算用户与其他用户的评价差异向量,从而获得每个用户的评价偏移。具体做法是,他们对原始图进行去中心化处理,然后从中学习到用户和事件的表征。去中心化的图是基于原始图中的统计信息生成的。

接着,作者提出了一种用户-用户之间社会关系的建模方式,并将其融入到预测规则中,以提高推荐表现。

然后,基于去中心化图,他们提出了一种基于图神经网络(GNN)的社会推荐协同过滤模型。

最后,作者在两个数据集上验证了所提出算法的有效性,证明了其在处理用户偏好偏移量和社会关系建模方面的优势。

原论文中采用了大量的数学公式来表示算法过程,这里笔者认为实际上读起来有点费力,所以本文主要从感性的角度来对这篇论文进行讲解,尽量少用公式而是用文字描述来给大家建立一个感性的理解。

GDSRec算法原理与流程

问题定义

原文采用的建图方式是将用户和事件作为节点,用户-事件之间的连线权重为关系系数Tij,用于衡量两个用户的相似度。

关系系数的计算方式可以看作是设定一个阈值,当两个用户对同一个事件的评分差距在阈值之内时,就将相似度加一,累加起来就是两个用户的相似度,这里称为关系系数。而用户-事件连线的权重为用户对事件的评分。然而,作者指出,直接使用这种原始图会带来一些不足,也就是无法准确反映真正的用户偏好。这是因为用户对事件的评分可能受到不同用户的打分标准的影响,从而导致误解用户的真实偏好。因此,作者对图结构进行了去中心化处理,以更好地捕捉用户的真实偏好。

去中心化图(decentralized graph)

去中心化图有三种不同的边:用户-事件、事件-用户、用户-用户。对于每个用户-事件交互的边,用原始权重减去所有权重的平均值得到新的权重,而用户-用户连线的权重保持不变。通过这种方式,作者将统计信息融入到图中。接下来,作者针对这种去中心化图进行了对用户、事件、社会联系三种方向的建模,从而计算出三种潜在因素偏移量。依据这些偏移量,可以计算出最终用户ui和事件vj的最终偏好评分,即:

所提出方法(三种并行建模)

用户建模(user modelling)

然后我们具体介绍一下作者提出的三种建模方式。我们以用户建模(user modeling)为例,期望得到的输出是潜在因素偏移量hui。整个流程可以用上面的公式表示,我们可以逐步拆分这个过程。

首先,需要提到的是,在这个过程中使用的用户-事件交互权重都是进行取整后的。原文指出,使用小数进行embedding不太方便,但同时也提到一些量化方法可以解决这个问题,他们将这部分留作未来工作。前面提到,这篇文章的一大贡献是将评价偏移量处理为向量。

具体做法是将事件𝑣𝑙vl

用户-事件交互的权重进行embedding后的表征进行拼接,然后通过一个多层感知机进行处理,从而融入到学习过程中。𝑞,𝑠qs分别是事件𝑢u和社会关联𝑟r的表征,𝐿𝑈LU是多层感知机,这种方法可以将该向量融入用户表征的学习过程中

同时,作者指出,一个用户和相关联事件之间的每个关联对用户潜在因素的影响贡献是不同的。因此,他们采用了注意力机制来捕捉用户偏好中的差异。公式8中𝑥x前面乘的系数实际上是注意力权重。需要注意的是,在输入注意力网络时,他们将前面的评价偏移向量与用户的embedding向量进行了拼接,然后通过一个两层神经网络进行处理。通过这一流程,就可以得到用户的潜在因素偏移量hui。

事件建模(item modeling)和社会关系建模(social modeling)的处理方式与用户建模类似。三种建模处理后,我们可以得到三种潜在因素偏移量。基于此,偏好评分可以通过三层神经网络获得,用公式9,10,11表示。这个偏好评分可以理解为包括用户自己的意见和对其社会关联用户评级的参考。对于用户ui的社会关联用户,我们可以用相同的方式得到他们的偏好评分,从而得到方程f的返回值,计算方式如公式12。

最终,我们回到前面公式4就可以计算出用户ui和事件vj之间的最终评分。以这种方式就可以实现对用户更全面偏好信息的捕获,以及考虑到有着更强社会关联的用户对用户ui的影响。

模版代码讲解

main.py顶层文件:用于集成模与函数功能

main.py文件在这里仍然是起到一个调用模型和所有函数进行数据输入、处理、训练、结果输出的功能,值得注意的是这里原文作者使用了config参数定义的方式,让整个工程看起来更加简洁、标准

import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
import pickle
import torch
from torch.utils.data import DataLoader
from utils import collate_fn
from model.GDSRec_model import GDSRec_Engineconfig = {'model': 'GDSRec', 'dataset': 'Ciao',  # Ciao/Epinions'optimizer': 'adam','l2_regularization': 0.01,'embed_size': 64,'batch_size': 128,'layers': [256,128,128,64,64],'epoch': 20,'lr': 0.0005,  # 0.01, 0.001, 0.0001'lr_dc': 0.1,  # learning rate decay'lr_dc_step': 100,  # the number steps for decay'test':False,'model_dir': 'checkpoints/{}_{}_best_checkpoint.model'
}
print(config)
here = os.path.dirname(os.path.abspath(__file__))
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(device)
config['device'] = device
workdir = 'C:/Users/meicr/Desktop/GDSRec_rank/data/'
with open(workdir + config['dataset'] + '/' + config['model'] + '_dataset.pkl', 'rb') as f:train_dataset, evaluate_dataset, test_dataset, user_count, item_count = pickle.loads(f.read())
config['num_users'] = user_count
config['num_items'] = item_count
config['num_rates'] = 5if config['test'] is False:engine = GDSRec_Engine(config)train_loader = DataLoader(train_dataset, batch_size=config['batch_size'], shuffle=True, collate_fn=collate_fn)evaluate_loader = DataLoader(evaluate_dataset, batch_size=config['batch_size'], shuffle=False,collate_fn=collate_fn)index_sum = []for epoch in range(config['epoch']):print('Epoch {} starts !'.format(epoch))engine.train_an_epoch(train_loader, epoch)recall, ndcg = engine.evaluate(evaluate_loader, epoch)if epoch == 0:pre_sum = recall + ndcgindex_sum.append(0)else:if recall + ndcg < pre_sum:index_sum.append(1)else:pre_sum = recall + ndcgindex_sum.append(0)if sum(index_sum[-10:]) == 10:breakif epoch == 0:best_sum = recall + ndcgengine.save()elif recall + ndcg > best_sum:best_sum = recall + ndcgengine.save()
else:engine = GDSRec_Engine(config)print('Load checkpoint and testing...')engine.resume()test_loader = DataLoader(test_dataset, batch_size=config['batch_size'], shuffle=True, collate_fn=collate_fn)recall, ndcg = engine.evaluate(test_loader, epoch_id=0)

preprocess.py:对输入数据进行预处理符合模型输入要求

这里preprocess.py文件的作用是对我们输入的数据进行了处理和分析得到模型可以处理的对象,主要包括格式转换、用户相似度计算之类的功能

"""
@author: Jiajia Chan
@date: 20 June, 2020
"""
import random
import argparse
import pickle
import pandas as pd
from scipy.io import loadmat
from rating_data import SingleGenerator
from trust_data import SocialGeneratorrandom.seed(1234)if __name__ == '__main__':parser = argparse.ArgumentParser() parser.add_argument('--dataset', default='Ciao', help='dataset name: Ciao/Epinions')parser.add_argument('--test_prop', default=0.2, help='the proportion of data used for test')args = parser.parse_args() workdir = 'data/'click_f = loadmat(workdir + args.dataset + '/rating.mat')['rating']trust_f = loadmat(workdir + args.dataset + '/trustnetwork.mat')['trustnetwork']click_dt = pd.DataFrame(click_f)trust_dt = pd.DataFrame(trust_f, columns=['userID', 'freID'])click_dt = click_dt[[0, 1, 3]]click_dt.dropna(inplace=True)click_dt.drop_duplicates(inplace=True)click_dt.columns = ['userID', 'itemID', 'rating']trust_dt.dropna(inplace=True)trust_dt.drop_duplicates(inplace=True)single_generator = SingleGenerator(ratings=click_dt, prob=args.test_prop)social_generator = SocialGenerator(singlegenerator=single_generator, trust=trust_dt)GDSRec_dataset = social_generator.instance_GDSRec_dataset()general_dataset = single_generator.instance_general_dataset()with open(workdir + args.dataset +'/' + 'GDSRec' + '_dataset.pkl', 'wb') as f:str1 = pickle.dumps(GDSRec_dataset)f.write(str1)f.close()

model.py:GDSRec模型实现

这个文件里面存放的就是所提出方法和相关算法的所有实现,原理和流程就如上述介绍所示

from torch import nn
from torch.nn import init
import torch
import numpy as npclass _MultiLayerPercep(nn.Module):def __init__(self, input_dim, output_dim):super(_MultiLayerPercep, self).__init__()self.mlp = nn.Sequential(nn.Linear(input_dim, input_dim // 2, bias=True),nn.ReLU(),nn.Linear(input_dim // 2, output_dim, bias=True),)def forward(self, x):return self.mlp(x)class _MultiLayerPercep_tanh(nn.Module):def __init__(self, input_dim, output_dim):super(_MultiLayerPercep_tanh, self).__init__()self.mlp = nn.Sequential(nn.Linear(input_dim, input_dim // 2, bias=True),nn.Tanh(),nn.Linear(input_dim // 2, output_dim, bias=True),)def forward(self, x):return self.mlp(x)class _Aggregation(nn.Module):def __init__(self, input_dim, output_dim):super(_Aggregation, self).__init__()self.aggre = nn.Sequential(nn.Linear(input_dim, output_dim, bias=True),nn.Tanh(),)def forward(self, x):return self.aggre(x)class _UserModel(nn.Module):''' User modeling to learn user latent factors.User modeling leverages two types aggregation: item aggregation and social aggregation'''def __init__(self, emb_dim, user_emb, item_emb, rate_emb):super(_UserModel, self).__init__()self.user_emb = user_embself.item_emb = item_embself.rate_emb = rate_embself.emb_dim = emb_dimself.g_v = _MultiLayerPercep_tanh(2 * self.emb_dim, self.emb_dim)self.user_items_att = _MultiLayerPercep(2 * self.emb_dim, 1)self.aggre_items = _Aggregation(self.emb_dim, self.emb_dim)self.combine_mlp = nn.Sequential(nn.Linear(2 * self.emb_dim, self.emb_dim, bias=True),nn.Tanh(),nn.Linear(self.emb_dim, self.emb_dim, bias=True),nn.Tanh(),nn.Linear(self.emb_dim, self.emb_dim, bias=True),nn.Tanh(),)self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')# used for preventing zero div error when calculating softmax scoreself.eps = 1e-10def forward(self, uids, u_item_pad):# item aggregationq_a = self.item_emb(u_item_pad[:, :, 0])  mask_u = torch.where(u_item_pad[:, :, 0] > 0, torch.tensor([1.], device=self.device),torch.tensor([0.], device=self.device))  u_item_er = self.rate_emb(u_item_pad[:, :, 1])  x_ia = self.g_v(torch.cat([q_a, u_item_er], dim=2).view(-1, 2 * self.emb_dim)).view(q_a.size())  ## calculate attention scores in item aggregationp_i = mask_u.unsqueeze(2).expand_as(x_ia) * self.user_emb(uids).unsqueeze(1).expand_as(x_ia)  alpha = self.user_items_att(torch.cat([x_ia, p_i], dim=2).view(-1, 2 * self.emb_dim)).view(mask_u.size())  # B x maxi_lenalpha = torch.exp(alpha) * mask_ualpha = alpha / (torch.sum(alpha, 1).unsqueeze(1).expand_as(alpha) + self.eps)h_iI = self.aggre_items(torch.sum(alpha.unsqueeze(2).expand_as(x_ia) * x_ia, 1))  # B x emb_dimreturn h_iIclass _ItemModel(nn.Module):'''Item modeling to learn item latent factors.'''def __init__(self, emb_dim, user_emb, item_emb, rate_emb):super(_ItemModel, self).__init__()self.emb_dim = emb_dimself.user_emb = user_embself.item_emb = item_embself.rate_emb = rate_embself.g_u = _MultiLayerPercep_tanh(2 * self.emb_dim, self.emb_dim)self.item_users_att = _MultiLayerPercep(2 * self.emb_dim, 1)self.aggre_users = _Aggregation(self.emb_dim, self.emb_dim)self.combine_mlp = nn.Sequential(nn.Linear(2 * self.emb_dim, self.emb_dim, bias=True),nn.Tanh(),nn.Linear(self.emb_dim, self.emb_dim, bias=True),nn.Tanh(),nn.Linear(self.emb_dim, self.emb_dim, bias=True),nn.Tanh(),)self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')self.eps = 1e-10def forward(self, iids, i_user_pad):# user aggregationp_t = self.user_emb(i_user_pad[:, :, 0])mask_i = torch.where(i_user_pad[:, :, 0] > 0, torch.tensor([1.], device=self.device),torch.tensor([0.], device=self.device))i_user_er = self.rate_emb(i_user_pad[:, :, 1])f_jt = self.g_u(torch.cat([p_t, i_user_er], dim=2).view(-1, 2 * self.emb_dim)).view(p_t.size())# calculate attention scores in user aggregationq_j = mask_i.unsqueeze(2).expand_as(f_jt) * self.item_emb(iids).unsqueeze(1).expand_as(f_jt)miu = self.item_users_att(torch.cat([f_jt, q_j], dim=2).view(-1, 2 * self.emb_dim)).view(mask_i.size())miu = torch.exp(miu) * mask_imiu = miu / (torch.sum(miu, 1).unsqueeze(1).expand_as(miu) + self.eps)z_jU = self.aggre_users(torch.sum(miu.unsqueeze(2).expand_as(f_jt) * f_jt, 1))return z_jUclass _SocialModel(nn.Module):'''socialmodel to learn the rating for specific user exploiting social related users'''def __init__(self, emb_dim, user_emb, item_emb, rate_emb, sim_emb):super(_SocialModel, self).__init__()self.emb_dim = emb_dimself.user_emb = user_embself.item_emb = item_embself.rate_emb = rate_embself.sim_emb = sim_embself.g_v = _MultiLayerPercep_tanh(2 * self.emb_dim, self.emb_dim)self.user_items_att = _MultiLayerPercep(2 * self.emb_dim, 1)self.user_users_att = _MultiLayerPercep(2 * self.emb_dim, 1)self.aggre_items = _Aggregation(self.emb_dim, self.emb_dim)self.combine_mlp = nn.Sequential(nn.Linear(2 * self.emb_dim, self.emb_dim, bias=True),nn.Tanh(),nn.Linear(self.emb_dim, self.emb_dim, bias=True),nn.Tanh(),nn.Linear(self.emb_dim, self.emb_dim, bias=True),nn.Tanh(),)self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')self.eps = 1e-10def forward(self, u_user_pad, u_user_item_pad):q_a_s = self.item_emb(u_user_item_pad[:, :, :, 0])  mask_s = torch.where(u_user_item_pad[:, :, :, 0] > 0, torch.tensor([1.], device=self.device),torch.tensor([0.], device=self.device)) u_user_item_er = self.rate_emb(u_user_item_pad[:, :, :, 1]) x_ia_s = self.g_v(torch.cat([q_a_s, u_user_item_er], dim=3).view(-1, 2 * self.emb_dim)).view(q_a_s.size())  p_i_s = mask_s.unsqueeze(3).expand_as(x_ia_s) * self.user_emb(u_user_pad[:, :, 0]).unsqueeze(2).expand_as(x_ia_s)  alpha_s = self.user_items_att(torch.cat([x_ia_s, p_i_s], dim=3).view(-1, 2 * self.emb_dim)).view(mask_s.size())  alpha_s = torch.exp(alpha_s) * mask_salpha_s = alpha_s / (torch.sum(alpha_s, 2).unsqueeze(2).expand_as(alpha_s) + self.eps)h_oI_temp = torch.sum(alpha_s.unsqueeze(3).expand_as(x_ia_s) * x_ia_s, 2) h_oI = self.aggre_items(h_oI_temp.view(-1, self.emb_dim)).view(h_oI_temp.size())  return h_oIclass GDSRec(nn.Module):'''Args:number_users: the number of users in the dataset.number_items: the number of items in the dataset.num_rate_levels: the number of rate levels in the dataset.emb_dim: the dimension of user and item embedding (default = 64).'''def __init__(self, num_users, num_items, num_rate_levels, emb_dim=64):super(GDSRec, self).__init__()self.num_users = num_usersself.num_items = num_itemsself.num_rate_levels = num_rate_levelsself.emb_dim = emb_dimself.user_emb = nn.Embedding(self.num_users, self.emb_dim, padding_idx=0)self.item_emb = nn.Embedding(self.num_items, self.emb_dim, padding_idx=0)self.rate_emb = nn.Embedding(self.num_rate_levels, self.emb_dim, padding_idx=0)self.sim_dim = nn.Embedding(self.num_items, self.emb_dim, padding_idx=0)self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')self.eps = 1e-10self.user_model = _UserModel(self.emb_dim, self.user_emb, self.item_emb, self.rate_emb)self.item_model = _ItemModel(self.emb_dim, self.user_emb, self.item_emb, self.rate_emb)self.social_model = _SocialModel(self.emb_dim, self.user_emb, self.item_emb, self.rate_emb, self.sim_dim)self.rate_pred = nn.Sequential(nn.Linear(2 * self.emb_dim, self.emb_dim, bias=True),nn.Tanh(),nn.Linear(self.emb_dim, self.emb_dim, bias=True),nn.Tanh(),nn.Linear(self.emb_dim, 1),)def forward(self, uids, iids, u_itemdiv_pad, u_avgs, u_user_pad, u_user_item_pad, i_user_pad, i_avgs):'''Args:uids: the user id sequences.iids: the item id sequences.u_itemdiv_pad: the padded user-item-div graphu_item_pad: the padded user-item graph.u_avgs: the avg rating of useru_user_pad: the padded user-user graph.u_user_item_pad: the padded user-user-item graph.i_user_pad: the padded item-user graph.i_avgs: the avg rating of itemShapes:uids: (B).iids: (B).u_item_pad: (B, ItemSeqMaxLen, 2).u_avgs: (B)u_user_pad: (B, UserSeqMaxLen).u_user_item_pad: (B, UserSeqMaxLen, truncate_len, 2).i_user_pad: (B, UserSeqMaxLen, 2).i_avgs: (B)Returns:the predicted rate scores of the user to the item.'''h_i = self.user_model(uids, u_itemdiv_pad)  z_j = self.item_model(iids, i_user_pad) y_i = self.social_model(u_user_pad, u_user_item_pad) mask = u_user_pad[:, :, 1].unsqueeze(2).float() # make predictionr_ij_1 = self.rate_pred(torch.cat([h_i, z_j], dim=1))r_ij_2 = torch.sum(self.rate_pred(torch.cat([y_i, z_j.unsqueeze(1).expand_as(y_i)], dim=2)) * mask, dim=1)\/(torch.sum(mask, dim=1) + self.eps)r_ij = 0.5 *(r_ij_1 + r_ij_2) + 0.5*(u_avgs.unsqueeze(1) + i_avgs.unsqueeze(1))return r_ij

本地部署方法

我们在github官方链接上只能找到一个数据集Ciao(原论文是在Ciao和Epinions上都进行了实验),我们需要将数据集整理成上述格式,这里可以打开看一下。整理的格式如右图所示,第一列是学生id, 第二列是问题id,第三列是无关变量原文代码中并没有用到,第四列是rating,trustnetwork.mat文件中保存的是学生与学生之间的关系网络。因此我们在进行本地私有数据集训练时也需要将数据处理成对应的格式

该篇论文作者在github上公布了源代码,但笔者下载下来实际运行了之后发现完全按照模版代码运行仍然会出现一些问题。研究之后发现可能是原作者在编写代码后改动了数据集目录格式,导致一些设定的环境路径参数错误。如果我们想要跑通代码或者在本地运行自己的数据集进行实验,还需要对相应的参数进行修改,修改后的代码我已经放在本文附件中了,并且在附件的压缩包内新增了一个Readme文件来提示大家如何修改数据集路径为自己的私有数据集

  • 本文所涉及的所有资源的获取方式:https://www.aspiringcode.com/content?id=17176636216843&uid=f0437094ce44404b8d9f47f62bbcf7ed

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

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

相关文章

计算机的错误计算(一百六十三)

摘要 四个算式“sin(0.00024/2)^2”、“(1-cos(0.00024))/2”、“(1-sqrt(1-sin(0.00024)^2))/2”以及“sin(0.00024)^2/(22*sqrt(1-sin(0.00024)^2))”是等价的。但是,在 MATLAB 中计算它们,输出不完全一致:中间两个算式的输出中含有错误数…

递归算法专题一>Pow(x, n)

题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public double myPow(double x, int n) {return n < 0 ? 1.0 / pow(x,-n) : pow(x,n); }private double pow(double x, int n){if(n 0) return 1.0;double tmp pow(x,n / 2);return n % 2 0 ? tmp * tmp : tmp …

论文阅读 SimpleNet: A Simple Network for Image Anomaly Detection and Localization

SimpleNet: A Simple Network for Image Anomaly Detection and Localization 摘要&#xff1a; 该论文提出了一个简单且应用友好的网络&#xff08;称为 SimpleNet&#xff09;来检测和定位异常。SimpleNet 由四个组件组成&#xff1a;&#xff08;1&#xff09;一个预先训练的…

实战分享:如何在HP-UX上高效扩容Oracle 12c RAC ASM磁盘

文章目录 Oracle 12c RAC ASM磁盘扩容 for HP-UX一、扩容原因二、扩容前信息三、扩容详细步骤3.1 存储划分LUN&#xff0c;映射到Oracle 12c RAC相关主机组3.2 扫描查看磁盘3.3 检查两节点间的磁盘盘符是否一致3.4 以一个节点为准同步磁盘盘符3.5 更改磁盘属主、权限3.6 查看AS…

如何使用 Matlab 制作 GrabCAD 体素打印切片

本教程适用于已经对 Matlab 和 J750 操作有所了解的用户。 它不是有关如何使用 Matlab 软件或 PolyJet 打印机的全面课程。 Stratasys 为您提供以下内容&#xff1a; 第 1 步&#xff1a;什么是体素&#xff1f; 就像 2D 数字图像由像素组成一样&#xff0c;您可以将 3D 数字形…

CNN—LeNet:从0开始神经网络学习,实战MNIST和CIFAR10~

文章目录 前言一、CNN与LeNet介绍二、LeNet组成及其名词解释2.1 输入2.2 卷积层2.3池化层2.4 全连接层2.5 总结 三、MNIST实战3.1 构建神经网络3.2 数据处理3.3 &#xff08;模板&#xff09;设置优化器&#xff0c;损失函数&#xff0c;使用gpu(如果是N卡有cuda核心)&#xff…

SpringBoot集成Dynamo(3)集成远程dynamo

按照推荐的AWS IAM SSO模式&#xff0c;以文件存储凭证的方式&#xff0c;看下代码是如何访问的。 pom依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"…

半导体、晶体管、集成电路、芯片、CPU、单片机、单片机最小系统、单片机开发板-概念串联辨析

下面概念定义从小到大串联&#xff1a; 半导体&#xff08;semiconductor&#xff09;&#xff1a; 是一类常温下导电性能介于导体与绝缘体之间的材料&#xff0c;这种材料的导电性可以随着外部环境比如电压、温度、光照的变换而改变。常见的半导体材料有硅、锗、砷化镓等。 晶…

学习路之phpstudy--安装mysql5.7后在my.ini文件中无法修改sql_mode

windows环境下使用phpstudy安装mysql5.7后需要修改mysql中的sql_mode配置&#xff0c;但是在phpstudy中打开mysql配置文件my.ini后&#xff0c; 通过查找找不到sql_mode或sql-mode&#xff0c; 此时无法在my.ini文件中直接进行修改&#xff0c;可以使用mysql命令进行修改&#…

了解大模型:开启智能科技的新篇章

在当今科技飞速发展的时代,人工智能(AI)已经成为推动社会进步的重要力量。而在AI的众多技术分支中,大模型(Large Model)以其强大的数据处理能力和卓越的性能,正逐渐成为研究和应用的热点。本文旨在科普大模型的基本概念、与大数据的关系以及与人工智能的紧密联系,帮助读…

多目标粒子群优化(Multi-Objective Particle Swarm Optimization, MOPSO)算法

概述 多目标粒子群优化&#xff08;MOPSO&#xff09; 是粒子群优化&#xff08;PSO&#xff09;的一种扩展&#xff0c;用于解决具有多个目标函数的优化问题。MOPSO的目标是找到一组非支配解&#xff08;Pareto最优解&#xff09;&#xff0c;这些解在不同目标之间达到平衡。…

联想ThinkServer服务器主要硬件驱动下载

联想ThinkServer服务器主要硬件驱动下载&#xff1a; 联想ThinkServer服务器主要硬件Windows Server驱动下载https://newsupport.lenovo.com.cn/commonProblemsDetail.html?noteid156404#D50

亚马逊搜索关键词怎么写?

在亚马逊这个全球领先的电子商务平台&#xff0c;如何让自己的产品被更多的消费者发现&#xff0c;是每一个卖家都需要深入思考的问题。而搜索关键词&#xff0c;作为连接卖家与买家的桥梁&#xff0c;其重要性不言而喻。那么&#xff0c;如何撰写有效的亚马逊搜索关键词呢&…

Flutter-Web首次加载时添加动画

前言 现在web上线后首次加载会很慢&#xff0c;要5秒以上&#xff0c;并且在加载的过程中界面是白屏。因此想在白屏的时候放一个加载动画 实现步骤 1.找到web/index.html文件 2.添加以下<style>标签内容到<head>标签中 <style>.loading {display: flex;…

动态规划子数组系列一>最长湍流子数组

1.题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public int maxTurbulenceSize(int[] arr) {int n arr.length;int[] f new int[n];int[] g new int[n];for(int i 0; i < n; i)f[i] g[i] 1;int ret 1;for(int i 1; i < n-1; i,m. l.kmddsfsdafsd){int…

win10 禁止更新

一、winR 输入 regedit 二、输入注册列表路径&#xff1a; &#xff08;1&#xff09;计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings &#xff08;2&#xff09;按照格式&#xff0c;创建文件命名: FlightSettingsMaxPauseDays &#xff08;3&…

传奇996_36——背包图标,物品位置问题

绑定位置不对位 CTRLF9背包物品文件&#xff0c;也就是bag_item文件夹的bag_item.lua文件&#xff0c;这个小框和大框的相对位置会影响那个绑定图标,就是背包物品组合的标签和下面子标签的相对位置 背包物品偏移到看不见 原因&#xff1a;CTRLF9背包物品文件&#xff0c;也就…

springboot3如何集成knife4j 4.x版本及如何进行API注解

1. 什么是Knife4j knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案, 取名knife4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!knife4j的前身是swagger-bootstrap-ui,swagger-bootstrap-ui自1.9.6版本后,正式更名为knife4j为了契合微服务的架构发展,由于原来…

机械设计学习资料

免费送大家学习资源&#xff0c;已整理好&#xff0c;仅供学习 下载网址&#xff1a; https://www.zzhlszk.com/?qZ02-%E6%9C%BA%E6%A2%B0%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83SOP.zip

【大数据学习 | Spark-Core】RDD的概念与Spark任务的执行流程

1. RDD的设计背景 在实际应用中&#xff0c;存在许多迭代式计算&#xff0c;这些应用场景的共同之处是&#xff0c;不同计算阶段之间会重用中间结果&#xff0c;即一个阶段的输出结果会作为下一个阶段的输入。但是&#xff0c;目前的MapReduce框架都是把中间结果写入到HDFS中&…