网站建设单词/百度惠生活商家怎么入驻

网站建设单词,百度惠生活商家怎么入驻,有哪些做留学资讯的网站,优书网有官方app吗图像分类项目-食物分类(监督学习和半监督学习) 文章目录 图像分类项目-食物分类(监督学习和半监督学习)项目介绍数据处理设定随机种子读取文件内容图像增广定义Dataset类 模型定义迁移学习 定义超参Adam和AdamW 训练过程半监督学习定义Dataset类模型定义定义超参训练过程 项目介…

图像分类项目-食物分类(监督学习和半监督学习)

文章目录

  • 图像分类项目-食物分类(监督学习和半监督学习)
    • 项目介绍
    • 数据处理
      • 设定随机种子
      • 读取文件内容
      • 图像增广
      • 定义Dataset类
    • 模型定义
      • 迁移学习
    • 定义超参
      • Adam和AdamW
    • 训练过程
    • 半监督学习
      • 定义Dataset类
      • 模型定义
      • 定义超参
      • 训练过程

项目介绍

image-20250214102822207

数据处理

设定随机种子

由于神经网络的训练具有随机性,为了保证之前得到的好的训练效果可以得到复现,设定随机种子,让训练过程中的随机行为每次训练都是相同。

def seed_everything(seed):torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed)torch.backends.cudnn.benchmark = Falsetorch.backends.cudnn.deterministic = Truerandom.seed(seed)np.random.seed(seed)os.environ['PYTHONHASHSEED'] = str(seed)
#################################################################
seed_everything(0)
###############################################

读取文件内容

进行数据处理前,需要了解数据的形式训练集中,有标签的数据按照11类分别存放在11个文件夹中,因此要循环依次读取这11个文件夹的内容:

image-20250214104855956

首先从文件夹中读出每张图片和对应标签(读取的是带标签的数据):

HW = 224def read_file(path):for i in tqdm(range(11)):file_dir = path + "/%02d" % ifile_list = os.listdir(file_dir)  # 列出文件夹下所有文件名字xi = np.zeros((len(file_list), HW, HW, 3), dtype=np.uint8)  # 每个元素存一个图片,图片为整形类型yi = np.zeros(len(file_list))for j, img_name in enumerate(file_list):img_path = os.path.join(file_dir, img_name)  # 拼接地址img = Image.open(img_path)  # 打开图片img = img.resize((HW, HW))  # 修改成模型接受的大小xi[j, ...] = imgyi[j] = iif i == 0:#第一个数据赋值X = xiY = yielse:#后续数据尾插X = np.concatenate((X, xi), axis=0)Y = np.concatenate((Y, yi), axis=0)print("读到了%d个数据" % len(Y))return X, Y

图像增广

模型对训练使用的图片数据有好的效果,但是如果对图片数据进行一定的变化,模型的效果就变差,因此在训练时,不仅使用原图片训练,还要对图片进行旋转,放大裁切等图像操作,将原图片和操作后的图片都作为训练数据,也就是图像增广,让模型的效果更好。

image-20250221112528853

train_transform = transforms.Compose(#定义训练集增广方式[transforms.ToPILImage(), #224,224,3模型:3,224,244transforms.RandomResizedCrop(224),#随机放大裁切transforms.RandomRotation(50),#50度以内随机旋转transforms.ToTensor()#模型运行的数据类型为张量]
)val_transform = transforms.Compose(#验证集不需要增广[transforms.ToPILImage(),  # 224,224,3模型:3,224,244transforms.ToTensor()  # 模型运行的数据类型为张量]
)

定义Dataset类

class food_Dataset(Dataset):#继承Dateset类def __init__(self, path, mode="train"):self.X, self.Y = read_file(path)self.Y = torch.LongTensor(self.Y)#图片数据类型为整形if mode == "train":#根据模式选择增广类型self.transform = train_transformelse:self.transform = val_transformdef __getitem__(self, item):return self.transform(self.X[item]), self.Y[item] #使用图片增广def __len__(self):return len(self.Y)

模型定义

在模型中设定一些卷积、归一化、池化、激活函数对数据进行特征提取。

