张量操作与线性回归

一、张量的操作:拼接、切分、索引和变换

(1)张量拼接与切分

1.1 torch.cat()

功能:将张量按维度dim进行拼接
• tensors: 张量序列
• dim : 要拼接的维度
torch.cat(tensors, dim=0, out=None)函数用于沿着指定维度dim将多个张量拼接在一起。它接受一个张量列表tensors作为输入,并返回一个拼接后的张量。参数dim指定了拼接的维度,默认为0。

flag = True
if flag:t = torch.ones((2, 3)) #创建一个形状为(2, 3)的全为1的张量tt_0 = torch.cat([t, t], dim=0) # 将张量t沿着dim=0的维度拼接两次,得到张量t_0t_1 = torch.cat([t, t, t], dim=1)# 将张量t沿着dim=1的维度拼接三次,得到张量t_1print("t_0:{} shape:{}\nt_1:{} shape:{}".format(t_0, t_0.shape, t_1, t_1.shape))
t_0:tensor([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]]) shape:torch.Size([4, 3])
t_1:tensor([[1., 1., 1., 1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1., 1., 1., 1.]]) shape:torch.Size([2, 9])
  • format()用于将t_0、t_0.shape、t_1和t_1.shape的值插入到字符串中的占位符位置。具体来说,{}是占位符,format()方法将会将对应的值填充到这些占位符的位置。
  • 例如,“t_0:{} shape:{}\nt_1:{} shape:{}”.format(t_0, t_0.shape, t_1, t_1.shape)中的{}将会分别被t_0、t_0.shape、t_1和t_1.shape的值所替代。

1.2 torch.stack()

功能:在新创建的维度dim上进行拼接
• tensors:张量序列
• dim :要拼接的维度

torch.stack(tensors, dim=0, out=None)函数用于沿着指定维度dim将多个张量堆叠在一起。它接受一个张量列表tensors作为输入,并返回一个堆叠后的张量。参数dim指定了堆叠的维度,默认为0。

以下是示例代码:

import torch
# 示例张量
tensor1 = torch.tensor([1, 2, 3])
tensor2 = torch.tensor([4, 5, 6])
tensor3 = torch.tensor([7, 8, 9])
# 使用torch.cat()函数拼接张量
cat_result = torch.cat([tensor1, tensor2, tensor3], dim=0)
print("torch.cat()拼接结果:", cat_result)# 使用torch.stack()函数堆叠张量
stack_result = torch.stack([tensor1, tensor2, tensor3], dim=0)
print("torch.stack()堆叠结果:", stack_result)

输出结果为:

torch.cat()拼接结果: tensor([1, 2, 3, 4, 5, 6, 7, 8, 9])
torch.stack()堆叠结果: tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])

1.3 torch.chunk()

torch.chunk()是PyTorch中的一个函数,用于将张量沿着指定维度进行分块。
函数的参数包括:

  • input:要分块的输入张量。
  • chunks:要分成的块数。
  • dim(可选):指定要分块的维度,默认为0。
    函数返回一个元组,包含分块后的张量块。
    以下是一个示例代码:
import torch
x = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
chunks = torch.chunk(x, chunks=3, dim=0)
for chunk in chunks:print(chunk)

在上述代码中,我们创建了一个形状为(3, 3)的张量x。然后,我们使用torch.chunk()函数将x沿着dim=0的维度分成3块。
最后,我们使用for循环遍历每个分块,并打印出来。运行代码后,输出如下:

tensor([[1, 2, 3]])
tensor([[4, 5, 6]])
tensor([[7, 8, 9]])

可以看到,x被分成了3个块,每个块是一个形状为(1, 3)的张量。


1.4 torch.split()

torch.split()是PyTorch中的一个函数,用于将张量沿着指定维度进行切分。
函数的参数包括:

  • tensor:要切分的输入张量。
  • split_size_or_sections:切分的大小或切分的份数。当split_size_or_sections为整数时,表示每一份的长度;当split_size_or_sections为列表时,按照列表元素进行切分。
  • dim(可选):指定要切分的维度,默认为0。
    函数返回一个张量列表,包含切分后的张量。
    以下是一个示例代码:
