CV09_深度学习模块之间的缝合教学(4)--调参

深度学习就像炼丹。炉子就是模型,火候就是那些参数,材料就是数据集。

1.1 参数有哪些

调参调参,参数到底是哪些参数?

1.网络相关的参数:(1)神经网络网络层

(2)隐藏层的神经元个数等

(3)卷积核的数量

(4)损失层函数的选择

2.数据预处理的相关参数:(1)batch normalization(2)等等

3.超参数:(1)激活函数(2)初始化(凯明初始化等)

(3)梯度下降(SGD、Adam)

(4)epoch (5)batch size

(6)学习率lr (7)衰减函数、正则化等

1.2 常见的情况及原因

1.通常是在网络训练的结果:(1)过拟合----样本数量太少了

(2)欠拟合----样本多但模型简单

(3)拟合,但是在上下浮动(震荡)

(4)恰好拟合

(5)模型不收敛

1.3 解决方法

(1)过拟合----数据增强、早停法、drop out、降低学习率、调整epoch

(2)欠拟合----加深层数、尽量用非线性的激活函数如relu

(3)拟合但震荡----降低数据增强的程度、学习率

(4)

(5)模型不收敛----数据集有问题、网络模型有问题

1.4 调参的过程

1.搭建网络模型

2.先用小样本进行尝试模型效果

3.根据小样本的效果,进行调参,包括分析损失。

1.5 代码(CPU训练)

