深入浅出理解转置卷积Conv2DTranspose

一、参考资料

【keras/Tensorflow/pytorch】Conv2D和Conv2DTranspose详解
怎样通俗易懂地解释反卷积?
转置卷积(Transposed Convolution)
抽丝剥茧,带你理解转置卷积(反卷积)

二、标准卷积(Conv2D)

在这里插入图片描述

1. Conv2D中的步长stride

1.1 当步长stride=1

在这里插入图片描述

输入特征图(蓝色): ( H i n , W i n ) = ( 4 , 4 ) (H_{in},W_{in})=(4,4) (Hin,Win)=(4,4)
卷积核: K = 3 , s t r i d e ( S ) = 1 , p a d d i n g = 0 K=3,stride(S)=1,padding=0 K=3,stride(S)=1padding=0
输出特征图(绿色): ( H o u t , W o u t ) = ( 2 , 2 ) (H_{out},W_{out})=(2,2) (Hout,Wout)=(2,2)

代入 公式 ( 1 ) 公式(1) 公式(1)中,可得:
H o u t = H i n + 2 p − K S + 1 H o u t = 4 + 2 ∗ 0 − 3 1 + 1 = 2 H_{out}=\frac{H_{in}+2p-K}S+1\\ H_{out}=\frac{4+2*0-3}1+1=2 Hout=SHin+2pK+1Hout=14+203+1=2

1.2 当步长stride=2

在这里插入图片描述

输入特征图(蓝色): ( H i n , W i n ) = ( 5 , 5 ) (H_{in},W_{in})=(5,5) (Hin,Win)=(5,5)
卷积核: K = 3 , s t r i d e ( S ) = 2 , p a d d i n g = 1 K=3,stride(S)=2,padding=1 K=3,stride(S)=2padding=1
输出特征图(绿色): ( H o u t , W o u t ) = ( 3 , 3 ) (H_{out},W_{out})=(3,3) (Hout,Wout)=(3,3)

代入 公式 ( 1 ) 公式(1) 公式(1)中,可得:
H o u t = H i n + 2 p − K S + 1 H o u t = 5 + 2 ∗ 1 − 3 2 + 1 = 3 H_{out}=\frac{H_{in}+2p-K}S+1\\ H_{out}=\frac{5+2*1-3}2+1=3 Hout=SHin+2pK+1Hout=25+213+1=3

2. Conv2D 计算公式

标准卷积计算公式有:
o = i + 2 p − K S + 1 i = size   of   input o = size   of   output p = p a d d i n g K = size   of   kernel S = s t r i d e s o=\frac{i+2p-K}S+1 \quad \begin{array}{l} \\i=\textit{size of input}\\o=\textit{size of output}\\p=padding\\K=\textit{size of kernel}\\S=strides\end{array} o=Si+2pK+1i=size of inputo=size of outputp=paddingK=size of kernelS=strides

以特征图的高度Height为例,经过卷积操作之后,输出特征图计算公式为:
H o u t = H i n + 2 p − K S + 1 ( 1 ) H_{out}=\frac{H_{in}+2p-K}S+1\quad(1) Hout=SHin+2pK+1(1)

三、转置卷积(Conv2DTranspose)

1. 引言

对于很多生成模型(如语义分割、自动编码器(Autoencoder)、GAN中的生成器等模型),我们通常希望进行与标准卷积相反的转换,即执行上采样。对于语义分割,首先用编码器提取特征图,然后用解码器恢复原始图像大小,这样来分类原始图像的每个像素。

实现上采样的传统方法是应用插值方案或人工创建规则。而神经网络等现代架构则倾向于让网络自动学习合适的变换,无需人类干预。为了做到这一点,我们可以使用转置卷积。

2. 对转置卷积名称的误解

转置卷积又叫反卷积、逆卷积。然而,转置卷积是目前最为正规和主流的名称,因为这个名称更加贴切的描述了Conv2DTranspose 的计算过程,而其他的名字容易造成误导。在主流的深度学习框架中,如TensorFlow,Pytorch,Keras中的函数名都是 conv_transpose。所以,学习转置卷积之前,我们一定要弄清楚标准名称,遇到他人说反卷积、逆卷积也要帮其纠正,让不正确的命名尽早的淹没在历史的长河中。