import torch
x = torch.tensor([[1, 2, 3, 4, 5],[6, 7, 8, 9, 10],[11, 12, 13, 14, 15]])
splits = torch.split(x, split_size_or_sections=2, dim=1)
for split in splits:print(split)

在上述代码中,我们创建了一个形状为(3, 5)的张量x。然后,我们使用torch.split()函数将x沿着dim=1的维度切分为大小为2的块。
最后,我们使用for循环遍历每个切分块,并打印出来。运行代码后,输出如下:

tensor([[ 1,  2],[ 6,  7],[11, 12]])
tensor([[ 3,  4],[ 8,  9],[13, 14]])
tensor([[ 5],[10],[15]])

可以看到,x被切分成了3个块,每个块的大小为(3, 2)(3, 2)(3, 1)


(2)张量索引

2.1 torch.index_select()

torch.index_select()是PyTorch中的一个函数,用于按索引从输入张量中选择元素。
函数的参数包括:

  • input:输入张量。
  • dim:指定按哪个维度进行选择。
  • index:选择元素的索引。可以是一个张量或一个整数列表。
  • out(可选):输出张量,用于存储结果。
    函数返回一个新的张量,包含按索引选择的元素。
    以下是一个示例代码:
import torch# 创建一个输入张量
import torch# 创建一个输入张量
x = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 创建一个索引张量
indices = torch.tensor([0, 2])# 使用 torch.index_select() 函数按索引从输入张量中选择元素
selected = torch.index_select(x, dim=0, index=indices)# 打印选择的结果
print(selected)

在上述代码中,我们创建了一个形状为(3, 3)的张量x。然后,我们使用torch.index_select()函数从x中按dim=0的维度选择索引为[0, 2]的元素。
最后,我们打印出选择的结果。运行代码后,输出如下:

tensor([[1, 2, 3],[7, 8, 9]])

可以看到,选择的结果是一个形状为(2, 3)的张量,其中包含了x中索引为02的两行。

2.2 torch.masked_select()

功能:按mask中的True进行索引
返回值:一维张量
• input: 要索引的张量
• mask: 与input同形状的布尔类型张量

import torch
# 创建一个输入张量
input = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
# 创建一个掩码张量
mask = torch.tensor([[1, 0, 1],[0, 1, 0],[1, 0, 1]], dtype=torch.bool)
# 使用 torch.masked_select() 函数根据掩码从输入张量中选择元素
output = torch.masked_select(input, mask)
print(output)

这段代码使用了 torch.masked_select() 函数,它的作用是根据掩码 mask 从输入张量 input 中选择元素。
在代码中,我们首先创建了一个形状为 (3, 3) 的输入张量 input。然后,我们创建了一个与输入张量形状相同的掩码张量 mask,其中的元素为布尔类型,用来指示要选择的元素。
接下来,我们调用 torch.masked_select() 函数,传入输入张量 input 和掩码张量 mask。函数会根据掩码选择对应位置为 True 的元素,并返回一个新的张量。
最后,我们将选择的结果存储在输出张量 output 中,并打印出来。运行代码后,输出如下:

tensor([1, 3, 5, 7, 9])

可以看到,输出张量 output 包含了输入张量 input 中掩码为 True 的元素。

(3)张量变换

3.1 torch.reshape()

功能:变换张量形状
注意事项:当张量在内存中是连续时,新张量与input共享数据内存
• input: 要变换的张量
• shape: 新张量的形状

import torch
# 创建一个输入张量
input = torch.tensor([[1, 2, 3],[4, 5, 6]])
# 使用 torch.reshape() 函数改变张量的形状
output = torch.reshape(input, (3, 2))
print(output)

这段代码使用了 torch.reshape() 函数,它的作用是改变张量的形状。
在代码中,我们首先创建了一个形状为 (2, 3) 的输入张量 input。然后,我们调用 torch.reshape() 函数,传入输入张量 input 和目标形状 (3, 2)
函数会将输入张量 input 改变为目标形状 (3, 2),并返回一个新的张量。
最后,我们将改变形状后的结果存储在输出张量 output 中,并打印出来。运行代码后,输出如下:

