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

[深度学习]图像分类项目-食物分类

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

文章目录

  • 图像分类项目-食物分类(监督学习和半监督学习)
    • 项目介绍
    • 数据处理
      • 设定随机种子
      • 读取文件内容
      • 图像增广
      • 定义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()

相关文章:

[深度学习]图像分类项目-食物分类

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

Qt在ARM中,如何使用drmModeObjectSetProperty 设置 Plane 的 zpos 值

在 Qt 中直接使用 drmModeObjectSetProperty 设置 Plane 的 zpos 值需要结合 Linux DRM/KMS API 和 Qt 的底层窗口系统(如 eglfs 平台插件)。以下是详细步骤和代码示例: 1. 原理说明 DRM/KMS 基础: Plane:负责图层合成…...

springboot milvus search向量相似度查询 踩坑使用经验

1.前提提要:java的pom 版本为:2.4.9 milvus 版本是:2.4.13-hotfix 2.先来工具类方法 /*** 向量搜索* param client* param query* return*/public SearchResp search(NonNull MilvusClientV2 client, NonNull VectorCondition query) {final …...

BFS解决FloodFill算法

1.图像渲染 733. 图像渲染 - 力扣(LeetCode) 1.题目解析 有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。你也被给予三个整数 sr , sc 和 color 。你应该从像素 image[sr][sc] 开始对图像进行…...

计算机组成原理

计算机组成原理是计算机科学与技术领域的一门基础课程,它主要研究计算机硬件系统的结构、设计和工作原理。通过学习计算机组成原理,可以深入理解计算机是如何执行程序的,从最底层的角度了解计算机的工作机制。以下是计算机组成原理的一些核心…...

Spring Boot整合SSE实现消息推送:跨域问题解决与前后端联调实战

摘要 本文记录了一次完整的Spring Boot整合Server-Sent Events(SSE)实现实时消息推送的开发过程,重点分析前后端联调时遇到的跨域问题及解决方案。通过CrossOrigin注解的实际应用案例,帮助开发者快速定位和解决类似问题。 一、项…...

硅基流动:推理加速,告别“服务器繁忙,请稍后再试”

DeepSeek虽然一直热度高涨,但存在一个很直接的问题——“服务器繁忙,请稍后再试”。 一、介绍概况 硅基流动(SiliconFlow)是北京硅基流动科技有限公司推出的AI基础设施(AI Infra)平台,成立于202…...

腾讯云DNS和Lego工具结合使用,可以方便地为你的域名自动申请和续期SSL证书。

腾讯云DNS和Lego工具结合使用,可以方便地为你的域名自动申请和续期SSL证书。以下是具体步骤: 1. 准备工作 腾讯云账号:确保你有一个腾讯云账号,并且已经开通了DNS服务。域名:确保你拥有一个域名,并且已经…...

微服务 - 高级篇

微服务 - 高级篇 一、服务治理(一)服务注册与发现(二)负载均衡(三)服务熔断与降级 二、分布式事务(一)解决方案(二)最终一致性 三、性能优化(一&a…...

【Linux】线程基础

🔥个人主页:Quitecoder 🔥专栏:linux笔记仓 目录 01.背景知识02.线程概念简单使用线程线程调度成本更低 01.背景知识 OS进行内存管理,不是以字节为单位的,而是以内存块为单位的,默认大小为4kb&…...

WHAM 人体3d重建部署笔记 vitpose

目录 视频结果: docker安装说明: conda环境安装说明: 依赖项: 依赖库: 安装 mmpose,mmcv 下载模型权重: 算法原理, demo脚本 报错inference_top_down_pose_model: 测试命令: 视频结果: wham_smpl预测结果 git地址: GitHub - yohanshin/WHAM WHAM: Recons…...

netplan是如何操控systemd-networkd的? 笔记250324

netplan是如何操控systemd-networkd的? netplan通过以下方式操控systemd-networkd: 工作原理:netplan读取位于/etc/netplan/目录下的YAML格式的配置文件,这些配置文件描述了网络接口的配置。netplan会将这些配置文件解析并转换为systemd-ne…...

[学成在线]06-视频分片上传

上传视频 需求分析 教学机构人员进入媒资管理列表查询自己上传的媒资文件。 点击“媒资管理” 进入媒资管理列表页面查询本机构上传的媒资文件。 教育机构用户在"媒资管理"页面中点击 "上传视频" 按钮。 点击“上传视频”打开上传页面 选择要上传的文件…...

机器视觉场景应用中,有没有超景深的工业镜头

在机器视觉领域,确实存在具有超景深特性的工业镜头,这类镜头通过特殊的光学设计或技术手段,能够显著扩大清晰成像的纵向范围,从而满足复杂检测场景中对多平面物体清晰成像的需求。以下是相关技术要点及典型镜头类型: 1. 远心镜头 远心镜头是超景深镜头的典型代表,其特点包…...

初探 Dubbo Rust SDK打造现代微服务的新可能

一、背景故事:为什么要在微服务中用 Rust? 微服务世界曾是 Java 的天下,后来 Go 异军突起,如今,Rust 凭借其“高性能 安全 零成本抽象”的特性,正在逐步走入服务端核心舞台。 问题随之而来:…...

如何理解响应式编程

思考: 分析Netty与Reactor背压协调策略 用户的问题是关于如何在 Netty 和 Project Reactor 联合使用时处理背压问题,特别是当 Reactor 的处理速度跟不上 Netty 的事件产生速度时该怎么办。这是一个技术性很强的问题,涉及到 Netty 的非阻塞特…...

Python网络编程入门

一.Socket 简称套接字,是进程之间通信的一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行,进程之间要想进行网络通信需要Socket,Socket好比数据的搬运工~ 2个进程之间通过Socket进行相互通讯&a…...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例14,TableView15_14多功能组合的导出表格示例

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例14,TableView15_14多功…...

鸿蒙特效教程10-卡片展开/收起效果

鸿蒙特效教程10-卡片展开/收起效果 在移动应用开发中,卡片是一种常见且实用的UI元素,能够将信息以紧凑且易于理解的方式呈现给用户。 本教程将详细讲解如何在HarmonyOS中实现卡片的展开/收起效果,通过这个实例,你将掌握ArkUI中状…...

如何创建一个socket服务器?

1. 导入必要的库 首先,需要导入Python的socket库,它提供了创建和管理socket连接的功能。 python import socket 2. 创建服务器端socket 使用socket.socket()函数创建一个服务器端的socket对象,指定协议族(如socket.AF_INET表示…...

react自定义hook

自定义hook: 用来封装复用的逻辑,,自定义hook是以use开头的普通函数,,将组件中可复用的状态逻辑抽取到自定义的hook中,简化组件代码 常见自定义hook例子: 封装一个简单的计数器 import {useS…...

Android Compose 框架的状态与 ViewModel 的协同(collectAsState)深入剖析(二十一)

Android Compose 框架的状态与 ViewModel 的协同(collectAsState)深入剖析 一、引言 在现代 Android 应用开发中,构建响应式和动态的用户界面是至关重要的。Android Compose 作为新一代的声明式 UI 工具包,为开发者提供了一种简…...

系统与网络安全------网络应用基础(1)

资料整理于网络资料、书本资料、AI,仅供个人学习参考。 TCP/IP协议及配置 概述 TCP/IP协议族 计算机之间进行通信时必须共同遵循的一种通信规定 最广泛使用的通信协议的集合 包括大量Internet应用中的标准协议 支持跨网络架构、跨操作系统平台的数据通信 主机…...

linux常用指令(6)

今天我们继续学习一些linux常用指令,丰富我们linux基础知识,那么话不多说,来看. 1.cp指令 功能描述:拷贝文件到指定目录 基本语法:cp [选项] source dest 常用选项:-r:递归复制整个文件夹 拷贝文件: 拷贝文件夹&am…...

EasyUI数据表格中嵌入下拉框

效果 代码 $(function () {// 标记当前正在编辑的行var editorIndex -1;var data [{code: 1,name: 1,price: 1,status: 0},{code: 2,name: 2,price: 2,status: 1}]$(#dg).datagrid({data: data,onDblClickCell:function (index, field, value) {var dg $(this);if(field ! …...

【设计模式】单件模式

七、单件模式 单件(Singleton) 模式也称单例模式/单态模式,是一种创建型模式,用于创建只能产生 一个对象实例 的类。该模式比较特殊,其实现代码中没有用到设计模式中经常提起的抽象概念,而是使用了一种比较特殊的语法结构&#x…...

C++类与对象的第二个简单的实战练习-3.24笔记

哔哩哔哩C面向对象高级语言程序设计教程(118集全) 实战二 Cube.h #pragma once class Cube { private:double length;double width;double height; public:double area(void);double Volume(void);//bool judgement(double L1, double W1, double H1);…...

【视频】m3u8相关操作

1、视频文件转m3u8 1.1 常用命令 1)默认只保留 5 个ts文件 ffmpeg -i input.mp4 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls stream1.m3u82)去掉音频 -an,保留全部ts文件 ffmpeg -i input.mp4 -vf scale=640:480 -an -start_number 0 -hls_time 10 -hls_lis…...

G-Star 校园开发者计划·黑科大|开源第一课之 Git 入门

万事开源先修 Git。Git 是当下主流的分布式版本控制工具,在软件开发、文档管理等方面用处极大。它能自动记录文件改动,简化合并流程,还特别适合多人协作开发。学会 Git,就相当于掌握了一把通往开源世界的钥匙,以后参与…...

前端框架学习路径与注意事项

学习前端框架是一个系统化的过程,需要结合理论、实践和工具链的综合掌握。以下是学习路径的关键方面和注意事项: 一、学习路径的核心方面 1. 基础概念与核心思想 组件化开发:理解组件的作用(复用性、隔离性)、组件通信…...

Apache Hive:基于Hadoop的分布式数据仓库

Apache Hive 是一个基于 Apache Hadoop 构建的开源分布式数据仓库系统,支持使用 SQL 执行 PB 级大规模数据分析与查询。 主要功能 Apache Hive 提供的主要功能如下。 HiveServer2 HiveServer2 服务用于支持接收客户端连接和查询请求。 HiveServer2 支持多客户端…...

langgraph简单Demo3(画一个简单的图)

文章目录 画图简单解析再贴结果图 画图 from langgraph.graph import StateGraph, END from typing import TypedDict# 定义状态结构 # (刚入门可能不理解这是什么,可以理解为一个自定义的变量库,你的所有的入参出参都可以定义在这里) # 如下&#xff1…...

LCR 187. 破冰游戏(python3解法)

难度:简单 社团共有 num 位成员参与破冰游戏,编号为 0 ~ num-1。成员们按照编号顺序围绕圆桌而坐。社长抽取一个数字 target,从 0 号成员起开始计数,排在第 target 位的成员离开圆桌,且成员离开后从下一个成员开始计数…...

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

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

解决 Element UI 嵌套弹窗显示灰色的问题!!!

解决 Element UI 嵌套弹窗显示灰色的问题 🔍 问题描述 ❌ 在使用 Element UI 开发 Vue 项目时,遇到了一个棘手的问题:当在一个弹窗(el-dialog)内部再次打开另一个弹窗时,第二个弹窗会显示为灰色,影响用户体验。 问题…...

【大模型】DeepSeek攻击原理和效果解析

前几天看到群友提到一个现象,在试图询问知识库中某个人信息时,意外触发了DeepSeek的隐私保护机制,使模型拒绝回答该问题。另有群友提到,Ollama上有人发布过DeepSeek移除模型内置审查机制的版本。于是顺着这条线索,对相…...

AI对软件工程(software engineering)的影响在哪些方面?

AI对软件工程(software engineering)的影响是全方位且深远的,它不仅改变了传统开发流程,还重新定义了工程师的角色和软件系统的构建方式。以下是AI影响软件工程的核心维度: 一、开发流程的智能化重构 需求工程革命 • …...

K8S学习之基础四十五:k8s中部署elasticsearch

k8s中部署elasticsearch 安装并启动nfs服务yum install nfs-utils -y systemctl start nfs systemctl enable nfs.service mkdir /data/v1 -p echo /data/v1 *(rw,no_root_squash) >> /etc/exports exports -arv systemctl restart nfs创建运行nfs-provisioner需要的sa账…...

部署高可用PostgreSQL14集群

目录 基础依赖包安装 consul配置 patroni配置 vip-manager配置 pgbouncer配置 haproxy配置 验证 本文将介绍如何使用Patroni、Consul、vip-manager、Pgbouncer、HaProxy组件来部署一个3节点的高可用、高吞吐、负载均衡的PostgresSQL集群(14版本)&…...

爬虫案例-爬取某站视频

文章目录 1、下载FFmpeg2、爬取代码3、效果图 1、下载FFmpeg FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。 点击下载: ffmpeg 安装并配置 FFmpeg 步骤: 1.下载 FFmpeg: 2.访问 FFmpeg 官网。 3.选择 Wi…...

PV操作指南

🔥《PV操作真香指南——看完就会的祖传攻略》🍵 一、灵魂三问❓ Q1:PV是个啥? • 💡 操作系统界的红绿灯:控制进程"何时走/何时停"的神器 • 🧱 同步工具人:解决多进程&q…...

计算机考研复试机试-考前速记

考前速记 知识点 1. 链表篇 1. 循环链表报数3&#xff0c;输出最后一个报数编号 #include <iostream> using namespace std;typedef struct Node {int no;struct Node* next; }Node, *NodeList;void createNodeListTail(NodeList&L, int n) {L (Node*)malloc(siz…...

【漏洞复现】Next.js中间件权限绕过漏洞 CVE-2025-29927

什么是Next.js&#xff1f; Next.js 是由 Vercel 开发的基于 React 的现代 Web 应用框架&#xff0c;具备前后端一体的开发能力&#xff0c;广泛用于开发 Server-side Rendering (SSR) 和静态站点生成&#xff08;SSG&#xff09;项目。Next.js 支持传统的 Node.js 模式和基于边…...

路由选型终极对决:直连/静态/动态三大类型+华为华三思科配置差异,一张表彻底讲透!

路由选型终极对决&#xff1a;直连/静态/动态三大类型华为华三思科配置差异&#xff0c;一张表彻底讲透&#xff01; 一、路由&#xff1a;互联网世界的导航系统二、路由类型深度解析三者的本质区别 三、 解密路由表——网络设备的GPS华为&#xff08;Huawei&#xff09;华三&a…...

【AI】知识蒸馏-简单易懂版

1 缘起 最近要准备升级材料&#xff0c;里面有一骨碌是介绍LLM相关技术的&#xff0c;知识蒸馏就是其中一个点&#xff0c; 不过&#xff0c;只分享了蒸馏过程&#xff0c;没有讲述来龙去脉&#xff0c;比如没有讲解Softmax为什么引入T、损失函数为什么使用KL散度&#xff0c;…...

uniapp运行到支付宝开发者工具

使用uniapp编写专有钉钉和浙政钉出现的样式问题 在支付宝开发者工具中启用2.0构建的时候&#xff0c;在开发工具中页面样式正常 但是在真机调试和线上的时候不正常 页面没问题&#xff0c;所有组件样式丢失 解决 在manifest.json mp-alipay中加入 "styleIsolation&qu…...

STM32学习笔记之keil使用记录

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…...

卷积神经网络 - 参数学习

本文我们通过两个简化的例子&#xff0c;展示如何从前向传播、损失计算&#xff0c;到反向传播推导梯度&#xff0c;再到参数更新&#xff0c;完整地描述卷积层的参数学习过程。 一、例子一 我们构造一个非常简单的卷积神经网络&#xff0c;其结构仅包含一个卷积层和一个输出…...

【加密社】币圈合约交易量监控,含TG推送

首先需要在币安的开发者中心去申请自己的BINANCE_API_KEY和BINANCE_API_SECRET 有了这个后&#xff0c;接着去申请一个TG的机器人token和对话chatid 如果不需要绑定tg推送的话&#xff0c;可以忽略这步 接下来直接上代码 引用部分 from os import system from binance.c…...

大模型概述

大模型属于Foundation Model&#xff08;基础模型&#xff09;[插图]&#xff0c;是一种神经网络模型&#xff0c;具有参数量大、训练数据量大、计算能力要求高、泛化能力强、应用广泛等特点。与传统人工智能模型相比&#xff0c;大模型在参数规模上涵盖十亿级、百亿级、千亿级…...