我们先说一下为什么人们很喜欢将转置卷积称为反卷积或逆卷积。首先举一个例子,将一个4x4的输入通过3x3的卷积核在进行普通卷积(无padding, stride=1),将得到一个2x2的输出。而转置卷积将一个2x2的输入通过同样3x3大小的卷积核将得到一个4x4的输出,看起来似乎是普通卷积的逆过程。就好像是加法的逆过程是减法,乘法的逆过程是除法一样,人们自然而然的认为这两个操作似乎是一个可逆的过程。转置卷积不是卷积的逆运算(一般卷积操作是不可逆的),转置卷积也是卷积。转置卷积并不是正向卷积的完全逆过程(逆运算),它不能完全恢复输入矩阵的数据,只能恢复输入矩阵的大小(shape)。所以,转置卷积的名字就由此而来,而并不是“反卷积”或者是“逆卷积”,不好的名称容易给人以误解。

有些地方,转置卷积又被称作 fractionally-strided convolution或者deconvolution,但 deconvolution 具有误导性,不建议使用。因此,本文将会使用两个名字,分别对应代码版和学术论文版,分别是 Conv2DTransposefractionally-strided convolutions

3. Conv2DTranspose的概念

转置卷积(Transposed Convolution)语义分割或者==对抗神经网络(GAN)==中比较常见,其主要作用是做上采样(UpSampling)。
在这里插入图片描述

4. Conv2DConv2DTranspose对比

转置卷积和标准卷积有很大的区别,直接卷积是用一个“小窗户”去看一个“大世界”,而转置卷积是用一个“大窗户”的一部分去看“小世界”。

标准卷积(大图变小图)中,输入(5,5),步长(2,2),输出(3,3)。

在这里插入图片描述

转置卷积操作中(小图变大图),输入(3,3)输出(5,5)。
在这里插入图片描述

5. Conv2DTranspose计算过程

转置卷积核大小为k,步长s,填充p,则转置卷积的计算步骤可以总结为三步:

  1. 第一步:对输入特征图变换(插值);
  2. 第二步:对卷积核变换,并padding新的输入特征图;
  3. 第三步:执行标准卷积操作。

5.1 第一步:对输入特征图变换(插值)

对输入特征图 m m m 进行插值(interpolation)零元素,得到新的输入特征图 m ′ m^{\prime} m

以特征图的高度Height为例,输入特征图的Height高为 H i n H_{in} Hin ,中间有 ( H i n − 1 ) (H_{in}-1) (Hin1) 个空隙。
两个相邻位置中间的插0个数: s − 1 s-1 s1 s s s 表示步长。
高度方向上总共插0个数: ( H i n − 1 ) ∗ ( s − 1 ) (H_{in}-1) * (s-1) (Hin1)(s1)
新的输入特征图的大小 H i n ′ = H i n + ( H i n − 1 ) ∗ ( s − 1 ) H_{in}^{\prime} = H_{in} + (H_{in}-1)*(s-1) Hin=Hin+(Hin1)(s1)

5.2 第二步:对卷积核变换,并padding新的输入特征图

对卷积核 k k k 进行上下、左右翻转,得到新的卷积核 k ′ k^{\prime} k。再对新的输入特征图四周填充padding零元素。

  1. 新卷积核 k ′ k^{\prime} k 大小不变: k ′ = k k^{\prime}=k k=k
  2. 新卷积核的步长stride永远不变 s ′ = 1 s^{\prime}=1 s=1
  3. 填充padding零元素个数: p ′ = k − p − 1 p^{\prime} = k-p-1 p=kp1
    在这里插入图片描述

5.3 第三步:执行标准卷积操作

变换后的卷积核变换后的输入特征图进行标准卷积操作,得到的结果就是转置卷积的结果。

根据标准卷积的计算公式可知:
H o u t = ( H i n ′ + 2 p ′ − k ′ ) s ′ + 1 ( 2 ) \mathrm{H_{out}}=\frac{(\mathrm{H_{in}^{\prime}}+2\mathrm{p^{\prime}}-\mathrm{k^{\prime}})}{\mathrm{s^{\prime}}}+1\quad(2) Hout=s(Hin+2pk)+1(2)

