pytorch(六、七)多维特征数据的输入、加载数据集的类

文章目录

  • 多维特征数据的输入
    • 代码
  • 加载数据集
    • 概念
    • np.loadtxt()读取数据
    • dataloader
    • torchvision获取数据集
    • 代码
  • 三种梯度下降
    • 批量梯度下降BGD
    • 随机梯度下降SGD
    • 小批量随机梯度下降MBGD
    • 代码

多维特征数据的输入

对于一个多维数据,其行表示一个样本,列表示样本的特征

对于多维特征的运算,实质上可以当做特征的映射
在这里插入图片描述

代码

import  torch
import  torch.nn.functional as F
import  numpy as np
import matplotlib.pyplot as plt
from sklearn import datasetsxy=np.loadtxt('./data/Diabetes_class.csv.gz',delimiter=',',dtype=np.float32)#加载训练集合
x_data = torch.from_numpy(xy[:,:-1])#取前八列
y_data = torch.from_numpy(xy[:,[-1]])#取最后一列test =np.loadtxt('./data/test_class.csv.gz',delimiter=',',dtype=np.float32)#加载测试集合,这里我用数据集的最后一个样本做测试,训练集中没有最后一个样本
test_x = torch.from_numpy(test)class Model(torch.nn.Module):def __init__(self):#构造函数super(Model,self).__init__()self.linear1 = torch.nn.Linear(8,6)#8维到6维self.linear2 = torch.nn.Linear(6, 4)#6维到4维self.linear3 = torch.nn.Linear(4, 1)#4维到1维self.sigmoid = torch.nn.Sigmoid()#因为他里边也没有权重需要更新,所以要一个就行了,单纯的算个数def forward(self, x):#构建一个计算图,就像上面图片画的那样x = self.sigmoid(self.linear1(x))x = self.sigmoid(self.linear2(x))#将上面一行的输出作为输入x = self.sigmoid(self.linear3(x))return  xmodel = Model()#实例化模型criterion = torch.nn.BCELoss(size_average=False)
#model.parameters()会扫描module中的所有成员,如果成员中有相应权重,那么都会将结果加到要训练的参数集合上
optimizer = torch.optim.SGD(model.parameters(),lr=0.1)#lr为学习率,因为0.01太小了,我改成了0.1for epoch in range(1000):#Forwardy_pred = model(x_data)loss = criterion(y_pred,y_data)print(epoch,loss.item())#Backwardoptimizer.zero_grad()loss.backward()#updateoptimizer.step()y_pred = model(x_data)print(y_pred.detach().numpy())y_pred2 = model(test_x)
print(y_pred2.data.item())

加载数据集

概念

# Training cycle
for epoch in range(training_epochs):# Loop over all batchesfor i in range(total_batch)
  • epoch:表示训练的周期,表示所有的样本都经过前向传播和后向传播才叫一个训练周期
  • batch-size:每一次训练的时候所需要的样本数量,这个训练包括了前向传播和后向传播
  • iterations:内层循环一共执行了多少次,= 样本数量 ÷ batch-size

np.loadtxt()读取数据

loadtxt适合读取 txt 和 csv 文件,默认读取float类型的值

numpy.loadtxt(fname, dtype=, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)
  • frame:表示要读取的文件路径
  • dtype:默认是 np.float32
  • delimiter:表示分隔符,默认是空格
  • skiprows:表示跳过前几行读取,默认是0,如skiprows=2
  • usecols:表示要读取哪一些列,从0开始
  • unpack:如果设置为true表示分列读取,类似于矩阵的转置,默认是按照行读取

dataloader

可以自动进行小批量数据的生成

	#in pcdet/datasets/__init__.pydataloader = DataLoader(dataset,batch_size=batch_size,num_workers=workers,shuffle=True,)
  • batch_size:批量的大小
  • shuffle:=true时表示随机打乱数据,使得小批量数据具有随机性
  • num_workers:读取数据的时候,是否要并行的进程读取数据

在这里插入图片描述

torchvision获取数据集

在这里插入图片描述