# Author:SiZhen
# Create: 2024/7/14
# Description: 调参练习-以手写数字集为例import  torch
import torch.nn as nn
import torchvision
import torch.utils
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
#设置超参数
from torch import optim
from torch.nn import initbatch_size = 64
hidden_size = 128
learning_rate = 0.001
num_epoch = 10#将图片进行预处理转换成pytorch张量
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,),(0.5,),)]) #mnist是单通道,所以括号内只有一个0.5#下载训练集
train_set = torchvision.datasets.MNIST(root="./data",train=True,download=True,transform=transform)#下载测试集
test_set = torchvision.datasets.MNIST(root="./data",train=False,download=True,transform=transform)#加载数据集
train_loader= torch.utils.data.DataLoader(train_set,batch_size=batch_size,shuffle=True)test_loader = torch.utils.data.DataLoader(test_set,batch_size=batch_size,shuffle=False)#测试不shuffleinput_size = 784 #mnist,28x28像素
num_classes = 10class SEAttention(nn.Module):# 初始化SE模块,channel为通道数,reduction为降维比率def __init__(self, channel=1, reduction=8):super().__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)  # 自适应平均池化层,将特征图的空间维度压缩为1x1self.fc = nn.Sequential(  # 定义两个全连接层作为激励操作,通过降维和升维调整通道重要性nn.Linear(channel, channel // reduction, bias=False),  # 降维,减少参数数量和计算量nn.ReLU(inplace=True),  # ReLU激活函数,引入非线性nn.Linear(channel // reduction, channel, bias=False),  # 升维,恢复到原始通道数nn.Sigmoid(),  # Sigmoid激活函数,输出每个通道的重要性系数)# 权重初始化方法def init_weights(self):for m in self.modules():  # 遍历模块中的所有子模块if isinstance(m, nn.Conv2d):  # 对于卷积层init.kaiming_normal_(m.weight, mode='fan_out')  # 使用Kaiming初始化方法初始化权重if m.bias is not None:init.constant_(m.bias, 0)  # 如果有偏置项,则初始化为0elif isinstance(m, nn.BatchNorm2d):  # 对于批归一化层init.constant_(m.weight, 1)  # 权重初始化为1init.constant_(m.bias, 0)  # 偏置初始化为0elif isinstance(m, nn.Linear):  # 对于全连接层init.normal_(m.weight, std=0.001)  # 权重使用正态分布初始化if m.bias is not None:init.constant_(m.bias, 0)  # 偏置初始化为0# 前向传播方法def forward(self, x):b, c, _, _ = x.size()  # 获取输入x的批量大小b和通道数cy = self.avg_pool(x).view(b, c)  # 通过自适应平均池化层后,调整形状以匹配全连接层的输入y = self.fc(y).view(b, c, 1, 1)  # 通过全连接层计算通道重要性,调整形状以匹配原始特征图的形状return x * y.expand_as(x)  # 将通道重要性系数应用到原始特征图上,进行特征重新校准
import torch
import torch.nn as nn
from torch.nn import Softmax# 定义一个无限小的矩阵,用于在注意力矩阵中屏蔽特定位置
def INF(B, H, W):return -torch.diag(torch.tensor(float("inf")).repeat(H), 0).unsqueeze(0).repeat(B * W, 1, 1)class CrissCrossAttention(nn.Module):""" Criss-Cross Attention Module"""def __init__(self, in_dim):super(CrissCrossAttention, self).__init__()# Q, K, V转换层self.query_conv = nn.Conv2d(in_channels=in_dim, out_channels=in_dim // 8, kernel_size=1)self.key_conv = nn.Conv2d(in_channels=in_dim, out_channels=in_dim // 8, kernel_size=1)self.value_conv = nn.Conv2d(in_channels=in_dim, out_channels=in_dim, kernel_size=1)# 使用softmax对注意力分数进行归一化self.softmax = Softmax(dim=3)self.INF = INF# 学习一个缩放参数,用于调节注意力的影响self.gamma = nn.Parameter(torch.zeros(1))def forward(self, x):m_batchsize, _, height, width = x.size()# 计算查询(Q)、键(K)、值(V)矩阵proj_query = self.query_conv(x)proj_query_H = proj_query.permute(0, 3, 1, 2).contiguous().view(m_batchsize * width, -1, height).permute(0, 2, 1)proj_query_W = proj_query.permute(0, 2, 1, 3).contiguous().view(m_batchsize * height, -1, width).permute(0, 2, 1)proj_key = self.key_conv(x)proj_key_H = proj_key.permute(0, 3, 1, 2).contiguous().view(m_batchsize * width, -1, height)proj_key_W = proj_key.permute(0, 2, 1, 3).contiguous().view(m_batchsize * height, -1, width)proj_value = self.value_conv(x)proj_value_H = proj_value.permute(0, 3, 1, 2).contiguous().view(m_batchsize * width, -1, height)proj_value_W = proj_value.permute(0, 2, 1, 3).contiguous().view(m_batchsize * height, -1, width)# 计算垂直和水平方向上的注意力分数,并应用无穷小掩码屏蔽自注意energy_H = (torch.bmm(proj_query_H, proj_key_H) + self.INF(m_batchsize, height, width)).view(m_batchsize, width, height, height).permute(0, 2, 1, 3)energy_W = torch.bmm(proj_query_W, proj_key_W).view(m_batchsize, height, width, width)# 在垂直和水平方向上应用softmax归一化concate = self.softmax(torch.cat([energy_H, energy_W], 3))# 分离垂直和水平方向上的注意力,应用到值(V)矩阵上att_H = concate[:, :, :, 0:height].permute(0, 2, 1, 3).contiguous().view(m_batchsize * width, height, height)att_W = concate[:, :, :, height:height + width].contiguous().view(m_batchsize * height, width, width)# 计算最终的输出,加上输入x以应用残差连接out_H = torch.bmm(proj_value_H, att_H.permute(0, 2, 1)).view(m_batchsize, width, -1, height).permute(0, 2, 3, 1)out_W = torch.bmm(proj_value_W, att_W.permute(0, 2, 1)).view(m_batchsize, height, -1, width).permute(0, 2, 1, 3)return self.gamma * (out_H + out_W) + xclass Net(nn.Module):def __init__(self, input_size, hidden_size, num_classes):super(Net, self).__init__()self.fc1 = nn.Linear(input_size, hidden_size)self.relu = nn.ReLU()self.fc2 = nn.Linear(hidden_size, num_classes)self.conv1 =nn.Conv2d(1,64,kernel_size=1)self.se = SEAttention(channel=1)self.cca = CrissCrossAttention(64)self.conv2 = nn.Conv2d(64,1,kernel_size=1)def forward(self, x):x = self.se(x)x = self.conv1(x)x = self.cca(x)x = self.conv2(x)out = self.fc1(x.view(-1, input_size))out = self.relu(out)out = self.fc2(out)return outmodel = Net(input_size,hidden_size,num_classes)
criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(),lr=learning_rate)train_loss_list = []
test_loss_list = []#训练
total_step = len(train_loader)
for epoch in range(num_epoch):for i,(images,labels) in enumerate(train_loader):outputs = model(images) #获取模型分类后的结果loss = criterion(outputs,labels) #计算损失optimizer.zero_grad() #反向传播前,梯度清零loss.backward() #反向传播optimizer.step() #更新参数train_loss_list.append(loss.item())if (i+1)%100 ==0:print('Epoch[{}/{}],Step[{}/{}],Train Loss:{:.4f}'.format(epoch+1,num_epoch,i+1,total_step,loss.item()))model.eval()with torch.no_grad(): #禁止梯度计算test_loss = 0.0for images,labels in test_loader:outputs = model(images)loss = criterion(outputs,labels)test_loss +=loss.item()*images.size(0) #累加每个批次总损失得到总损失test_loss /=len(test_loader.dataset) #整个测试集的平均损失# 将计算得到的单个平均测试损失值扩展到一个列表中,长度为total_step# 这样做可能是为了在绘图时每个step都有一个对应的测试损失值,尽管实际测试损失在整个epoch内是恒定的test_loss_list.extend([test_loss]*total_step) #方便可视化model.train()print("Epoch[{}/{}],Test Loss:{:.4f}".format(epoch+1,num_epoch,test_loss))plt.plot(train_loss_list,label='Train Loss')
plt.plot(test_loss_list,label='Test Loss')
plt.title('model loss')
plt.xlabel('iterations')
plt.ylabel('Loss')
plt.legend()
plt.show()