H ′ = H i n + ( H i n − 1 ) ∗ ( s − 1 ) H^{\prime} = H_{in} + (H_{in}-1)*(s-1) H=Hin+(Hin1)(s1)
p ′ = k − p − 1 p^{\prime} = k-p-1 p=kp1
k ′ = k k^{\prime}=k k=k

将第一、二步中变换的结果代入上式,可得:
H o u t = ( H i n + H i n ∗ s − H − s + 1 ) + 2 ∗ ( k − p − 1 ) − k s ′ + 1 ( 3 ) \text{H}_{out}=\frac{(\text{H}_{in}+\text{H}_{in}*s-\text{H}-\text{s}+1)+2*(\text{k}-\text{p}-1)-\text{k}}{\text{s}'}+1\quad(3) Hout=s(Hin+HinsHs+1)+2(kp1)k+1(3)
化简,可得:
H o u t = ( H i n − 1 )*s + k − 2 p − 1 s ′ + 1 ( 4 ) \text{H}_{out}=\frac{(\text{H}_{in}-1\text{)*s}+\text{k}-2\text{p}-1}{\text{s}'}+1\quad(4) Hout=s(Hin1)*s+k2p1+1(4)
上式中,分母步长 s ′ = 1 s^{\prime}=1 s=1,则最终结果为:
H o u t = ( H i n − 1 ) ∗ s − 2 p + k ( 5 ) \mathrm{H_out}=(\mathrm{H}_{in}-1)*\text{s}-2\text{p}+\mathrm{k}\quad(5) Hout=(Hin1)s2p+k(5)
综上所述,可以求得特征图Height和Width两个方向上进行转置卷积计算的结果:
H o u t = ( H i n − 1 ) × s t r i d e [ 0 ] − 2 × p a d d i n g [ 0 ] + k e r n e l _ s i z e [ 0 ] W o u t = ( W i n − 1 ) × s t r i d e [ 1 ] − 2 × p a d d i n g [ 1 ] + k e r n e l _ s i z e [ 1 ] H_{out}=(H_{in}−1)×stride[0]−2×padding[0]+kernel\_size[0]\\ W_{out}=(W_{in}−1)×stride[1]−2×padding[1]+kernel\_size[1] Hout=(Hin1)×stride[0]2×padding[0]+kernel_size[0]Wout=(Win1)×stride[1]2×padding[1]+kernel_size[1]
公式 ( 1 ) 公式(1) 公式(1) 公式 ( 5 ) 公式(5) 公式(5)可以看出, Conv2DConv2DTranspose 在输入和输出形状方面互为倒数

5.4 举例说明

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

输入特征图 m m m H i n = 3 H_{in}=3 Hin=3
输入卷积核kernel: K = ( 3 , 3 ) , S = 2 , p = 1 K=(3,3),S=2, p=1 K=(3,3),S=2,p=1
新的输入特征图 m ′ m^{\prime} m H i n ′ = 3 + ( 3 − 1 ) ∗ ( 2 − 1 ) = 3 + 2 = 5 H_{in}^{\prime}=3+(3−1)∗(2−1)=3+2=5 Hin=3+(31)(21)=3+2=5。注意加上padding之后才是7。
新的卷积核 K ′ K^{\prime} K K ′ = K , S ′ = 1 , p ′ = 3 − 1 − 1 = 1 K^{\prime}=K,S^{\prime}=1,p^{\prime}=3−1−1=1 K=K,S=1,p=311=1
转置卷积计算的最终结果: H o u t = ( 3 − 1 ) ∗ 2 − 2 ∗ 1 + 3 = 5 \mathrm{H_{out}}=(3-1)*2-2*1+3=5 Hout=(31)221+3=5

5.5 Conv2DTranspose示例

下图展示了转置卷积中不同s和p的情况:

| 在这里插入图片描述
| 在这里插入图片描述
| 在这里插入图片描述
|
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| s=1, p=0, k=3 | s=2, p=0, k=3 | s=2, p=1, k=3 |

6. Conv2DTranspose中的步长stride

6.1 当步长stride=1

在这里插入图片描述

输入特征图(蓝色): ( 2 , 2 ) (2,2) (2,2)
卷积核: K = 3 , s t r i d e ( S ) = 1 , p a d d i n g = 0 K=3,stride(S)=1, padding=0 K=3,stride(S)=1,padding=0
输出特征图(绿色): ( 4 , 4 ) (4,4) (4,4)

代入 公式 ( 5 ) 公式(5) 公式(5)中,可得:
H o u t = ( H i n − 1 ) ∗ S + K − 2 p H o u t = ( 2 − 1 ) ∗ 1 + 3 − 2 ∗ 0 = 4 \mathrm{H_out}=(\mathrm{H}_{in}-1)*\text{S}+\mathrm{K}-2\text{p}\\ \mathrm{H_out}=(2-1)*1+3-2*0=4 Hout=(Hin1)S+K2pHout=(21)1+320=4

6.2 当步长stride=2

在这里插入图片描述

输入特征图(蓝色): ( 3 , 3 ) (3,3) (3,3)
卷积核: K = 3 , s t r i d e ( S ) = 2 , p a d d i n g = 1 K=3,stride(S)=2, padding=1 K=3,stride(S)=2,padding=1
输出特征图(绿色): ( 5 , 5 ) (5,5) (5,5)

代入 公式 ( 5 ) 公式(5) 公式(5)中,可得:
H o u t = ( H i n − 1 ) ∗ S + K − 2 p H o u t = ( 3 − 1 ) ∗ 2 + 3 − 2 ∗ 1 = 4 \mathrm{H_out}=(\mathrm{H}_{in}-1)*\text{S}+\mathrm{K}-2\text{p}\\ \mathrm{H_out}=(3-1)*2+3-2*1=4 Hout=(Hin1)S+K2pHout=(31)2+321=4

7. 棋盘效应(Checkerboard Artifacts)

棋盘效应(Checkerboard Artifacts)
卷积操作总结(三)—— 转置卷积棋盘效应产生原因及解决
Deconvolution and Checkerboard Artifacts

棋盘效应是由于转置卷积的“不均匀重叠”(Uneven overlap)的结果,使图像中某个部位的颜色比其他部位更深。
在这里插入图片描述

8. 总结

  1. Conv2D,特征图变换:

H o u t = H i n + 2 p − K S + 1 H_{out}=\frac{H_{in}+2p-K}S+1 Hout=SHin+2pK+1

  1. Conv2DTranspose,特征图变换:

H o u t = ( H i n − 1 ) ∗ S − 2 p + K \mathrm{H_out}=(\mathrm{H}_{in}-1)*\text{S}-2\text{p}+\mathrm{K} Hout=(Hin1)S2p+K

  1. Conv2DConv2DTranspose 在输入和输出形状方面互为倒数
  2. 标准卷积(大图变小图,(5,5)到(3,3)),转置卷积(小图变大图,(3,3)到(5,5))。
  3. 第二步新卷积核的步长stride永远为1
  4. Conv2DTranspose()函数参数中的步长stride是指第三步进行标准卷积操作时的stride。

四、相关经验

tf.layers.Conv2DTranspose

TensorFlow函数:tf.layers.Conv2DTranspose

以 tensorflow2 框架的Conv2DTranspose为例,介绍转置卷积函数。

layers.Conv2DTranspose(
    filters,
    kernel_size,
    strides=(1, 1),
    padding='valid',
    output_padding=None,
    data_format=None,
    dilation_rate=(1, 1),
    activation=None,
    use_bias=True,
    kernel_initializer='glorot_uniform',
    bias_initializer='zeros',
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    **kwargs,
)
Docstring:     
Transposed convolution layer (sometimes called Deconvolution).

参数解释

  • filters:整数,输出空间的维数(即卷积中的滤波器数)。
  • kernel_size:一个元组或2个正整数的列表,指定过滤器的空间维度;可以是单个整数,以指定所有空间维度的相同值。
  • strides:一个元组或2个正整数的列表,指定卷积的步长;可以是单个整数,以指定所有空间维度的相同值。
  • padding:可以是一个"valid"或"same"(不区分大小写)。
  • data_format:一个字符串,可以是一个 channels_last(默认)、channels_first,表示输入中维度的顺序。channels_last 对应于具有形状(batch, height, width, channels)的输入,而 channels_first 对应于具有形状(batch, channels, height, width)的输入。
  • dilation_rate:。
  • activation:激活功能,将其设置为“None”以保持线性激活。
  • use_bias:Boolean,表示该层是否使用偏置。
  • kernel_initializer:卷积内核的初始化程序。
  • bias_initializer:偏置向量的初始化器,如果为None,将使用默认初始值设定项。
  • kernel_regularizer:卷积内核的可选正则化器。
  • bias_regularizer:偏置矢量的可选正则化器。
  • activity_regularizer:输出的可选正则化函数。
  • kernel_constraint:由Optimizer更新后应用于内核的可选投影函数(例如,用于实现层权重的范数约束或值约束);该函数必须将未投影的变量作为输入,并且必须返回投影变量(必须具有相同的形状);在进行异步分布式培训时,使用约束是不安全的。
  • bias_constraint:由Optimizer更新后应用于偏置的可选投影函数。
  • trainable:Boolean,如果为True,还将变量添加到图集合GraphKeys。TRAINABLE_VARIABLES中(请参阅参考资料 tf.Variable)。
  • name:字符串,图层的名称。

torch.nn.ConvTranspose2d

torch.nn.ConvTranspose2d

代码示例(TensorFlow)

#创建生成器
def make_generator_model():
    model = tf.keras.Sequential()#创建模型实例
    #第一层须指定维度 #batch无限制
    model.add(layers.Dense(7*7*BATCH_SIZE, use_bias=False, input_shape=(100,)))#Desne第一层可以理解为全连接层输入,它的秩必须小于2
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())
    
    model.add(layers.Reshape((7,7,256)))
    assert model.output_shape == (None,7,7,256)
    
    #转化为7*7*128
    model.add(layers.Conv2DTranspose(128,(5,5),strides=(1,1),padding='same',use_bias=False))
    assert model.output_shape == (None,7,7,128)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())
    
    #转化为14*14*64
    model.add(layers.Conv2DTranspose(64,(5,5),strides=(2,2),padding='same',use_bias=False))
    assert model.output_shape == (None,14,14,64)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())
 
    #转化为28*28*1
    model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False,activation='tanh'))
    assert model.output_shape == (None, 28, 28, 1)          
 
    return model