tensor([[1, 2],[3, 4],[5, 6]])

可以看到,输出张量 output 的形状已经被改变为 (3, 2),其中的元素顺序与输入张量 input 保持一致。

3.2 torch.transpose()

功能:交换张量的两个维度
• input: 要变换的张量
• dim0: 要交换的维度
• dim1: 要交换的维度

import torch
# 创建一个输入张量
input = torch.tensor([[1, 2, 3],[4, 5, 6]])
# 使用 torch.transpose() 函数交换张量的维度
output = torch.transpose(input, 0, 1)
print(output)

这段代码使用了 torch.transpose() 函数,它的作用是交换张量的维度。
在代码中,我们首先创建了一个形状为 (2, 3) 的输入张量 input。然后,我们调用 torch.transpose() 函数,传入输入张量 input 和要交换的维度 dim0=0dim1=1
函数会将输入张量 input 的维度 0 和维度 1 进行交换,并返回一个新的张量。
最后,我们将交换维度后的结果存储在输出张量 output 中,并打印出来。运行代码后,输出如下:

tensor([[1, 4],[2, 5],[3, 6]])

可以看到,输出张量 output 的维度已经被交换,形状变为 (3, 2),其中的元素顺序与输入张量 input 保持一致。

3.3 torch.t()

功能:2维张量转置,对矩阵而言,等价于 torch.transpose(input, 0, 1)

import torch
# 创建一个输入张量
input = torch.tensor([[1, 2, 3],[4, 5, 6]])
# 使用 torch.t() 函数转置张量
output = torch.t(input)
print(output)

这段代码使用了 torch.t() 函数,它的作用是对张量进行转置操作。
在代码中,我们首先创建了一个形状为 (2, 3) 的输入张量 input。然后,我们调用 torch.t() 函数,传入输入张量 input
函数会将输入张量 input 进行转置,并返回一个新的张量。
最后,我们将转置后的结果存储在输出张量 output 中,并打印出来。运行代码后,输出如下:

tensor([[1, 4],[2, 5],[3, 6]])

可以看到,输出张量 output 的维度已经被转置,形状变为 (3, 2),其中的元素顺序与输入张量 input 保持一致

3.4 torch.squeeze()

功能:压缩长度为1的维度(轴)
• dim: 若为None,移除所有长度为1的轴;若指定维度,当且仅当该轴长度为1时,可以被移除;

import torch
# 创建一个输入张量
input = torch.tensor([[[1, 2, 3],[4, 5, 6]]])
# 使用 torch.squeeze() 函数去除张量的尺寸为 1 的维度
output = torch.squeeze(input)
print(output)

这段代码使用了 torch.squeeze() 函数,它的作用是去除张量中尺寸为 1 的维度。
在代码中,我们首先创建了一个形状为 (1, 2, 3) 的输入张量 input。然后,我们调用 torch.squeeze() 函数,传入输入张量 input
函数会去除输入张量 input 中尺寸为 1 的维度,并返回一个新的张量。
最后,我们将去除尺寸为 1 的维度后的结果存储在输出张量 output 中,并打印出来。运行代码后,输出如下:

tensor([[1, 2, 3],[4, 5, 6]])

可以看到,输出张量 output 的形状已经被修改,尺寸为 1 的维度被去除,变为 (2, 3)


3.5 torchunsqueeze()

功能:依据dim扩展维度
• dim: 扩展的维度

抱歉,我之前给出的回答有误。在PyTorch中没有 torch.usqueeze() 函数。正确的函数是 torch.unsqueeze(),它的作用是在指定的维度上增加一个大小为1的维度。
以下是使用 torch.unsqueeze() 函数的示例代码:

import torch
# 创建一个输入张量
input = torch.tensor([[1, 2, 3],[4, 5, 6]])
# 使用 torch.unsqueeze() 函数在维度0上增加一个大小为1的维度
output = torch.unsqueeze(input, dim=0)
print(output)