1.6 代码(GPU训练)

要想模型在GPU上训练,需要两点:

(1)模型在GPU上

(2)所有参与运算的张量在GPU上

# Author:SiZhen
# Create: 2024/7/14
# Description: 调参练习-以手写数字集为例import  torch
import torch.nn as nn
import torchvision
import torch.utils
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
#设置超参数
from torch import optim
from torch.nn import initdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")batch_size = 64
hidden_size = 128
learning_rate = 0.001
num_epoch = 10#将图片进行预处理转换成pytorch张量
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,),(0.5,),)]) #mnist是单通道,所以括号内只有一个0.5#下载训练集
train_set = torchvision.datasets.MNIST(root="./data",train=True,download=True,transform=transform)#下载测试集
test_set = torchvision.datasets.MNIST(root="./data",train=False,download=True,transform=transform)#加载数据集
train_loader= torch.utils.data.DataLoader(train_set,batch_size=batch_size,shuffle=True,pin_memory=True)test_loader = torch.utils.data.DataLoader(test_set,batch_size=batch_size,shuffle=False,pin_memory=True)#测试不shuffleinput_size = 784 #mnist,28x28像素
num_classes = 10class SEAttention(nn.Module):# 初始化SE模块,channel为通道数,reduction为降维比率def __init__(self, channel=1, reduction=8):super().__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)  # 自适应平均池化层,将特征图的空间维度压缩为1x1self.fc = nn.Sequential(  # 定义两个全连接层作为激励操作,通过降维和升维调整通道重要性nn.Linear(channel, channel // reduction, bias=False),  # 降维,减少参数数量和计算量nn.ReLU(inplace=True),  # ReLU激活函数,引入非线性nn.Linear(channel // reduction, channel, bias=False),  # 升维,恢复到原始通道数nn.Sigmoid(),  # Sigmoid激活函数,输出每个通道的重要性系数)# 权重初始化方法def init_weights(self):for m in self.modules():  # 遍历模块中的所有子模块if isinstance(m, nn.Conv2d):  # 对于卷积层init.kaiming_normal_(m.weight, mode='fan_out')  # 使用Kaiming初始化方法初始化权重if m.bias is not None:init.constant_(m.bias, 0)  # 如果有偏置项,则初始化为0elif isinstance(m, nn.BatchNorm2d):  # 对于批归一化层init.constant_(m.weight, 1)  # 权重初始化为1init.constant_(m.bias, 0)  # 偏置初始化为0elif isinstance(m, nn.Linear):  # 对于全连接层init.normal_(m.weight, std=0.001)  # 权重使用正态分布初始化if m.bias is not None:init.constant_(m.bias, 0)  # 偏置初始化为0# 前向传播方法def forward(self, x):b, c, _, _ = x.size()  # 获取输入x的批量大小b和通道数cy = self.avg_pool(x).view(b, c)  # 通过自适应平均池化层后,调整形状以匹配全连接层的输入y = self.fc(y).view(b, c, 1, 1)  # 通过全连接层计算通道重要性,调整形状以匹配原始特征图的形状return x * y.expand_as(x)  # 将通道重要性系数应用到原始特征图上,进行特征重新校准
import torch
import torch.nn as nn
from torch.nn import Softmax# 定义一个无限小的矩阵,用于在注意力矩阵中屏蔽特定位置
def INF(B, H, W):return -torch.diag(torch.tensor(float("inf")).repeat(H), 0).unsqueeze(0).repeat(B * W, 1, 1)class CrissCrossAttention(nn.Module):""" Criss-Cross Attention Module"""def __init__(self, in_dim):super(CrissCrossAttention, self).__init__()# Q, K, V转换层self.query_conv = nn.Conv2d(in_channels=in_dim, out_channels=in_dim // 8, kernel_size=1)self.key_conv = nn.Conv2d(in_channels=in_dim, out_channels=in_dim // 8, kernel_size=1)self.value_conv = nn.Conv2d(in_channels=in_dim, out_channels=in_dim, kernel_size=1)# 使用softmax对注意力分数进行归一化self.softmax = Softmax(dim=3)self.INF = INF# 学习一个缩放参数,用于调节注意力的影响self.gamma = nn.Parameter(torch.zeros(1))def forward(self, x):m_batchsize, _, height, width = x.size()# 计算查询(Q)、键(K)、值(V)矩阵proj_query = self.query_conv(x)proj_query_H = proj_query.permute(0, 3, 1, 2).contiguous().view(m_batchsize * width, -1, height).permute(0, 2, 1)proj_query_W = proj_query.permute(0, 2, 1, 3).contiguous().view(m_batchsize * height, -1, width).permute(0, 2, 1)proj_key = self.key_conv(x)proj_key_H = proj_key.permute(0, 3, 1, 2).contiguous().view(m_batchsize * width, -1, height)proj_key_W = proj_key.permute(0, 2, 1, 3).contiguous().view(m_batchsize * height, -1, width)proj_value = self.value_conv(x)proj_value_H = proj_value.permute(0, 3, 1, 2).contiguous().view(m_batchsize * width, -1, height)proj_value_W = proj_value.permute(0, 2, 1, 3).contiguous().view(m_batchsize * height, -1, width)# 计算垂直和水平方向上的注意力分数,并应用无穷小掩码屏蔽自注意energy_H = (torch.bmm(proj_query_H, proj_key_H)+ self.INF(m_batchsize, height, width).to(device)).view(m_batchsize, width, height, height).permute(0, 2, 1, 3).to(device)energy_W = torch.bmm(proj_query_W, proj_key_W).view(m_batchsize, height, width, width)# 在垂直和水平方向上应用softmax归一化concate = self.softmax(torch.cat([energy_H, energy_W], 3))# 分离垂直和水平方向上的注意力,应用到值(V)矩阵上att_H = concate[:, :, :, 0:height].permute(0, 2, 1, 3).contiguous().view(m_batchsize * width, height, height)att_W = concate[:, :, :, height:height + width].contiguous().view(m_batchsize * height, width, width)# 计算最终的输出,加上输入x以应用残差连接out_H = torch.bmm(proj_value_H, att_H.permute(0, 2, 1)).view(m_batchsize, width, -1, height).permute(0, 2, 3, 1)out_W = torch.bmm(proj_value_W, att_W.permute(0, 2, 1)).view(m_batchsize, height, -1, width).permute(0, 2, 1, 3)return self.gamma * (out_H + out_W) + xclass Net(nn.Module):def __init__(self, input_size, hidden_size, num_classes):super(Net, self).__init__()self.fc1 = nn.Linear(input_size, hidden_size)self.relu = nn.ReLU()self.fc2 = nn.Linear(hidden_size, num_classes)self.conv1 =nn.Conv2d(1,64,kernel_size=1)self.se = SEAttention(channel=1)self.cca = CrissCrossAttention(64)self.conv2 = nn.Conv2d(64,1,kernel_size=1)def forward(self, x):x = self.se(x)x = self.conv1(x)x = self.cca(x)x = self.conv2(x)out = self.fc1(x.view(-1, input_size))out = self.relu(out)out = self.fc2(out)return outmodel = Net(input_size,hidden_size,num_classes)model.to(device)criterion = nn.CrossEntropyLoss().to(device)optimizer = optim.Adam(model.parameters(),lr=learning_rate)
train_loss_list = []
test_loss_list = []#训练
total_step = len(train_loader)
for epoch in range(num_epoch):for i,(images,labels) in enumerate(train_loader):images,labels = images.to(device),labels.to(device)outputs = model(images).to(device) #获取模型分类后的结果loss = criterion(outputs,labels).to(device) #计算损失optimizer.zero_grad() #反向传播前,梯度清零loss.backward() #反向传播optimizer.step() #更新参数train_loss_list.append(loss.item())if (i+1)%100 ==0:print('Epoch[{}/{}],Step[{}/{}],Train Loss:{:.4f}'.format(epoch+1,num_epoch,i+1,total_step,loss.item()))model.eval()with torch.no_grad(): #禁止梯度计算test_loss = 0.0for images,labels in test_loader:images, labels = images.to(device), labels.to(device)outputs = model(images).to(device)loss = criterion(outputs,labels).to(device)test_loss +=loss.item()*images.size(0) #累加每个批次总损失得到总损失test_loss /=len(test_loader.dataset) #整个测试集的平均损失# 将计算得到的单个平均测试损失值扩展到一个列表中,长度为total_step# 这样做可能是为了在绘图时每个step都有一个对应的测试损失值,尽管实际测试损失在整个epoch内是恒定的test_loss_list.extend([test_loss]*total_step) #方便可视化model.train()print("Epoch[{}/{}],Test Loss:{:.4f}".format(epoch+1,num_epoch,test_loss))plt.plot(train_loss_list,label='Train Loss')
plt.plot(test_loss_list,label='Test Loss')
plt.title('model loss')
plt.xlabel('iterations')
plt.ylabel('Loss')
plt.legend()
plt.show()