代码示例(PyTorch)

import torch
import torch.nn as nn


def transposed_conv_official():
    feature_map = torch.as_tensor([[1, 0],
                                   [2, 1]], dtype=torch.float32).reshape([1, 1, 2, 2])
    print(feature_map)
    trans_conv = nn.ConvTranspose2d(in_channels=1, out_channels=1,
                                    kernel_size=3, stride=1, bias=False)
    trans_conv.load_state_dict({"weight": torch.as_tensor([[1, 0, 1],
                                                           [0, 1, 1],
                                                           [1, 0, 0]], dtype=torch.float32).reshape([1, 1, 3, 3])})
    print(trans_conv.weight)
    output = trans_conv(feature_map)
    print(output)


def transposed_conv_self():
    feature_map = torch.as_tensor([[0, 0, 0, 0, 0, 0],
                                   [0, 0, 0, 0, 0, 0],
                                   [0, 0, 1, 0, 0, 0],
                                   [0, 0, 2, 1, 0, 0],
                                   [0, 0, 0, 0, 0, 0],
                                   [0, 0, 0, 0, 0, 0]], dtype=torch.float32).reshape([1, 1, 6, 6])
    print(feature_map)
    conv = nn.Conv2d(in_channels=1, out_channels=1,
                     kernel_size=3, stride=1, bias=False)
    conv.load_state_dict({"weight": torch.as_tensor([[0, 0, 1],
                                                     [1, 1, 0],
                                                     [1, 0, 1]], dtype=torch.float32).reshape([1, 1, 3, 3])})
    print(conv.weight)
    output = conv(feature_map)
    print(output)