import torchvision
from torch.utils.data import DataLoader'''
手写数字的数据集,其中训练集有60000个样本,测试集有10000个样本,共分为0-9,10个类
'''
train_set=torchvision.datasets.MNIST(root='./dataset/mnist',train=True,download=True)
test_set=torchvision.datasets.MNIST(root='./dataset/mnist',train=False,download=True)train_loader=DataLoader(dataset=train_set,batch_size=32,shuffle=True)
test_loader=DataLoader(dataset=test_set,batch_size=32,shuffle=False)

代码

import  torch
import  numpy as np
from torch.utils.data import Dataset
from torch.utils.data import DataLoader'''
Dataset是一个抽象函数,不能直接实例化,所以我们要创建一个自己类,继承Dataset   
继承Dataset后我们必须实现三个函数:
__init__()是初始化函数,之后我们可以提供数据集路径进行数据的加载
__getitem__()帮助我们通过索引找到某个样本,下标操作
__len__()帮助我们返回数据集大小
DataLoader对数据集先打乱(shuffle),然后划分成mini_batch。
'''
class DiabetesDataset(Dataset):def __init__(self,filepath):xy = np.loadtxt(filepath,delimiter=',',dtype=np.float32)#shape本身是一个二元组(x,y)对应数据集的行数和列数,这里[0]我们取行数,即样本数self.len = xy.shape[0]self.x_data = torch.from_numpy(xy[:, :-1])self.y_data = torch.from_numpy(xy[:, [-1]])def __getitem__(self, index):return self.x_data[index],self.y_data[index]def __len__(self):return self.len#定义好DiabetesDataset后我们就可以实例化他了
dataset = DiabetesDataset('./data/Diabetes_class.csv.gz')
#我们用DataLoader为数据进行分组,batch_size是一个组中有多少个样本,shuffle表示要不要对样本进行随机排列
#一般来说,训练集我们随机排列,测试集不。num_workers表示我们可以用多少进程并行的运算
train_loader = DataLoader(dataset=dataset,batch_size=32,shuffle=True,num_workers=2)class Model(torch.nn.Module):def __init__(self):#构造函数super(Model,self).__init__()self.linear1 = torch.nn.Linear(8,6)#8维到6维self.linear2 = torch.nn.Linear(6, 4)#6维到4维self.linear3 = torch.nn.Linear(4, 1)#4维到1维self.sigmoid = torch.nn.Sigmoid()#因为他里边也没有权重需要更新,所以要一个就行了,单纯的算个数def forward(self, x):#构建一个计算图,就像上面图片画的那样x = self.sigmoid(self.linear1(x))x = self.sigmoid(self.linear2(x))x = self.sigmoid(self.linear3(x))return  xmodel = Model()#实例化模型criterion = torch.nn.BCELoss(size_average=False)
#model.parameters()会扫描module中的所有成员,如果成员中有相应权重,那么都会将结果加到要训练的参数集合上
optimizer = torch.optim.SGD(model.parameters(),lr=0.1)#lr为学习率if __name__=='__main__':#if这条语句在windows系统下一定要加,否则会报错for epoch in range(1000):for i,data in enumerate(train_loader,0):#取出一个bath# repare datainputs,labels = data#将输入的数据赋给inputs,结果赋给labels #Forwardy_pred = model(inputs)loss = criterion(y_pred,labels)print(epoch,loss.item())#Backwardoptimizer.zero_grad()loss.backward()#updateoptimizer.step()


三种梯度下降

批量梯度下降、随机梯度下降和小批量梯度下降详解

在前面的学习中,前向传播是为了计算损失函数,而后向传播是为了更新各种的参数,在线性回归中,常用梯度下降来更新参数。

这里假设有数据 X = [ [ x 1 1 , x 2 1 ] , [ x 1 2 , x 2 2 ] , … … , [ x 1 n , x 2 n ] ] n × 2 X=[[x_1^1,x_2^1],[x_1^2,x_2^2],……,[x_1^n,x_2^n]]_{n×2} X=[[x11,x21],[x12,x22],……[x1n,x2n]]n×2 y = [ [ y 1 ] , [ y 2 ] , … … , [ y n ] ] n × 1 y=[[y^1],[y^2],……,[y^n]]_{n×1} y=[[y1],[y2],……[yn]]n×1,需要求一个 θ = [ [ θ 1 ] , [ θ 2 ] ] 2 × 1 θ=[[θ_1],[θ_2]]_{2×1} θ=[[θ1],[θ2]]2×1,使得以上数据可以拟合为一个函数 y ^ \hat y y^下面推导梯度下降的公式。