在这个示例中,我们创建了一个形状为 (2, 3) 的输入张量 input。然后,我们调用 torch.unsqueeze() 函数,传入输入张量 input 和要增加维度的维度索引 dim=0
函数会在维度0上增加一个大小为1的维度,并返回一个新的张量。
最后,我们将增加维度后的结果存储在输出张量 output 中,并打印出来。运行代码后,输出如下:

tensor([[[1, 2, 3],[4, 5, 6]]])

可以看到,输出张量 output 的形状已经被修改,维度0上增加了一个大小为1的维度。

二、张量数学运算

一、加减乘除

  1. torch.add(input, other, alpha=1):将输入张量 input 和另一个张量 other 按元素相加,并返回结果张量。可选参数 alpha 控制相加的缩放因子。
    torch.add() 功能:逐元素计算 input+alpha×other
    • input: 第一个张量
    • alpha: 乘项因子
    • other: 第二个张量

torch.add(input, alpha=1, other, out=None) 是一个用于执行张量相加操作的函数。
参数说明:

  • input:输入张量。
  • alpha:一个可选的缩放因子,默认为1。它用于将 other 张量与 input 张量相乘后再相加。
  • other:另一个张量,与 input 张量进行相加操作。
  • out:可选的输出张量,用于存储结果。
    函数功能:
    该函数将输入张量 input 与另一个张量 other 进行按元素相加的操作,并返回结果张量。如果提供了 out 参数,结果将存储在 out 张量中;否则,将创建一个新的张量来存储结果。
    请注意,inputother 的形状必须是可广播的,否则会引发错误。广播机制允许在不同形状的张量之间执行按元素操作。
    示例用法:
import torch
input = torch.tensor([1, 2, 3])
other = torch.tensor([4, 5, 6])
result = torch.add(input, alpha=2, other=other)
print(result)  # 输出: tensor([9, 12, 15])

在这个示例中,input 张量为 [1, 2, 3]other 张量为 [4, 5, 6]alpha 参数为2。函数将 inputother 相乘得到 [2, 4, 6],然后再与 other 相加得到结果 [6, 9, 12]

  1. torch.addcdiv(input, tensor1, tensor2, value=1):将输入张量 input 与张量 tensor1 的按元素除法结果与张量 tensor2 相乘,然后加上一个标量值 value,并返回结果张量。

在这里插入图片描述

  1. torch.addcmul(input, tensor1, tensor2, value=1):将输入张量 input 与张量 tensor1 的按元素乘法结果与张量 tensor2 相加,然后加上一个标量值 value,并返回结果张量。
    在这里插入图片描述

torch.addcmul(input, value=1, tensor1, tensor2, out=None) 是一个执行逐元素乘法和加法操作的函数。
参数说明:

  • input:输入张量。
  • value:一个可选的缩放因子,默认为1。它用于将 tensor1tensor2 相乘后再与 input 相加。
  • tensor1:第一个张量,与 tensor2 相乘。
  • tensor2:第二个张量,与 tensor1 相乘。
  • out:可选的输出张量,用于存储结果。
    函数功能:
    该函数将输入张量 inputtensor1tensor2 进行逐元素相乘,并将结果与 input 相加。如果提供了 out 参数,结果将存储在 out 张量中;否则,将创建一个新的张量来存储结果。
    请注意,inputtensor1tensor2 的形状必须是可广播的,否则会引发错误。广播机制允许在不同形状的张量之间执行按元素操作。
    示例用法:
import torch
input = torch.tensor([1, 2, 3])
tensor1 = torch.tensor([4, 5, 6])
tensor2 = torch.tensor([2, 3, 4])
result = torch.addcmul(input, value=0.5, tensor1=tensor1, tensor2=tensor2)
print(result)  # 输出: tensor([5., 7.5, 10.])

在这个示例中,input 张量为 [1, 2, 3]tensor1 张量为 [4, 5, 6]tensor2 张量为 [2, 3, 4]value 参数为0.5。函数将 tensor1tensor2 逐元素相乘得到 [8, 15, 24],然后再与 input 相加得到结果 [9, 17, 27]

  1. torch.sub(input, other):将输入张量 input 和另一个张量 other 按元素相减,并返回结果张量。
  2. torch.div(input, other):将输入张量 input 和另一个张量 other 按元素相除,并返回结果张量。
  3. torch.mul(input, other):将输入张量 input 和另一个张量 other 按元素相乘,并返回结果张量。