class myModel(nn.Module):def __init__(self, num_class):super(myModel, self).__init__()#3*224*224->512*7*7->拉直->全连接分类self.conv1 = nn.Conv2d(3, 64, 3, 1, 1) #3厚度,64个卷积核,卷积核大小3,padding为1,步长为1 64*224*224self.bn1 = nn.BatchNorm2d(64)#归一化self.relu = nn.ReLU()self.pool1 = nn.MaxPool2d(2)   #64*112*112self.layer1 = nn.Sequential(nn.Conv2d(64, 128, 3, 1, 1),    # 128*112*112nn.BatchNorm2d(128),nn.ReLU(),nn.MaxPool2d(2)   #128*56*56)self.layer2 = nn.Sequential(nn.Conv2d(128, 256, 3, 1, 1),nn.BatchNorm2d(256),nn.ReLU(),nn.MaxPool2d(2)   #256*28*28)self.layer3 = nn.Sequential(nn.Conv2d(256, 512, 3, 1, 1),nn.BatchNorm2d(512),nn.ReLU(),nn.MaxPool2d(2)   #512*14*14)self.pool2 = nn.MaxPool2d(2)    #512*7*7self.fc1 = nn.Linear(25088, 1000)   #25088->1000self.relu2 = nn.ReLU()self.fc2 = nn.Linear(1000, num_class)  #1000-11def forward(self, x):#使用定义的模型进行前向过程x = self.conv1(x)x = self.bn1(x)x = self.relu(x)x = self.pool1(x)x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)x = self.pool2(x)x = x.view(x.size()[0], -1) #拉直,x.size(0) 就是批量大小(batch_size),表示你有多少个样本输入到模型中。-1 是自动计算剩下的维度以便将数据展平。x = self.fc1(x)x = self.relu2(x)x = self.fc2(x)return x

迁移学习

良好的模型是需要大量的数据训练得到的,由于我们设备加上数据量的限制训练出来的模型效果不会特别好,甚至预测效果接近随机预测,因此我们要进行迁移学习。简单来说,**迁移学习就是使用大佬们用大量数据训练出来的现成模型,**由于大佬的模型经过训练后有很好的特征提取效果,因此我们只需要使用大佬的模型然后加上分类头作为训练的模型即可。

image-20250221105346896

预训练是指在无关当前任务的模型训练,迁移学习使用的模型就是进行过预训练的模型,迁移学习时可以进行线性探测微调,线性探测就是在训练中不进行参数的调整,完全信任迁移学习使用的模型,微调就是在训练过程中会进行参数调整。

迁移学习时可选择只使用架构和使用架构和参数,虽然迁移学习使用的架构很优秀但是参数是更加重要的部分,因此使用架构和参数的效果要更好,要想使用迁移学习的预训练参数要保持架构一致。

from torchvision.models import resnet18#导入模型
model = resnet18(pretrained=True)#使用架构和参数
in_fetures = model.fc.in_features#获取模型的特征提取后的输出维度
model.fc = nn.Linear(in_fetures, 11)#全连接分类头

定义超参

定义学习率、损失函数、优化器、训练轮次等超参数。

Adam和AdamW

Adam优化器不仅考虑当前点的梯度还考虑之前的梯度,并且会自动更改学习率,由于参数更改时要减去学习率×梯度,当这个值过大时,Adam会自动更改学习率,AdamW是在Adam的基础上增加了权重衰减使得模型曲线更加平滑。

训练过程