假设的,在多元回归或者逻辑回归的损失函数设为:
L o s s = 1 2 ⋅ 1 n ⋅ ∑ i = 1 n ( y ^ i − y i ) 2 = 1 2 ⋅ 1 n ⋅ [ ( x 1 1 θ 1 + x 2 1 θ 2 − y 1 ) 2 + ( x 1 2 θ 1 + x 2 2 θ 2 − y 2 ) 2 + … … + ( x 1 n θ 1 + x 2 n θ 2 − y n ) 2 ] \begin{align*} Loss &=\frac{1}{2}·\frac{1}{n}·\sum_{i=1}^{n}{(\hat y^i-y^i)^2} \\ &=\frac{1}{2}·\frac{1}{n}·[(x_1^1\theta _1+x_2^1\theta _2-y^1)^2+(x_1^2\theta _1+x_2^2\theta _2-y^2)^2+……+(x_1^n\theta _1+x_2^n\theta _2-y^n)^2] \end{align*} Loss=21n1i=1n(y^iyi)2=21n1[(x11θ1+x21θ2y1)2+(x12θ1+x22θ2y2)2+……+(x1nθ1+x2nθ2yn)2]


∂ L o s s ∂ θ 1 = 1 n ⋅ [ x 1 1 ⋅ ( x 1 1 θ 1 + x 2 1 θ 2 − y 1 ) + x 1 2 ⋅ ( x 1 2 θ 1 + x 2 2 θ 2 − y 2 ) + … … + x 1 n ⋅ ( x 1 n θ 1 + x 2 n θ 2 − y n ) ] = 1 n ⋅ ∑ i = 1 n x 1 i ( x 1 i θ 1 + x 2 i θ 2 − y i ) = 1 n ⋅ ∑ i = 1 n x 1 i ( y ^ i − y i ) \begin{align*} \frac{\partial Loss}{\partial \theta _1} &=\frac{1}{n}·[x_1^1·(x_1^1\theta _1+x_2^1\theta _2-y^1)+x_1^2·(x_1^2\theta _1+x_2^2\theta _2-y^2)+……+x_1^n·(x_1^n\theta _1+x_2^n\theta _2-y^n)] \\ &=\frac{1}{n}·\sum_{i=1}^{n}x_1^i(x_1^i\theta _1+x_2^i\theta _2-y^i) \\ &=\frac{1}{n}·\sum_{i=1}^{n}x_1^i(\hat y^i-y^i) \end{align*} θ1Loss=n1[x11(x11θ1+x21θ2y1)+x12(x12θ1+x22θ2y2)+……+x1n(x1nθ1+x2nθ2yn)]=n1i=1nx1i(x1iθ1+x2iθ2yi)=n1i=1nx1i(y^iyi)

同理可得,
∂ L o s s ∂ θ 2 = 1 n ⋅ ∑ i = 1 n x 2 i ( y ^ i − y i ) \frac{\partial Loss}{\partial \theta _2} =\frac{1}{n}·\sum_{i=1}^{n}x_2^i(\hat y^i-y^i) θ2Loss=n1i=1nx2i(y^iyi)

所以
∂ L o s s ∂ θ j = 1 n ⋅ ∑ i = 1 n x j i ( y ^ i − y i ) \frac{\partial Loss}{\partial \theta _j} =\frac{1}{n}·\sum_{i=1}^{n}x_j^i(\hat y^i-y^i) θjLoss=n1i=1nxji(y^iyi)