二、对数,指数,幂函数

  1. torch.log(input, out=None):计算输入张量 input 的自然对数,并返回结果张量。
  2. torch.log10(input, out=None):计算输入张量 input 的以10为底的对数,并返回结果张量。
  3. torch.log2(input, out=None):计算输入张量 input 的以2为底的对数,并返回结果张量。
  4. torch.exp(input, out=None):计算输入张量 input 的指数函数,即 e^x,其中 e 是自然对数的底数,并返回结果张量。
  5. torch.pow(input, exponent, out=None):计算输入张量 input 的每个元素的指数幂,指数由参数 exponent 指定,并返回结果张量。

三、三角函数

  1. torch.abs(input, out=None):计算输入张量 input 的绝对值,并返回结果张量。
  2. torch.acos(input, out=None):计算输入张量 input 的反余弦值(弧度制),并返回结果张量。
  3. torch.cosh(input, out=None):计算输入张量 input 的双曲余弦值,并返回结果张量。
  4. torch.cos(input, out=None):计算输入张量 input 的余弦值(弧度制),并返回结果张量。
  5. torch.asin(input, out=None):计算输入张量 input 的反正弦值(弧度制),并返回结果张量。
  6. torch.atan(input, out=None):计算输入张量 input 的反正切值(弧度制),并返回结果张量。
  7. torch.atan2(input, other, out=None):计算输入张量 input 与另一个张量 other 的反正切值(弧度制),并返回结果张量。

三、线性回归

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import torch
import matplotlib.pyplot as plt# 设置随机种子
torch.manual_seed(10)# 学习率
lr = 0.05# 创建训练数据
x = torch.rand(20, 1) * 10  # x data (tensor), shape=(20, 1)
y = 2*x + (5 + torch.randn(20, 1))  # y data (tensor), shape=(20, 1)# 构建线性回归参数
w = torch.randn((1), requires_grad=True)  # 权重 w,随机初始化
b = torch.zeros((1), requires_grad=True)  # 偏置 b,初始化为零# 迭代训练
for iteration in range(1000):# 前向传播wx = torch.mul(w, x)  # wx = w * xy_pred = torch.add(wx, b)  # y_pred = wx + b# 计算 MSE lossloss = (0.5 * (y - y_pred) ** 2).mean()# 反向传播loss.backward()# 更新参数b.data.sub_(lr * b.grad)  # 更新偏置 bw.data.sub_(lr * w.grad)  # 更新权重 w# 清零梯度w.grad.zero_()b.grad.zero_()# 绘图if iteration % 20 == 0:plt.cla()  # 清除当前图形plt.scatter(x.data.numpy(), y.data.numpy())  # 绘制训练数据的散点图plt.plot(x.data.numpy(), y_pred.data.numpy(), 'r-', lw=5)  # 绘制当前的拟合线plt.text(2, 20, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color': 'red'})  # 显示当前的损失值plt.xlim(1.5, 10)plt.ylim(8, 28)plt.title("Iteration: {}\nw: {} b: {}".format(iteration, w.data.numpy(), b.data.numpy()))  # 显示当前的迭代次数和参数值plt.pause(0.5)if loss.data.numpy() < 1:breakplt.show()  # 显示图形

这段代码是一个简单的线性回归模型的训练过程,并且使用 matplotlib 库将训练过程可视化。

  • 代码首先导入了 torch 和 matplotlib.pyplot 库,并设置了随机种子。
  • 接下来,代码创建了训练数据,其中 x 是一个形状为 (20, 1) 的随机张量,y 是根据公式 2*x + (5 + 随机噪声) 生成的张量。
  • 然后,代码定义了线性回归模型的参数 w 和 b,它们都是需要梯度计算的张量。

在每次迭代中,代码进行了以下操作:

  1. 前向传播:根据当前的 w 和 b 计算预测值 y_pred。
  2. 计算均方误差(MSE)损失函数。
  3. 反向传播:根据损失函数计算梯度。
  4. 更新参数:使用学习率 lr 和梯度更新参数 w 和 b。
  5. 清零梯度:使用 w.grad.zero_() 和 b.grad.zero_() 清零参数的梯度。