def train_val(model, train_loader, val_loader, device, epochs, optimizer, loss, save_path):model = model.to(device)plt_train_loss = [] #记录所有轮次的LOSSplt_val_loss = []plt_train_acc = [] #记录准确率plt_val_acc = []max_acc = 0.0for epoch in range(epochs): #开始训练train_loss = 0.0val_loss = 0.0train_acc = 0.0#用准确率表示模型效果val_acc = 0.0start_time = time.time()model.train() #模型调为训练模式,有时训练模式和测试模式的模型不同for batch_x, batch_y in train_loader:x, target = batch_x.to(device), batch_y.to(device)pred = model(x)train_bat_loss = loss(pred, target) #获取一批数据的LOSStrain_bat_loss.backward() #梯度回传optimizer.step()#更新模型optimizer.zero_grad()train_loss += train_bat_loss.cpu().item() #将gpu上的张量数据放到cpu上取出数据计算,累加记录本轮LOSStrain_acc += np.sum(np.argmax(pred.detach().cpu().numpy(), axis=1) == target.cpu().numpy())#记录预测对的数量plt_train_loss.append(train_loss / train_loader.__len__()) #除以轮次数,得到每个轮次的LOSS平均值plt_train_acc.append(train_acc/train_loader.dataset.__len__()) #记录准确率,model.eval()#调为验证模式with torch.no_grad():#所有模型中的张量计算都积攒梯度,而验证时不需要梯度for batch_x, batch_y in val_loader:x, target = batch_x.to(device), batch_y.to(device)pred = model(x)val_bat_loss = loss(pred, target)val_loss += val_bat_loss.cpu().item()val_acc += np.sum(np.argmax(pred.detach().cpu().numpy(), axis=1) == target.cpu().numpy())  # 记录预测对的数量plt_val_loss.append(val_loss / val_loader.dataset.__len__())plt_val_acc.append(val_acc/val_loader.dataset.__len__()) #记录准确率,if val_acc > max_acc: #如果当前模型效果更好,进行记录torch.save(model, save_path)max_acc = val_loss#训练效果打印print('[%03d/%03d] %2.2f sec(s) TrainLoss : %.6f | valLoss: %.6f Trainacc : %.6f | valacc: %.6f' % \(epoch, epochs, time.time() - start_time, plt_train_loss[-1], plt_val_loss[-1], plt_train_acc[-1],plt_val_acc[-1]))  # 打印训练结果。 注意python语法, %2.2f 表示小数位为2的浮点数, 后面可以对应。plt.plot(plt_train_loss)plt.plot(plt_val_loss)plt.title("loss")plt.legend(["train", "val"])plt.show()plt.plot(plt_train_acc)plt.plot(plt_val_acc)plt.title("loss")plt.legend(["train", "val"])plt.show()

半监督学习

监督学习是指每个训练样本都有对应的标签,模型通过学习这些标注数据训练,目标是让模型能够根据新的输入数据预测正确的标签。

半监督学习是介于监督学习和无监督学习之间的一种方法。在半监督学习中,训练数据包含大量的未标注数据和少量的标注数据。模型利用少量的标注数据来进行学习,同时也借助未标注数据来进一步提高模型的性能。

  • 模型首先使用标注数据进行训练。
  • 模型的效果达到一定程度后,用训练得到的模型对未标注数据进行预测。
  • 若预测结果结果的置信值(成功率)达到一定值后,将预测结果(伪标签)添加到训练数据集中。

image-20250221121136819

为了加入半监督学习,对监督学习的代码进行修改。

定义Dataset类