则得到梯度更新的公式为
θ j ′ = θ j + α ⋅ 1 n ⋅ ∑ i = 1 n x j i ( y ^ i − y i ) \theta_j^{'} =\theta_j+\alpha· \frac{1}{n}·\sum_{i=1}^{n}x_j^i(\hat y^i-y^i) θj=θj+αn1i=1nxji(y^iyi)

批量梯度下降BGD

每一次参数更新时,按照所有样本来计算梯度,也就是所有样本都参与到Loss值的计算中。

批量梯度下降对于凸优化问题可以找到全局的最优解,这种方法在样本量不大的情况下可以快速收敛,但是如果样本的量过大,每次参数更新都需要全部的样本的参与,单次更新的时间长,需要的存储空间也大。其更新公式如下:
θ j ′ = θ j + α ⋅ 1 n ⋅ ∑ i = 1 n x j i ( y ^ i − y i ) for every j \theta_j^{'} =\theta_j+\alpha· \frac{1}{n}·\sum_{i=1}^{n}x_j^i(\hat y^i-y^i) \quad \text{for every j} θj=θj+αn1i=1nxji(y^iyi)for every j

随机梯度下降SGD

每一次参数更新只需要采用一个样本来计算梯度

随机梯度下降不能保证每一次的更新都按照全局最优点出发,随机梯度下降相对于批量梯度下降的单次更新时间快,存储要求小,在非凸优化问题上,这种方法通常可以更快的收敛到一个局部最优解。其更新公式如下:
for i to n: θ j ′ = θ j + α ⋅ ( y ^ i − y i ) for every j \begin{align*} &\text{for i to n:} \\ &\theta_j^{'} =\theta_j+\alpha·(\hat y^i-y^i) \quad \text{for every j} \end{align*} for i to n:θj=θj+α(y^iyi)for every j

小批量随机梯度下降MBGD

每一次参数的更新,只需要选取一个小批量(mini-batch) b 的样本进行计算

小批量随机梯度下降是BGD和SGD的中间方案,继承了两者的优点。其更新公式如下:
for i to n: θ j ′ = θ j + α ⋅ 1 b ⋅ ∑ i i + b − 1 x j i ( y ^ i − y i ) for every j \begin{align*} &\text{for i to n:} \\ &\theta_j^{'} =\theta_j+\alpha· \frac{1}{b}·\sum_{i}^{i+b-1}x_j^i(\hat y^i-y^i) \quad \text{for every j} \end{align*} for i to n:θj=θj+αb1ii+b1xji(y^iyi)for every j

代码

数据准备

import numpy as np
x0=np.random.randint(1,2,100).reshape(100,1)
x1=np.random.randint(1,10,100).reshape(100,1)y=x0+x1
X=np.hstack((x0,x1))
print(X.shape[0])# print(X)# X是100*2
# print(y)# y是100*1

批量梯度下降

# 批量梯度下降BGD
def BGD(X,y):ept=0.001# 精度loss=1alpha=0.01# 学习率max_iter=0# 梯度更新次数theta=np.random.randint(1,10,(X.shape[1],1))# 初始化theta# print(theta) # 2*1# 收敛的条件while max_iter<10000 and loss>ept:# 损失函数关于theta的偏导数partial=(1/X.shape[0])*X.T.dot(X.dot(theta)-y)# partial=X.T.dot(X.dot(theta)-y)# 2*1# 梯度更新theta=theta-alpha*partial# print('%s:partial:%s,theta:%s'%(max_iter,partial,theta))max_iter+=1loss=(1/(2*X.shape[0]))*np.sum((X.dot(theta)-y)**2)# loss=(1/2)*np.sum((X.dot(theta)-y)**2)# print("loss:",loss)return max_iter,thetamax_iter,theta=BGD(X,y)
print('BGD:max_iter:%s\n theta:%s'%(max_iter,theta))

在这里插入图片描述

随机梯度下降

# 随机梯度下降SGD
def SGD(X,y):ept=0.001# 精度loss=1alpha=0.01# 学习率max_iter=0# 梯度更新次数theta=np.random.randint(1,10,(X.shape[1],1))# 初始化theta# print(theta) # 2*1numSample=X.shape[0]while max_iter<10000 and loss>ept:# 随机抽取一个样本i=np.random.randint(0,numSample)# 损失函数对theta的偏导数,这个偏导数是单个的partial=X[i:i+1,:].T.dot((X[i:i+1,:].dot(theta)-y[i,:]).reshape(1,1))theta=theta-alpha*partialmax_iter+=1loss=(1/(2*X.shape[0]))*np.sum((X.dot(theta)-y)**2)# loss=(1/2)*np.sum((X.dot(theta)-y)**2)# 损失函数和上面的一样return max_iter,thetamax_iter,theta=SGD(X,y)
print('SGD:max_iter:%s\n theta:%s'%(max_iter,theta))

在这里插入图片描述

# 随机梯度下降SGD
def SGD(X,y):ept=0.001# 精度loss=1alpha=0.01# 学习率max_iter=0# 梯度更新次数theta=np.random.randint(1,10,(X.shape[1],1))# 初始化theta# print(theta) # 2*1numSample=X.shape[0]while max_iter<10000 and loss>ept:for i in range(numSample):# 随机抽取一个样本# i=np.random.randint(0,numSample)# 损失函数对theta的偏导数,这个偏导数是单个的partial=X[i:i+1,:].T.dot((X[i:i+1,:].dot(theta)-y[i,:]).reshape(1,1))theta=theta-alpha*partialmax_iter+=1loss=(1/(2*X.shape[0]))*np.sum((X.dot(theta)-y)**2)# loss=(1/2)*np.sum((X.dot(theta)-y)**2)# 损失函数和上面的一样return max_iter,thetamax_iter,theta=SGD(X,y)
print('SGD:max_iter:%s\n theta:%s'%(max_iter,theta))

在这里插入图片描述
ps:这里为什么给出两种代码,其实这里按照我给出的公式其实第二种代码才是对应的代码,第二种的max_iter其实可以认为是epoch,表示周期,因为一个周期需要所有的样本数据都参与一次。而第一种代码的max_iter表示的是参数更新的次数,这两个是不同的。在批量梯度下降中,参数更新的次数与周期在数目上是一致的,这是因为批量梯度下降每一次参数更新需要所有的样本参与。同理下面的小批量随机梯度下降也是有两种代码的。

小批量梯度下降

# 小批量随机梯度下降,这里的小批量是两个样本
def MBGD(X,y):ept=0.001# 精度loss=1alpha=0.01# 学习率max_iter=0# 梯度更新次数theta=np.random.randint(1,10,(X.shape[1],1))# 初始化theta# print(theta) # 2*1numSample=X.shape[0]while max_iter<10000 and loss>ept:# 随机选择一个批量的数据i=np.random.randint(0,numSample-1)# 损失函数对theta的偏导数partial=(1/2)*X[i:i+2,:].T.dot(X[i:i+2,:].dot(theta)-y[i:i+2,:])# partial=X[i:i+2,:].T.dot(X[i:i+2,:].dot(theta)-y[i:i+2,:])theta=theta-alpha*partialmax_iter+=1loss=(1/(2*X.shape[0]))*np.sum((X.dot(theta)-y)**2)# loss=(1/2)*np.sum((X.dot(theta)-y)**2)# 损失函数和上面的一样return max_iter,thetamax_iter,theta=MBGD(X,y)
print('MBGD:max_iter:%s\n theta:%s'%(max_iter,theta))

在这里插入图片描述

# 小批量随机梯度下降,这里的小批量是两个样本
def MBGD(X,y):ept=0.001# 精度loss=1alpha=0.01# 学习率max_iter=0# 梯度更新次数theta=np.random.randint(1,10,(X.shape[1],1))# 初始化theta# print(theta) # 2*1numSample=X.shape[0]mini_batch=2while max_iter<10000 and loss>ept:for i in range(0,numSample-2,mini_batch):# 随机选择一个批量的数据# i=np.random.randint(0,numSample-1)# 损失函数对theta的偏导数partial=(1/mini_batch)*X[i:i+mini_batch,:].T.dot(X[i:i+mini_batch,:].dot(theta)-y[i:i+mini_batch,:])# partial=X[i:i+2,:].T.dot(X[i:i+2,:].dot(theta)-y[i:i+2,:])theta=theta-alpha*partialmax_iter+=1loss=(1/(2*X.shape[0]))*np.sum((X.dot(theta)-y)**2)# loss=(1/2)*np.sum((X.dot(theta)-y)**2)# 损失函数和上面的一样return max_iter,thetamax_iter,theta=MBGD(X,y)
print('MBGD:max_iter:%s\n theta:%s'%(max_iter,theta))# https://blog.csdn.net/eevee_1/article/details/134944669

以上,仅个人理解,欢迎批评指正。

参考文章:批梯度下降(BGD)、随机梯度下降(SGD)、小批量梯度下降(MBGD)的理解和python 实现
pytorch(二)梯度下降算法

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

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

相关文章

基于Java的社区买菜系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 数据中心模块2.1.2 菜品分类模块2.1.3 菜品档案模块2.1.4 菜品订单模块2.1.5 菜品收藏模块2.1.6 收货地址模块 2.2 可行性分析2.3 用例分析2.4 实体类设计2.4.1 菜品分类模块2.4.2 菜品档案模块2.4.3…

Linux内存映射

目录 背景 一、什么是内存映射&#xff1f; 二、mman函数 1.权限问题 2.总线错误 3.内存权限 4.读文件内容 5.映射与文件 6.非法参数错误 7.偏移量大小 8.映射内存大小 8.1 申请6k,访问5k 8.2 申请2k&#xff0c;访问3k 8.3 返回值检查 三、内存映射实现 四…

SSH移植到BusyBox

手动编译SSH安装挺麻烦的&#xff0c;本文主要是我大量借鉴和实践总结出来的流程&#xff0c;一步一按照做不会有太大问题。 移植平台&#xff1a;IMX6UL(迅为开发板) 根文件系统&#xff1a;BusyBox 所有操作都建议不要在root账户下运行&#xff0c;并且make install的安装路…

【Python】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 Python 目录&#xff1a; &#xff08;一&#xff09;装饰器函数 &#xff08;二&#xff09;牛客网—软件开发-Python专项练习 &#xff08;三&#xff09;装饰器函数 &#xff08;四&#xff0…

【深度学习】自动求导中有时为什么要先sum()再backward()

创作日志&#xff1a; 在看李沐学深度学习&#xff0c;“深度学习中&#xff0c;我们的目的不是计算微分矩阵&#xff0c;而是批量中每个样本单独计算的偏导数之和”&#xff0c;对这句话一知半解&#xff0c;自己动手推导一下。 一、理解 在深度学习中&#xff0c;被求导的对…

CSS的盒子模型:掌握网页设计的基石!

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Linux的进程调度实现

经常被问到进程的调度算法有哪些&#xff0c;什么先进先出、短进程优先、时间片轮转、多级反馈多列等等算法能说一大堆&#xff1f;那具体的&#xff0c;linux内核使用了什么样的算法&#xff0c;且来探究一下。 本文所引用源码基于linux内核2.6.34版本。 目录 调度器类 从 s…

探索 PostgreSQL 的高级数据类型 - 第 1 部分

数组和枚举 PostgreSQL 因其可扩展性和多功能性而备受欢迎&#xff0c;除了传统的整数和字符串之外&#xff0c;它还提供了多种数据类型。其中&#xff0c;包括数组和枚举&#xff0c;其为开发者提供了高级的数据建模能力。本文中&#xff0c;我们将深入研究这些复杂的数据类型…

Unity中PICO实现 隔空取物 和 接触抓取物体

文章目录 前言一、隔空取物1、XR Grab Interactable2、调节扔出去时的相关系数3、用手柄射线指向需要抓取的物体后&#xff0c;按下侧边扳机键即可抓取 二、接触抓取物体1、替换手柄上抓取物体的脚本2、在手柄上添加 接触抓取物体的脚本3、在手柄上添加碰撞盒触发器4、在需要抓…

PHAMB: 病毒数据分箱

Genome binning of viral entities from bulk metagenomics data | Nature Communications 安装 ### New dependencies *Recommended* conda install -c conda-forge mamba mamba create -n phamb python3.9 conda activate phamb mamba install -c conda-forge -c biocond…

IOS降级后从高版本到低版本恢复备份

IOS降级后从高版本到低版本恢复备份 此方法只适用于小版本还原&#xff0c;比如17.4->17.3&#xff0c;未验证大版本恢复可行性手机型号&#xff1a;iphone 13pro 系统版本&#xff1a;17.4 降级版本&#xff1a;17.3.1 步骤 通过itunes或者MacOS系统下对当前版本进行备份…

基于ThinkPHP框架的校园一卡通系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 框架技术 3 1.1.1 Bootstrap 3 1.1.2 ThinkPHP框架 3 1.2 前端技术 4 1.2.1 JavaScript 4 1.2.2 ECharts 4 1.3 B/S架构 4 1.4 数据库技术 5 1.4.1 MySQL 5 1.5 本章小结 6 2 系统分析 7 2.1 功能需求分析 7 2.2 非功能需…

202441读书笔记|《笠翁对韵》—— 金菡萏,玉芙蓉,酒晕微酡琼杏颊,香尘浅印玉莲双

202441读书笔记|《笠翁对韵》——金菡萏&#xff0c;玉芙蓉&#xff0c;酒晕微酡琼杏颊&#xff0c;香尘浅印玉莲双 《作家榜名著&#xff1a;笠翁对韵》作者李渔&#xff0c;霍俊明。是所有词句都有注音的一本书&#xff0c;轻松学不认识的字&#xff0c;非常朗朗上口的对偶词…

PromptBreeder---针对特定领域演化和发展提示词的方法

原文地址&#xff1a;promptbreeder-evolves-adapts-prompts-for-a-given-domain 论文地址&#xff1a;https://arxiv.org/pdf/2309.16797.pdf 2023 年 10 月 6 日 提示方法分为两大类 硬提示是由人工精心设计的文本提示&#xff0c;包含离散的输入令牌&#xff1b;其缺点…

【Linux】gcc与make、makefile

文章目录 1 gcc/g1.1 预处理1.2 编译1.3 汇编1.4 链接1.4.1 静态链接1.4.2 动态链接 2 make和makefile2.1 依赖关系2.2 依赖方法2.3 伪目标 3 总结 1 gcc/g 当我们创建一个文件&#xff0c;并向里面写入代码&#xff0c;此时&#xff0c;我们该如何使我们的代码能够运行起来呢&…

html--心花怒放

代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Canvas 绘制一个❤</title><link rel"shortcut icon" href"../../assets/images/icon/favicon.ico" type"ima…

C#实现快速排序算法

C#实现快速排序算法 以下是C#中的快速排序算法实现示例&#xff1a; using System;class QuickSort {// 快速排序入口函数public static void Sort(int[] array){QuickSortRecursive(array, 0, array.Length - 1);}// 递归函数实现快速排序private static void QuickSortRecu…

ubuntu自带屏幕截图功能

目录 简介开始截屏步骤1.打开截屏软件2.选择区域3.截图 快捷键 录屏方法11.开始录屏2.停止录屏 方法2 补充说明 简介 试了好多开源跨平台截图软件&#xff0c;但是在ubuntu上都或多或少存在问题。ubuntu有自带的截图软件。打算把ubuntu自带的截图软件用起来。 顺便说一下我使…

B端系统升级,登录页必在升级之列,不容置疑。

进行B端界面升级时&#xff0c;首先升级登录页有以下几个原因&#xff1a; 用户体验&#xff1a;登录页是用户进入系统的第一个页面&#xff0c;用户首先接触到的界面。通过升级登录页&#xff0c;可以提升用户的第一印象&#xff0c;增强用户对系统的信任感和好感度&#xff…

Android Studio编译及调试知识

文章目录 Android Studio编译kotlin项目Android Studio编译Java和kotlin混合项目的过程gradle打印详细错误信息&#xff0c;类似这种工具的使用Android apk 从你的代码到APK打包的过程&#xff0c;APK安装到你的Android手机上的过程&#xff0c;最后安装好的形态&#xff0c;以…