每隔 20 次迭代,代码会绘制训练数据的散点图,并在图中绘制当前的拟合线。同时,代码还会显示当前的损失值和参数 w、b 的数值。如果损失值小于 1,代码会提前结束训练。最后,通过 plt.show() 显示图形。

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

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

相关文章

simulink代码生成(六)——多级中断的配置

假如系统中存在多个中断&#xff0c;需要合理的配置中断的优先级与中断向量表&#xff1b;在代码生成中&#xff0c;要与中断向量表对应&#xff1b;中断相关的知识参照博客&#xff1a; DSP28335学习——中断向量表的初始化_中断向量表什么时候初始化-CSDN博客 F28335中断系…

【计算机毕业设计】SSM汽车维修预约平台

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色&#xff1a; 管理员登录,新增管理员信息,查看管理员信息,查询管理员信息,查看用户信息列表,查询用户信息,新增新闻公告,查看新闻公告,查询新闻公告,新增配件类…

matplotlib范围曲线简例

想在画&#xff08;平均&#xff09;loss 曲线时顺便表示方差&#xff0c;即每一个 epoch 的平均 loss 用 plot 画曲线&#xff0c;而在曲线周围用一个浅色区域表示方差。效果&#xff1a; 参考 [1-3]&#xff0c;用到 matplotlib.pyplot.fill_between 函数。为显示对浅色区及…

不吹不黑,辩证看待开发者是否需要入坑鸿蒙

前言 自打华为2019年发布鸿蒙操作系统以来&#xff0c;网上各种声音百家争鸣。尤其是2023年发布会公布的鸿蒙4.0宣称不再支持Android&#xff0c;更激烈的讨论随之而来。 本文没有宏大的叙事&#xff0c;只有基于现实的考量。 通过本文&#xff0c;你将了解到&#xff1a; Har…

Python列表推导式(for表达式)及用法

for 表达式&#xff08;列表推导式&#xff09;用于利用其他区间、元组、列表等可迭代对象创建新的列表。 for 表达式的语法格式如下&#xff1a; [表达式 for 循环计数器 in 可迭代对象] 从上面的语法格式可以看出&#xff0c;for 表达式与普通 for 循环的区别有以下两点&a…

什么是JavaScript

文章目录 一、❄️什么是JavaScript&#xff1f;二、❄️JavaScript的特点三、❄️JavaScript的组成&#x1f9eb;1、核心&#xff08;ECMAScript&#xff09;&#x1f9ff;2、文档对象模型&#xff08;DOM&#xff09;&#x1f94f;3、浏览器对象模型&#xff08;BOM&#xff…

深入理解MySQL索引底层数据结构

听课问题(听完课自己查资料) 什么是二叉树 二叉树是怎么存储数据的一个链表是一个集合的数据结构 List是怎么便利找到指定下标元素为什么会快&#xff1f;什么是红黑树 红黑树是怎么存储数据的什么是B TREE 是怎么存储数据的什么是BTREE 是怎么存储数据的 疑惑答案 a. 二叉树…

SQL性能优化-索引

1.性能下降sql慢执行时间长等待时间长常见原因 1&#xff09;索引失效 索引分为单索、复合索引。 四种创建索引方式 create index index_name on user (name); create index index_name_2 on user(id,name,email); 2&#xff09;查询语句较烂 3&#xff09;关联查询太多join&a…

如何学习TS?

文章目录 一. 8种内置基础类型.ts二. void、never、any、unknown类型void类型never类型any类型unknown类型总结&#xff1a;void和any在项目中是比较常见的&#xff0c;never和unknown不常用。 三. 数组和函数类型定义.ts四. 元组与交叉类型使用元组数组一般有同类型的值组成&a…

ubuntu 20.04 自由切换 python 的版本

问题描述 当前 ubuntu 20.04 默认安装了多个 python 的版本&#xff0c;执行 python 时&#xff0c;默认版本是 Python 2.7.18 zhangszzhangsz:~$ python Python 2.7.18 (default, Jul 1 2022, 12:27:04) [GCC 9.4.0] on linux2 Type "help", "copyright&quo…