class food_Dataset(Dataset):def __init__(self, path, mode="train"):self.mode = modeif mode == "semi":#若为半监督模式,数据只有X,没有标签Yself.X = self.read_file(path)else:self.X, self.Y = self.read_file(path)self.Y = torch.LongTensor(self.Y)  #标签转为长整形if mode == "train":#训练模式需要图片增广等操作self.transform = train_transformelse:#非训练模式,包括半监督模式下,只需要让数据转换成符合模型输入的格式即可self.transform = val_transformdef read_file(self, path):#读取数据函数if self.mode == "semi":file_list = os.listdir(path)xi = np.zeros((len(file_list), HW, HW, 3), dtype=np.uint8)# 列出文件夹下所有文件名字for j, img_name in enumerate(file_list):img_path = os.path.join(path, img_name)img = Image.open(img_path)img = img.resize((HW, HW))xi[j, ...] = imgprint("读到了%d个数据" % len(xi))return xielse:for i in tqdm(range(11)):file_dir = path + "/%02d" % ifile_list = os.listdir(file_dir)xi = np.zeros((len(file_list), HW, HW, 3), dtype=np.uint8)yi = np.zeros(len(file_list), dtype=np.uint8)# 列出文件夹下所有文件名字for j, img_name in enumerate(file_list):img_path = os.path.join(file_dir, img_name)img = Image.open(img_path)img = img.resize((HW, HW))xi[j, ...] = imgyi[j] = iif i == 0:X = xiY = yielse:X = np.concatenate((X, xi), axis=0)Y = np.concatenate((Y, yi), axis=0)print("读到了%d个数据" % len(Y))return X, Ydef __getitem__(self, item):if self.mode == "semi":return self.transform(self.X[item]), self.X[item]#前者为为了输入模型进行转换的X用于训练得到伪标签,后者为原始数据X用于加入半监督数据集else:return self.transform(self.X[item]), self.Y[item]def __len__(self):return len(self.X)class semiDataset(Dataset):#半监督数据集Dataset类def __init__(self, no_label_loder, model, device, thres=0.99):#传入无标签数据,预测模型,置信度x, y = self.get_label(no_label_loder, model, device, thres)if x == []:#如果预测得到的伪标签都不符合要求,如置信度低,导致半监督数据集为空进行标记self.flag = Falseelse:self.flag = Trueself.X = np.array(x)self.Y = torch.LongTensor(y)self.transform = train_transform#得到的半监督数据集同样用于模型训练def get_label(self, no_label_loder, model, device, thres):#给半监督数据打标签model = model.to(device)pred_prob = []#记录预测类型中最高概率labels = []#记录最高概率对应的标签x = []y = []soft = nn.Softmax()with torch.no_grad():#只要通过模型就会积攒梯度,只要不进行模型训练调整,积攒的梯度就没用for bat_x, _ in no_label_loder:bat_x = bat_x.to(device)pred = model(bat_x)pred_soft = soft(pred)pred_max, pred_value = pred_soft.max(1)#维度1为横向,取出最高概率和其对应的标签,由于loader中一个元素是一批数据,因此pred_max和pred_value的一个元素中包含对应批数个值pred_prob.extend(pred_max.cpu().numpy().tolist())labels.extend(pred_value.cpu().numpy().tolist())for index, prob in enumerate(pred_prob):if prob > thres:#大于置信度加入半监督数据集x.append(no_label_loder.dataset[index][1])   #调用到原始的getitem,因为要加入半监督数据集y.append(labels[index])return x, ydef __getitem__(self, item):return self.transform(self.X[item]), self.Y[item]def __len__(self):return len(self.X)def get_semi_loader(no_label_loder, model, device, thres):#获取半监督数据集semiset = semiDataset(no_label_loder, model, device, thres)if semiset.flag == False:return Noneelse:semi_loader = DataLoader(semiset, batch_size=16, shuffle=False)return semi_loader

模型定义

加入半监督学习只需要复用监督学习的训练模型进行预测即可。

定义超参

加入半监督学习要额外定义包括置信度的超参。

训练过程