def main():
    transposed_conv_official()
    print("---------------")
    transposed_conv_self()


if __name__ == '__main__':
    main()

输出结果

tensor([[[[1., 0.],
          [2., 1.]]]])
Parameter containing:
tensor([[[[1., 0., 1.],
          [0., 1., 1.],
          [1., 0., 0.]]]], requires_grad=True)
tensor([[[[1., 0., 1., 0.],
          [2., 2., 3., 1.],
          [1., 2., 3., 1.],
          [2., 1., 0., 0.]]]], grad_fn=<SlowConvTranspose2DBackward>)
---------------
tensor([[[[0., 0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0., 0.],
          [0., 0., 1., 0., 0., 0.],
          [0., 0., 2., 1., 0., 0.],
          [0., 0., 0., 0., 0., 0.],
          [0., 0., 0., 0., 0., 0.]]]])
Parameter containing:
tensor([[[[0., 0., 1.],
          [1., 1., 0.],
          [1., 0., 1.]]]], requires_grad=True)
tensor([[[[1., 0., 1., 0.],
          [2., 2., 3., 1.],
          [1., 2., 3., 1.],
          [2., 1., 0., 0.]]]], grad_fn=<ThnnConv2DBackward>)

Process finished with exit code 0

DCGAN

论文:Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux中的gcc\g++使用