1.7 调参对比

可以看到,该模型原始状态下损失值已经非常小了。

现在我把隐藏层神经元数量从原来的128改为256,学习率进一步减小为0.0005,我们看一下效果:

效果略微提升,但是我们可以看到在后面测试集的表现产生了一些波动,没有之前的模型稳定。

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

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

相关文章

AIGC笔记--基于Stable Diffusion实现图片的inpainting

1--完整代码 SD_Inpainting 2--简单代码 import PIL import torch import numpy as np from PIL import Image from tqdm import tqdm import torchvision from diffusers import AutoencoderKL, UNet2DConditionModel, DDIMScheduler from transformers import CLIPTextMod…

flutter 手写 TabBar

前言: 这几天在使用 flutter TabBar 的时候 我们的设计给我提了一个需求: 如下 Tabbar 第一个元素 左对齐,试了下TabBar 的配置,无法实现这个需求,他的 配置是针对所有元素的。而且 这个 TabBar 下面的 滑块在移动的时…

4.定时器

原理 时钟源:定时器是内部时钟源(晶振),计数器是外部计时长度:对应TH TL计数器初值寄存器(高八位,低八位)对应的中断触发函数 中断源中断处理函数Timer0Timer0_Routine(void) interrupt 1Timer1Timer1_Routine(void) …