def train_val(model, train_loader, val_loader, no_label_loader, device, epochs, optimizer, loss, thres, save_path):model = model.to(device)semi_loader = Noneplt_train_loss = []plt_val_loss = []plt_train_acc = []plt_val_acc = []max_acc = 0.0for epoch in range(epochs):train_loss = 0.0val_loss = 0.0train_acc = 0.0val_acc = 0.0semi_loss = 0.0#半监督数据集LOSSsemi_acc = 0.0#对半监督数据集的预测准确率start_time = time.time()model.train()#训练模式for batch_x, batch_y in train_loader:#使用有标签训练集训练x, target = batch_x.to(device), batch_y.to(device)pred = model(x)train_bat_loss = loss(pred, target)train_bat_loss.backward()optimizer.step()  # 更新参数 之后要梯度清零否则会累积梯度optimizer.zero_grad()train_loss += train_bat_loss.cpu().item()train_acc += np.sum(np.argmax(pred.detach().cpu().numpy(), axis=1) == target.cpu().numpy())plt_train_loss.append(train_loss / train_loader.__len__())plt_train_acc.append(train_acc/train_loader.dataset.__len__()) #记录准确率,if semi_loader!= None:#若半监督数据集非空,使用半监督数据集进行训练for batch_x, batch_y in semi_loader:x, target = batch_x.to(device), batch_y.to(device)pred = model(x)semi_bat_loss = loss(pred, target)semi_bat_loss.backward()optimizer.step()  # 更新参数 之后要梯度清零否则会累积梯度,因为下一轮数据要重新计算梯度optimizer.zero_grad()semi_loss += train_bat_loss.cpu().item()semi_acc += np.sum(np.argmax(pred.detach().cpu().numpy(), axis=1) == target.cpu().numpy())print("半监督数据集的训练准确率为", semi_acc/train_loader.dataset.__len__())model.eval()with torch.no_grad():for batch_x, batch_y in val_loader:x, target = batch_x.to(device), batch_y.to(device)pred = model(x)val_bat_loss = loss(pred, target)val_loss += val_bat_loss.cpu().item()val_acc += np.sum(np.argmax(pred.detach().cpu().numpy(), axis=1) == target.cpu().numpy())plt_val_loss.append(val_loss / val_loader.dataset.__len__())plt_val_acc.append(val_acc / val_loader.dataset.__len__())if epoch%3 == 0 and plt_val_acc[-1] > 0.6:#将模型训练至一定能力后,再进行半监督学习semi_loader = get_semi_loader(no_label_loader, model, device, thres)if val_acc > max_acc:torch.save(model, save_path)max_acc = val_lossprint('[%03d/%03d] %2.2f sec(s) TrainLoss : %.6f | valLoss: %.6f Trainacc : %.6f | valacc: %.6f' % \(epoch, epochs, time.time() - start_time, plt_train_loss[-1], plt_val_loss[-1], plt_train_acc[-1], plt_val_acc[-1]))  # 打印训练结果。 注意python语法, %2.2f 表示小数位为2的浮点数, 后面可以对应。plt.plot(plt_train_loss)plt.plot(plt_val_loss)plt.title("loss")plt.legend(["train", "val"])plt.show()plt.plot(plt_train_acc)plt.plot(plt_val_acc)plt.title("acc")plt.legend(["train", "val"])plt.show()

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

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

相关文章

5.go切片和map

切片的概念 数组和切片相比较切片的长度是不固定的,可以追加元素,在追加时可能会使切片的容量增大,所以可以将切片理解成 "动态数组",但是,它不是数组,而是构建在数组基础上的更高级的数据结构。…

云原生算力引擎:分布式推理的流体动力学

引言:算力黑洞的引力扰动 OpenAI推理集群日处理4.5亿次请求,CUDA 12.3实现μs级张量切换。特斯拉Dojo超算芯片间延迟0.5ns,阿里巴巴PAI平台节省58%训练时长。HuggingFace模型库下载量突破3亿次,AWS Inferentia芯片能效比提升8倍。…

Cesium 自定义路径导航材质

cesium 自定义路径导航纹理图片随便更换,UI 提供设计图片即可达到效果; 打开小马的weix 关注下 搜索“技术链” 回复关键词《《路径》》获取原始代码; 拿到就能用轻松解决!帮忙点个关注吧!

3月25号

添加图片的一些例子: // 创建一个二维数组,用来管理数据int[][] data new int[4][4]; // 记录空白方块的位置int x0;int y0; // 定义一个变量,记录当前展示图片的路径String path"E:\\java\\jigsawgame\\路飞\\路飞"; // 加载图片细节: // …

【机器学习】什么是支持向量机?

什么是支持向量机? 支持向量机(SVM,Support Vector Machine)是一种强大的机器学习算法,常用于分类问题,也可以用于回归问题。它的核心思想是通过找到一个最佳的“超平面”来将不同类别的数据分开&#xff…

10分钟打造专属AI助手!ToDesk云电脑/顺网云/海马云操作DeepSeek哪家强?

文章目录 一、引言云计算平台概览ToDesk云电脑:随时随地用上高性能电脑 二 .云电脑初体验DeekSeek介绍版本参数与特点任务类型表现 1、ToDesk云电脑2、顺网云电脑3、海马云电脑 三、DeekSeek本地化实操和AIGC应用1. ToDesk云电脑2. 海马云电脑3、顺网云电脑 四、结语…

卡特兰数在数据结构上面的运用

原理 Catalan数是一个数列,其第n项表示n个不同结点可以构成的二叉排序树的数量。Catalan数的第n项公式为:  其中,是组合数,表示从2n个元素中选择n个元素的组合数。 Catalan数的原理可以通过以下方式理解&…