文章目录 gcc\g的使用预处理编译汇编链接函数库gcc选项 gcc\g的使用 这里我们需要知道gcc和g实际上是对应的c语言和c编译器&#xff0c;而其他的Java&#xff08;半解释型&#xff09;&#xff0c;PHP&#xff0c;Python等语言实际上是解释型语言&#xff0c;因此我们经常能听…

【VB测绘程序设计】案例6——Mid\Right等字符串函数的应用(附源代码)

【VB测绘程序设计】案例6——Mid\Right等字符串函数的应用(附源代码) 文章目录 前言一、程序界面二、程序说明三、程序代码四、数据演示总结前言 VB编程中内部函数主要供用户调用,主要有数学运算符函数、字符串函数、转换函数、日期与时间函数、判断函数和格式输出函数等。…

YOLOv5改进 | ODConv卷积助力极限涨点(附修改后的C2f、Bottleneck模块代码)

一、本文介绍 这篇文章给大家带来的是发表于2022年的ODConv(Omni-Dimensional Dynamic Convolution)中文名字全维度动态卷积&#xff0c;该卷积可以即插即用&#xff0c;可以直接替换网络结构中的任何一个卷积模块&#xff0c;在本文的末尾提供可以直接替换卷积模块的ODConv&a…

HLS 2017.4 导出 RTL 报错:ERROR: [IMPL 213-28] Failed to generate IP.

软件版本&#xff1a;HLS 2017.4 在使用 HLS 导出 RTL 的过程中产生如下错误&#xff1a; 参考 Xilinx 解决方案&#xff1a;https://support.xilinx.com/s/article/76960?languageen_US 问题描述 DESCRIPTION As of January 1st 2022, the export_ip command used by Vivad…

SpingBoot的项目实战--模拟电商【2.登录】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringBoot电商项目的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.功能需求 二.代码编写 …

【STM32】程序在SRAM中运行

程序在RAM中运行 1、配置内存分配。 2、修改跳转文件 FUNC void Setup(void) { SP _RDWORD(0x20000000); PC _RDWORD(0x20000004); } LOAD RAM\Obj\Project.axf INCREMENTAL Setup(); 3、修改下载ROM地址和RAM地址&#xff1b; 中断向量表映射 中断向量表映射到SRA…

AI大模型引领未来智慧科研暨丨ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

某后台管理系统加密参数逆向分析

前言 在我们日常的渗透中经常会遇到开局一个登录框的情况&#xff0c;弱口令爆破当然是我们的首选。但是有的网站会对账号密码等登录信息进行加密处理&#xff0c;这一步不由得阻碍了很多人的脚步。前端的加解密是比较常见的&#xff0c;无论是 web 后台还是小程序&#xff0c…

ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现

ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建安装thinkphp6漏洞信息配置 漏洞利用 修复建议 漏洞名称 漏洞描述 2020年1月10日&#xff0c;ThinkPHP团队发布一个补丁更新&#xff0c;修复了一处由不安全的SessionId导致的任意文…

【MySQL】数据库并发控制:悲观锁与乐观锁的深入解析

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 数 据 库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 悲观锁&#xff08;Pessimistic Locking&#xff09;: 乐观锁&#xff08;Optimistic Locking&#xff09;: 总结&#x…