url编码未转义导致参数丢失

原来的请求&#xff1a; "&url${ctx}/loanform/risk/loanItemRiskItemReport/main.ht?baseProductType${baseProductType}""&itemReportId"itemReportId修改后&#xff1a; 原因&#xff1a;请求地址拼接时&#xff0c;会判断name为url的属性是…

多模态大模型的前世今生

1 引言 前段时间 ChatGPT 进行了一轮重大更新&#xff1a;多模态上线&#xff0c;能说话&#xff0c;会看图&#xff01;微软发了一篇长达 166 页的 GPT-4V 测评论文&#xff0c;一时间又带起了一阵多模态的热议&#xff0c;随后像是 LLaVA-1.5、CogVLM、MiniGPT-5 等研究工作…

Impala4.x源码阅读笔记(三)——Impala如何管理Iceberg表元数据

前言 本文为笔者个人阅读Apache Impala源码时的笔记&#xff0c;仅代表我个人对代码的理解&#xff0c;个人水平有限&#xff0c;文章可能存在理解错误、遗漏或者过时之处。如果有任何错误或者有更好的见解&#xff0c;欢迎指正。 上一篇文章Impala4.x源码阅读笔记&#xff0…

simulink代码生成(五)——ePWM模块初级应用

前面分别讲到了SCI及ADC的配置及使用&#xff0c;现在梳理一下ePWM的配置和使用&#xff1b; 先打一些基础的DSP28335的基础知识&#xff1b; F28335 关于ePWM中断与SOC采样信号的一些思考_socasel-CSDN博客 F28335 ePWM模块简介——TMS320F28335学习笔记&#xff08;四&…

软件开发必知必会的计算机基础

1.计算机基本介绍 1.1 什么是计算机 计算机(Computer)俗称为电脑&#xff0c;计算机是一种高速计算的电子机器&#xff0c;计算机可以进行数值运算&#xff0c;逻辑判断&#xff0c;接收或者是存储信息数据(文本、图片、音频、视频)&#xff0c;按照存储在其内部的程序对海量的…

5.微服务代码模型

1.微服务代码模型 代码分层 在微服务代码模型里&#xff0c;我们分别定义了用户接口层、并分别为它们建立了interfaces、application、domain和infrastructure四个一级代码目录&#xff1b; interfaces(用户接口层): 它主要存放用户接口层与前端应用交互、数据转换和交互相关…

Ultra ISO 虚拟光驱修改光盘盘符

windows xp 环境 ultra iso 虚拟光驱修改光盘盘符 method 1. 在ultra iso 中 [选项]->[配置]->[虚拟光驱]&#xff0c;在新盘符里选指定盘符 ->[修改] method 2. 打开命令行&#xff0c;进入安装目录&#xff0c;如 "C:\Program Files\UltraISO\drivers"&…

Vue3复习笔记

目录 挂载全局属性和方法 v-bind一次绑定多个值 v-bind用在样式中 Vue指令绑定值 Vue指令绑定属性 动态属性的约束 Dom更新时机 ”可写的“计算属性 v-if与v-for不建议同时使用 v-for遍历对象 数组变化检测 事件修饰符 v-model用在表单类标签上 v-model还可以绑定…

【LMM 002】大型语言和视觉助手 LLaVA-1.5

论文标题&#xff1a;Improved Baselines with Visual Instruction Tuning 论文作者&#xff1a;Haotian Liu, Chunyuan Li, Yuheng Li, Yong Jae Lee 作者单位&#xff1a;University of Wisconsin-Madison, Microsoft Research, Columbia University 论文原文&#xff1a;htt…

JavaScript的三种引入的方式

目录 (一).什么是JS1.1JS的特点1.2JS的组成 (二).JS引用的三种方式2.1标签引用&#xff08;或嵌入式)2.2文件引用&#xff08;外链式&#xff09;2.3行内式 (三).JS三种引用方式的优缺点1.行内方式&#xff1a;2.标签引用&#xff08;或嵌入式&#xff09;&#xff1a;3.文件引…