影视后期工具学习之PR(中)

pr剪辑之旅----声音设计 第五课 镜头语言和绿幕抠像 超级键效果(超级键通过简单的吸管取色和参数调整,即可实现专业级抠像与合成效果。无论是绿幕替换背景,还是创意双重曝光,都能轻松驾驭。建议结合「Alpha 通道」视图观察透明区域,逐步优化细节,最终导出高质量视频。)…

使用BootStrap 3的原创的模态框组件,没法弹出!估计是原创的bug

最近在给客户开发一个CRM系统,其中用到了BOOTSTRAP的模态框。版本是3。由于是刚开始用该框架。所以在正式部署到项目中前,需要测试一下,找到框架中的如下部分。需要说明的是。我用的asp.net mvc框架开发。测试也是在asp.net mvc环境下。 复制…

Camera2 与 CameraX 闲谈

目录 📂 前言 1. 🔱 Camera2 2. 🔱 CameraX 3. 🔱 Camera2 与 CameraX 1)使用复杂度与开发效率 2)控制能力与应用场景 3)设备兼容性与稳定性 4)更新与维护 4. &#x1f4a0…

【大语言模型_8】vllm启动的模型通过fastapi封装增加api-key验证

背景: vllm推理框架启动模型不具备api-key验证。需借助fastapi可以实现该功能 代码实现: rom fastapi import FastAPI, Header, HTTPException, Request,Response import httpx import logging# 创建 FastAPI 应用 app FastAPI() logging.basicConfig(…

基于SpringBoot的名著阅读网站

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

Gitee上库常用git命令

Gitee上库常用git命令 1、Fork 项目2、个人仓库修改3、追加提交4、创建PR5、多笔commit合一 1、Fork 项目 2、个人仓库修改 git add . // -s 表示自动添加邮箱签名信息,-m表示其后跟随commit描述 git commit -sm “add transition freeze” git push origin [目标…

Java 大视界 -- Java 大数据在智慧农业精准灌溉与施肥决策中的应用(144)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

Redux,React-redux。基础

状态管理库,集中式存储状态,管理状态 ✅ redux //简单实现 redux源码 export function createStore(reducer) {// reducer由用户编写, 必须是一个函数,dispatch的时候,reducer要执行if (typeof reducer ! function) t…

5.2 位运算专题:LeetCode 268. 丢失的数字

1. 题目链接 LeetCode 268. 丢失的数字 2. 题目描述 给定一个包含 [0, n] 范围内 n 个不同整数的数组 nums(实际长度为 n),找出数组中缺失的那个数字。 示例: 输入:nums [3,0,1] → 输出:2(…

【Android】VehiclePropertyAccess引起CarService崩溃

VehiclePropertyAccess引起CarService崩溃 VehiclePropertyAccess VehiclePropertyAccess属性,用于定义车辆属性的访问权限。权限包括 读:READ,只可以读取,不能写入。 VehiclePropertyAccess:READ写:WRITE&#xf…

SpringCloud配置中心:Config Server与配置刷新机制

文章目录 引言一、Config Server基础架构1.1 Server端配置1.2 配置文件命名规则 二、Config Client配置2.1 Client端配置2.2 配置注入与使用 三、配置刷新机制3.1 手动刷新配置3.2 使用Spring Cloud Bus实现自动刷新3.3 配置仓库Webhook自动触发刷新 四、高级配置管理策略4.1 配…

PyTorch生成式人工智能实战:从零打造创意引擎

PyTorch生成式人工智能实战:从零打造创意引擎 0. 前言1. 生成式人工智能1.1 生成式人工智能简介1.2 生成式人工智能技术 2. Python 与 PyTorch2.1 Python 编程语言2.2 PyTorch 深度学习库 3. 生成对抗网络3.1 生成对抗网络概述3.2 生成对抗网络应用 4. Transformer4…

【计算机网络】-计算机网络期末复习题复习资料

一、计算机网络体系结构(800字) 1. OSI参考模型 七层结构:物理层→数据链路层→网络层→传输层→会话层→表示层→应用层 各层核心功能: 物理层:比特流传输(如RJ45、光纤接口) 数据链路层&…