10. UVM Environment

环境为agents, scoreboards和其他验证组件&#xff08;包括有助于在 SoC 级别重用块级环境组件的其他环境类&#xff09;提供良好的层次结构和容器。用户定义的 env 类必须从 uvm_env 类扩展。 10.1 uvm_env class hierarchy 类声明&#xff1a; virtual class uvm_env extend…

2023.12.27 关于 Redis 数据类型 List 常用命令

目录 List 类型基本概念 List 类型特点 List 操作命令 LPUSH LPUSHX RPUSH RPUSHX LRANGE LPOP RPOP LINDEX LINSERT LREM LTRIM LSET 阻塞版本的命令 阻塞版本 和 非阻塞版本的区别 BLPOP & BRPOP List 类型基本概念 Redis 中的列表&#xff08;list&am…

水果软件2024FL Studio21.3mac苹果中文版

FL STUDIO21发布&#xff0c;提供您一直在等待的出色工作流程功能。通过新效果、多个播放列表曲目选择和无所畏惧的撤消一切编辑&#xff0c;将您的音乐带入2024年。FL Studio21中文完整版是一个功能齐全、开放式架构的PC音乐创作和制作环境。它具有基于音乐音序器的图形用户界…

flutter学习-day21-使用permission_handler进行系统权限的申请和操作

文章目录 1. 介绍2. 环境准备2-1. Android2-2. iOS 3. 使用 1. 介绍 在大多数操作系统上&#xff0c;权限不是在安装时才授予应用程序的。相反&#xff0c;开发人员必须在应用程序运行时请求用户的许可。在 flutter 开发中&#xff0c;则需要一个跨平台(iOS, Android)的 API 来…

Angular进阶之六:Progressive rendering

简介 Progressive Rendering 是一种提高 Web 应用性能的方法&#xff0c;允许页面在加载过程中逐步呈现&#xff0c;以提高用户体验。在本文中&#xff0c;我们将探讨如何在 Angular 中通过自定义指令实现 Progressive Rendering&#xff0c;特别是处理从服务器获取大量数据的…

flutter 安卓使用高德插件黑屏

地址 https://lbs.amap.com/api/android-sdk/guide/create-project/android-studio-create-project 下面介绍的方式是Native配置 sdk&#xff0c;也就是需要手动下载到本地在引入的方式 1、添加 jar 文件&#xff1a; 将下载的地图 SDK 的 jar包复制到工程&#xff08;此处截…

V-rep(CoppeliaSim)添加相机,与python联合仿真,并使用python读取V-rep中的RGB图与深度图

目录 前言在V-rep中构建场景建立python与V-rep通信 前言 本文主要介绍了如何使用python与V-rep联合仿真&#xff0c;并用OpenCV可视化V-rep中视觉传感器所能看到的 RGB图和深度图&#xff0c;效果图如下。 在V-rep中构建场景 本文使用的V-rep版本是3.5&#xff1a; 打开V-…

YOLOv5改进 | 2023注意力篇 | FocusedLinearAttention聚焦线性注意力

一、本文介绍 本文给大家带来的改进机制是FLAttention&#xff08;聚焦线性注意力&#xff09;是一种用于视觉Transformer模型的注意力机制(但是其也可以用在我们的YOLO系列当中从而提高检测精度)&#xff0c;旨在提高效率和表现力。其解决了两个在传统线性注意力方法中存在的…

【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于FSRCNN的TPU平台超分辨率模型部署方案

2023 CCF 大数据与计算智能大赛 基于TPU平台实现超分辨率重建模型部署 基于FSRCNN的TPU平台超分辨率模型部署方案 WELL 刘渝 人工智能 研一 西安交通大学 中国-西安 1461003622qq.com 史政立 网络空间安全 研一 西安交通大学 中国-西安 1170774291qq.com 崔琳、张…

Hive中支持毫秒级别的时间精度

实际上&#xff0c;Hive 在较新的版本中已经支持毫秒级别的时间精度。你可以通过设置 hive.exec.default.serialization.format 和 mapred.output.value.format 属性为 1&#xff0c;启用 Hive 的时间精度为毫秒级。可以使用以下命令进行设置&#xff1a; set hive.exec.defau…