爬虫学习 | 01 Web Scraper的使用

目录 背景介绍: 第一部分:Web Scraper简介 1.什么是Web Scraper: Web Scraper🛒 主要用途: 2.为什么选择Web Scraper: 第二部分:安装Web Scraper ​​​​​1.打开google浏览器&#xf…

object-C 解答算法:合并两个有序数组(leetCode-88)

合并两个有序数组(leetCode-88) 题目如下图:(也可以到leetCode上看完整题目,题号88) 首先搞懂,什么叫“非递减顺序” 非递减顺序,是指一个序列中的元素从前往后(或从左到右)保持不减少或相等。 这意味着序列中的元素可以保持相同的值,但不会…

实战:SpringBoot扩展功能ExitCodeGenerator生成的退出代码

1. 简介 ExitCodeGenerator是 Spring Boot 框架中的一个接口,它允许应用程序退出时生成自定义的退出代码。你可以根据不同的退出码,执行相应的动作,如:资源清理,日志记录等。 我们可以通过实现ExitCodeGenerator接口…

全网最适合入门的面向对象编程教程:17 类和对象的Python实现-鸭子类型与“file-like object“

全网最适合入门的面向对象编程教程:17 类和对象的 Python 实现-鸭子类型与“file-like object“ 摘要: 本文主要介绍了 Python 中创建自定义类时鸭子类型的基本定义、特点和应用场景,同时列举了**“file-like object“** 的例子对鸭子类型进…

axios以post方式提交表单形式数据

某些后端框架请求接口必须走form表单提交的那种形式&#xff0c;但前端很少有<form action"接口地址" method"post"></form>这种写法去提交表单数据&#xff0c;所以前端需要用axios模拟一个表单提交接口。 Content-Type 代表发送端&#xff0…

单链表的介绍和实现

前言 Hello,小伙伴们&#xff0c;你们的作者君又回来了&#xff0c;今天我将带领大家继续学习另一种线性表&#xff1a;单链表&#xff0c; 准备好的小伙伴三连打卡上车&#xff0c;你们的支持就是我更新的动力&#xff0c;一定不要吝啬手中的三连哟&#xff0c;万分感谢&…

ElementUI el-select 组件动态设置disabled后,高度变更的问题解决办法

问题描述 Vue2 项目在使用 el-select 组件时&#xff0c;动态将disabled变更为了 true&#xff0c;元素的高度发生了变化。 问题原因 通过浏览器开发人员工具面板&#xff0c;发现&#xff0c;组件内的 input 元素被动态设置了height的样式&#xff1a; 在项目中检查后并…

深度解析:如何优雅地删除GitHub仓库中的特定commit历史

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

three.js创建基础模型

场景是一个三维空间&#xff0c;是所有物品的容器。可以将其想象成一个空房间&#xff0c;里面可以放置要呈现的物体、相机、光源等。 通过new THREE.Scene()来创建一个新的场景。 /**1. 创建场景 -- 放置物体对象的环境*/ const scene new THREE.Scene();场景只是一个三维的…

django学习入门系列之第四点《案例 后台管理样例》

文章目录 往期回顾 前期准备&#xff1a; 导航新建&#xff0c;按钮表格 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!-- 开发版本 --><link rel"stylesheet…

2024-07-16 Unity插件 Odin Inspector6 —— Group Attributes

文章目录 1 说明2 Group 特性2.1 BoxGroup2.2 ButtonGroup2.3 FoldoutGroup2.4 ShowIfGroup / HideIfGroup2.5 HorizontalGroup2.6 ResponsiveButtonGroup2.7 TabGroup2.8 ToggleGroup2.9 VerticalGroup 1 说明 ​ 本文介绍 Odin Inspector 插件中有关 Group 特性的使用方法。…

【解决问题】permission denied while trying to connect to the Docker daemon socket

解决方法 sudo usermod -aG docker $USER 运行上面命令&#xff0c;将当前用户添加到 docker 组&#xff0c;重启电脑。 GPT-4o (OpenAI) 看起来你在尝试通过 make build 构建项目时遇到了权限问题&#xff0c;尤其是在拉取 Docker 镜像时没有权限访问 Docker 的 Unix 套接…

如何使用 GPT?

​通过实例&#xff0c;来展示如何最好地使用 GPT。 生成文字 假设你在写一篇文章&#xff0c;需要在结尾加上这样一句&#xff1a;「California’s population is 53 times that of Alaska.」&#xff08;加州的人口是阿拉斯加州的 53 倍&#xff09;。 但现在你不知道这两个…

谷歌准备斥资 230 亿收购网络安全初创公司 Wiz

Alphabet 正在就收购 Wiz 进行深入谈判&#xff0c;这将显著增强其安全能力。这将是谷歌母公司有史以来最大规模的收购。 这是路透社根据匿名消息来源撰写的内容。目标收购金额为230亿美元&#xff0c;即211亿欧元。 Wiz 拥有实时检测和响应网络威胁的技术。通过实施人工智能…

有关电力电子技术的一些相关仿真和分析:⑥单相相控调压电路与单相斩控调压电路(MATLAB/Siumlink仿真)

针对单相相控调压电路&#xff0c;仿真研究对于给定负载&#xff0c;不同触发角作用下&#xff0c;输出电压波形和输入电流波形&#xff08;对照电网电压&#xff09;&#xff0c;研究输出电压有效值随触发角变化的规律&#xff0c;讨论并验证输入电流连续的条件。采用相同的电…

WPF实现一个带旋转动画的菜单栏

WPF实现一个带旋转动画的菜单栏 一、创建WPF项目及文件1、创建项目2、创建文件夹及文件3、添加引用 二、代码实现2.ControlAttachProperty类 一、创建WPF项目及文件 1、创建项目 打开VS2022,创建一个WPF项目&#xff0c;如下所示 2、创建文件夹及文件 创建资源文件夹&…

<Qt> 初识Qt

目录 一、项目文件解析 widget.h main.cpp widget.cpp widget.ui .pro文件 二、QT 实现Hello World程序 &#xff08;一&#xff09;按钮控件 1. 纯代码 2. 图形化 &#xff08;二&#xff09;标签控件 1. 纯代码 2. 图形化 三、内存泄漏问题 四、qdebug()的使用…