转置卷积(一) 搞懂转置卷积的计算

news2024/9/23 5:27:35

搞懂转置卷积的计算

    • 0、参考文档
    • 1、转置卷积是什么?
      • 1.1 定义
      • 1.2 需要注意
    • 2、转置卷积的计算
      • 2.1 从最简单的开始
      • 2.2 考虑stride
      • 2.3 考虑padding
      • 2.4 考虑dilation
    • 3 转置卷积的加速

文章首发于https://zhaodongyu-ak47.github.io/Transposed_Convolution/

最近做了一些转置卷积的部署工作,最开始搞的时候其实有点晕头转向的,总是在用卷积的计算方式反过来理解转置卷积,尤其是padding部分和stride部分,搞得我头更大了。

现在也算是了解了具体工作机制以及加速方式,在这里整理总结一下。欢迎留言、指正 😃

0、参考文档

先敬上各位大佬的文档,这对我非常非常有帮助!

tf.keras.layers.Conv2DTranspose

What is Transposed Convolutional Layer?

一文搞懂反卷积,转置卷积

Up-sampling with Transposed Convolution

转置卷积(Transpose Convolution)

conv_transpose depth-wise优化技巧

图解转置卷积,我分别在conv_arithmetic和What is Transposed Convolutional Layer里看到,感觉后者更容易理解。

1、转置卷积是什么?

1.1 定义

转置卷积有时候也被称为反卷积,我个人认为反卷积有很强的误导性,因为这并不是卷积的逆运算,还是叫转置卷积比较好。

转置卷积在深度学习中表示为卷积的一个逆向过程,可以根据卷积核大小和输出的大小,恢复卷积前的feature map尺寸,而不是恢复原始值。

如果将卷积表示为y=Cx,转置卷积则是将的输入输出互换:x = CTy

其中, CT表示矩阵转置。

详细定义这里就不仔细介绍了,上文里的各个参考文档里说的都很明白。

1.2 需要注意

总结一下我认为的最重要的(最开始纠结了很久的)几个点:

  • 转置卷积不是恢复原始值,而是恢复原始尺寸(所以不要试图从卷积的逆运算角度考虑)

  • padding方式和卷积的padding是不一样的,转置卷积的实际padding是k-p-1

  • stride在这里用途不是跳几个数,而是用于判断填充几个0

  • 用公式法直接计算的话,首先对卷积核做中心对称操作(矩阵旋转180°)

  • 不考虑性能的话,直接按照转置卷积定义写。反之,一定要优化,不然慢得很。

The table below summarizes the two convolutions, standard and transposed.

Conv TypeOperationZero InsertionsPaddingStrideOutput Size
StandardDownsampling0ps(i+2p-k)/s+1
TransposedUpsampling(s-1)(k-p-1)1(i-1)*s+k-2p

2、转置卷积的计算

2.1 从最简单的开始

conv_transpose有一种最直接的计算方式:首先对卷积核做中心对称操作(矩阵旋转180°),并对输入feature map进行插0,然后把旋转后的卷积核和插0后的feature map进行卷积操作


现在假设输入的feature map是3x3大小,kernel size是3x3大小,stride为1, padding为0,即:

input_sz:     3
kernel_sz =   3
stride =      1
padding_sz =  0

写一段torch代码计算一下:

import torch
X = torch.Tensor([[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]])
K = torch.Tensor([[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]])
Y = torch.nn.functional.conv_transpose2d(X, K, stride=1, padding=0)
print(Y)

得到输出结果:

tensor([[[[  1.,   4.,  10.,  12.,   9.],
          [  8.,  26.,  56.,  54.,  36.],
          [ 30.,  84., 165., 144.,  90.],
          [ 56., 134., 236., 186., 108.],
          [ 49., 112., 190., 144.,  81.]]]])

计算过程:

(1) 对输入X进行处理,插入(s-1)的0,做(k-p-1)的padding

在这个例子中,s=1,则无需插入0,只进行(k-p-1)=(3-0-1)=2的padding。输入X则转化为

[ 1 2 3 4 5 6 7 8 9 ] − > [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 0 0 0 0 4 5 6 0 0 0 0 7 8 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix} -> \begin{bmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 2 & 3 & 0 & 0 \\ 0 & 0 & 4 & 5 & 6 & 0 & 0 \\ 0 & 0 & 7 & 8 & 9 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 \\0 & 0 & 0 & 0 & 0 & 0 & 0 \end{bmatrix} 147258369 > 0000000000000000147000025800003690000000000000000

(2) 对卷积核K进行中心对称操作

卷积核K则转化为为
[ 1 2 3 4 5 6 7 8 9 ] − > [ 9 8 7 6 5 4 3 2 1 ] \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix} -> \begin{bmatrix} 9 & 8 & 7 \\ 6 & 5 & 4 \\ 3 & 2 & 1 \end{bmatrix} 147258369 > 963852741

(3) 进行卷积计算
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 0 0 0 0 4 5 6 0 0 0 0 7 8 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] ∗ [ 9 8 7 6 5 4 3 2 1 ] = [ 1 4 10 12 9 8 26 56 54 36 30 84 165 144 90 56 134 236 186 108 49 112 190 144 81 ] \begin{bmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 2 & 3 & 0 & 0 \\ 0 & 0 & 4 & 5 & 6 & 0 & 0 \\ 0 & 0 & 7 & 8 & 9 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 \\0 & 0 & 0 & 0 & 0 & 0 & 0 \end{bmatrix} * \begin{bmatrix} 9 & 8 & 7 \\ 6 & 5 & 4 \\ 3 & 2 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 4 & 10 & 12 & 9 \\ 8 & 26 & 56 & 54 & 36 \\ 30 & 84 & 165 & 144 & 90 \\ 56 & 134 & 236 & 186 & 108 \\ 49 & 112 & 190 & 144 & 81 \end{bmatrix} 0000000000000000147000025800003690000000000000000 963852741 = 1830564942684134112105616523619012541441861449369010881

(4) gif图解

transposed_conv_S1P0

2.2 考虑stride

我个人建议不要用卷积的stride来理解转置卷积的stride,stride在这里用途不是跳几个数,而是用于判断填充几个0。


现在假设输入的feature map是3x3大小,kernel size是3x3大小,stride为2, padding为0,即:

input_sz:     3
kernel_sz =   3
stride =      2
padding_sz =  0

同样,写一段torch代码计算一下:

import torch
X = torch.Tensor([[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]])
K = torch.Tensor([[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]])
Y = torch.nn.functional.conv_transpose2d(X, K, stride=2, padding=0)
print(Y)

得到输出结果:

tensor([[[[  1.,   2.,   5.,   4.,   9.,   6.,   9.],
          [  4.,   5.,  14.,  10.,  24.,  15.,  18.],
          [ 11.,  16.,  40.,  26.,  60.,  36.,  45.],
          [ 16.,  20.,  44.,  25.,  54.,  30.,  36.],
          [ 35.,  46., 100.,  56., 120.,  66.,  81.],
          [ 28.,  35.,  74.,  40.,  84.,  45.,  54.],
          [ 49.,  56., 119.,  64., 135.,  72.,  81.]]]])

计算过程:

(1) 对输入X进行处理,插入(s-1)的0,做(k-p-1)的padding

在这个例子中,s=2,需插入1个0,进行(k-p-1)=(3-0-1)=2的padding。输入X则转化为

[ 1 2 3 4 5 6 7 8 9 ] − > [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 5 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 8 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix} -> \begin{bmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 2 & 0 & 3 & 0 & 0 \\0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 4 & 0 & 5 & 0 & 6 & 0 & 0 \\0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 7 & 0 & 8 & 0 & 9 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \end{bmatrix} 147258369 > 000000000000000000001040700000000000002050800000000000003060900000000000000000000

(2) 对卷积核K进行中心对称操作

卷积核K则转化为为
[ 1 2 3 4 5 6 7 8 9 ] − > [ 9 8 7 6 5 4 3 2 1 ] \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix} -> \begin{bmatrix} 9 & 8 & 7 \\ 6 & 5 & 4 \\ 3 & 2 & 1 \end{bmatrix} 147258369 > 963852741

(3) 进行卷积计算
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 5 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 8 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] ∗ [ 9 8 7 6 5 4 3 2 1 ] = [ 1 2 5 4 9 6 9 4 5 14 10 24 15 18 11 16 40 26 60 36 45 16 20 44 25 54 30 36 35 46 100 56 120 66 81 28 35 74 40 84 45 54 49 56 119 64 135 72 81 ] \begin{bmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 2 & 0 & 3 & 0 & 0 \\0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 4 & 0 & 5 & 0 & 6 & 0 & 0 \\0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 7 & 0 & 8 & 0 & 9 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \end{bmatrix}* \begin{bmatrix} 9 & 8 & 7 \\ 6 & 5 & 4 \\ 3 & 2 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 2 & 5 & 4 & 9 & 6 & 9\\ 4 & 5 & 14 & 10 & 24 & 15 & 18\\ 11 & 16 & 40 & 26 & 60 & 36 & 45\\ 16 & 20 & 44 & 25 & 54 & 30 & 36\\ 35 & 46 & 100 & 56 & 120 & 66 & 81\\ 28 & 35 & 74 & 40 & 84 & 45 & 54\\ 49 & 56 & 119 & 64 & 135 & 72 & 81 \end{bmatrix} 000000000000000000001040700000000000002050800000000000003060900000000000000000000 963852741 = 141116352849251620463556514404410074119410262556406492460541208413561536306645729184536815481

(4) gif图解

transposed_conv_S2P0

2.3 考虑padding

我最开始在padding这里疑惑了好一会儿,老是在从卷积的角度想转置卷积的padding。就很疑惑,怎么padding越大,计算结果的feature map越小呢?

后来也不想具体物理含义了,直接认为转置卷积的实际paddingk-p-1,万事大吉。


实际上,tensorflow的padding计算还是有点差异的,除了上面所说的计算,在计算padding的时候还有一个专门针对转置卷积的offset,这可能会导致 左右/上下 的padding数不一致。

为什么这么做呢?个人认为要从转置卷积的目的来看————还原原始feature map的尺寸。

本文暂不考虑这种情况,感兴趣的可以查看tensorflow源码。


现在假设输入的feature map是3x3大小,kernel size是3x3大小,stride为1, padding为1,即:

input_sz:     3
kernel_sz =   3
stride =      1
padding_sz =  1

写一段torch代码计算一下:

import torch
X = torch.Tensor([[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]])
K = torch.Tensor([[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]])
Y = torch.nn.functional.conv_transpose2d(X, K, stride=1, padding=1)
print(Y)

得到输出结果:

tensor([[[[ 26.,  56.,  54.],
          [ 84., 165., 144.],
          [134., 236., 186.]]]])

计算过程:

(1) 对输入X进行处理,插入(s-1)的0,做(k-p-1)的padding

在这个例子中,s=1,则无需插入0,只进行(k-p-1)=(3-1-1)=1的padding。输入X则转化为

[ 1 2 3 4 5 6 7 8 9 ] − > [ 0 0 0 0 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9 0 0 0 0 0 0 ] \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix} -> \begin{bmatrix} 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 2 & 3 & 0 \\ 0 & 4 & 5 & 6 & 0 \\ 0 & 7 & 8 & 9 & 0 \\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} 147258369 > 0000001470025800369000000

(2) 对卷积核K进行中心对称操作

卷积核K则转化为为

[ 1 2 3 4 5 6 7 8 9 ] − > [ 9 8 7 6 5 4 3 2 1 ] \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix} -> \begin{bmatrix} 9 & 8 & 7 \\ 6 & 5 & 4 \\ 3 & 2 & 1 \end{bmatrix} 147258369 > 963852741

(3) 进行卷积计算
[ 0 0 0 0 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9 0 0 0 0 0 0 ] ∗ [ 9 8 7 6 5 4 3 2 1 ] = [ 26 56 54 84 165 144 134 236 186 ] \begin{bmatrix} 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 2 & 3 & 0 \\ 0 & 4 & 5 & 6 & 0 \\ 0 & 7 & 8 & 9 & 0 \\ 0 & 0 & 0 & 0 & 0 \end{bmatrix}* \begin{bmatrix} 9 & 8 & 7 \\ 6 & 5 & 4 \\ 3 & 2 & 1 \end{bmatrix} = \begin{bmatrix} 26 & 56 & 54\\ 84 & 165 & 144 \\ 134 & 236 & 186\end{bmatrix} 0000001470025800369000000 963852741 = 26841345616523654144186

(4) gif图解

transposed_conv_S1P1

2.4 考虑dilation

这里就不考虑了,和卷积一样的,很容易理解。


3 转置卷积的加速

篇幅有限,转置卷积的加速工作就放到下一篇 转置卷积(二) 对转置卷积进行加速 吧


本文用图参考了aqeelanwar的代码,非常感谢。

图像压缩用了iloveimg,非常好用~

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

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

相关文章

数据结构入门-二叉树

树的概念及结构 树的概念 树的一种非线性的数据结构,它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树,也就是说它树根朝上,而叶子朝下。 有一个特殊的节点&#xff…

Web安全行业:零基础学习网络安全需要掌握哪些知识?(附系统路线+工具笔记)

前言 “没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。 一、网络安全行业特点 行业发展空间大,岗位非常多 网络安全行业产业以来,随即新增加了几十个…

单元测试 - 集成H2 Dao测测试

SpringBoot 2.7、Mybatis plus、H2 1. pom引入h2 <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>2.1.214</version> </dependency> 2. 配置h2数据源 & mapper路径 spring:datas…

地狱级的字节跳动面试,6年测开的我被按在地上摩擦.....

前几天我朋友跟我吐苦水&#xff0c;这波面试又把他打击到了&#xff0c;做了快6年软件测试员。。。为了进大厂&#xff0c;也花了很多时间和精力在面试准备上&#xff0c;也刷了很多题。但题刷多了之后有点怀疑人生&#xff0c;不知道刷的这些题在之后的工作中能不能用到&…

( 位运算 ) 260. 只出现一次的数字 III ——【Leetcode每日一题】

❓260. 只出现一次的数字 III 难度&#xff1a;中等 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额…

精炼计算机网络——数据链路层(一)

文章目录 前言3.1 数据链路和帧3.1.1 数据链路和帧3.1.2 三个基本问题 总结 前言 上篇文章&#xff0c;我们一同学完了物理层的全部内容&#xff0c;在本篇文章中&#xff0c;我们初步学习数据链路层&#xff0c;理解数据链路和帧的相应概念&#xff0c;知晓封装成帧&#xff…

信号完整性分析基础知识之传输线和反射(五):较短阻抗不连续的传输线、残桩和末端容性负载引起的反射

首先来一首定场诗&#xff1a;难难难&#xff0c;道德玄&#xff0c;不对知音不可谈。对了知音谈几句&#xff0c;不对知音枉费舌尖。 较短不连续点引起的反射 很多时候&#xff0c;板载走线的宽度必须要收窄&#xff0c;特别是经过PF区域或者拥挤区域。如果传输线的某一小段…

eSIM证书要求-证书验证-EID

SM-DP 和 SM-DS 应该验证 EUM 和 eUICC 证书中限制的 IIN 和 EID 的一致性&#xff08;参见第 4.5.2.1.0.2 和 4.5.2.1.0.3 节&#xff09;&#xff0c;并考虑 SGP.29 [ 89]。 根据 SGP.29 [89] 颁发的 EID 没有 SGP.02 [2] 中定义的 8 位 IIN。 相反&#xff0c;它们具有可变长…

【计算机视觉 | Python】十个 Python 图像处理工具,建议点赞收藏

文章目录 一、前言二、常见的库2.1 scikit-image2.2 NumPy2.3 SciPy2.4 PIL / Pillow2.5 OpenCV-Python2.6 SimpleCV2.7 Mahotas2.8 SimpleITK2.9 pgmagick2.10 Pycairo 一、前言 这些 Python 库提供了一种简单直观的方法来转换图像并理解底层数据。 今天的世界充满了数据&am…

linux【网络编程】之UDP网络程序模拟实现

linux【网络编程】之UDP网络程序模拟实现 一、开发环境二、服务端实现2.1 接口认识2.1.1 socket创建网络通信套接字2.1.2 bind&#xff1a;绑定Ip和端口号2.1.3 sockaddr_in结构体2.1.4 IP地址转换函数&#xff1a;inet_addr、inet_ntoa2.1.5 recvfrom&#xff1a;读取数据 2.2…

大语言模型进化树重磅发布,感慨技术方向选择的残酷,文末有彩蛋

文 / 高扬&#xff08;微信公众号&#xff1a;量子论&#xff09; 今天说点有深度的内容。五一假期&#xff0c;学习了一篇论文《Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond》。 这篇论文来自 Amazon 以及 Texas A&M University 研究团队&…

【2023 · CANN训练营第一季】应用开发深入讲解——第五章 端到端案例讲解

学习资源 样例介绍 使用DVPP加速预处理网络输入&#xff0c;并通过模型转换使能静态AIPP功能&#xff0c;使能AIPP功能后&#xff0c;YUV420SP_U8格式图片转化为RGB&#xff0c;然后减均值和归一化操作&#xff0c;并将该信息固化到转换后的离线模型中&#xff0c;对ResNet50…

传统IDC服务器迁移上云流程

上云是趋势&#xff0c;越来越多企业的IDC服务器选择迁移上云&#xff0c;迁移上云的方式有很多&#xff0c;阿里云提供服务器迁移中心SMC来帮助用户迁移上云。使用SMC服务器迁移中心&#xff0c;将您的源服务器方便快捷地迁移至阿里云&#xff0c;支持的迁移源类型包括IDC服务…

【Java EE 初阶】锁策略以及CAS问题

目录 1.常见的锁策略 1.乐观锁 vs 悲观锁 2.读写锁 3.重量级锁 vs 轻量级锁 4.自旋锁&#xff08;Spin Lock&#xff09; 5.公平锁 vs 非公平锁 6.可重入锁 vs 不可重入锁 7.Synchronized实现了哪些锁策略&#xff1f; 1.是乐观锁也是悲观锁 2.既是轻量级锁也是重量级…

K_A37_005 基于STM32等单片机驱动ADS1115 ADC模块 串口与OLED0.96双显示

K_A37_005 基于STM32等单片机驱动ADS1115 ADC模块 串口与OLED0.96双显示 所有资源导航一、资源说明二、基本参数参数引脚说明 三、驱动说明IIC时序对应程序: 四、部分代码说明1、接线引脚定义1.1、STC89C52RCADS1115 ADC模块1.2、STM32F103C8T6ADS1115 ADC模块 五、基础知识学习…

解决“未在本地计算机注册“OraOLEDB.Oracle.1”提供程序“问题

由于本地使用Oracle.ManagedDataAccess批量插入问题&#xff0c;连接数据库时报错 : ProviderOraOLEDB.Oracle;Data Sourceorcl;User IdQueueDp;PasswordQueueDp 此问题之前解决过没记录&#xff0c;又遇到了&#xff0c;忘了怎么解决&#xff0c;试了很多没效果 解决办法一、…

用好git stash,工作超nice

一、介绍 如果修改后的内容还不想commit&#xff0c;就可以用git stash命令。它会将工作区和暂存区中的修改(也就是还没commit的内容)都会被保存到堆栈里&#xff0c;并在之后恢复到任意指定的分支上。 二、应用场景 1、在分支a进行开发feature 1时&#xff0c;突然需要紧急…

2、Orangepi Zero2刷机和系统启动

目录 2.1 工具安装 2.2 刷机 2.3 登录系统 2.4 修改登陆密码 2.5 网络配置 2.6 SSH登陆开发板 就像买了电脑&#xff0c;出厂带有 windows 操作系统&#xff0c;才算是正在的电脑&#xff0c;开发板需要烧写对应的系统固件&#xff0c;才 能正常发挥作用 工具 Orangepi Zero2…

【异常解决】浏览器无法访问此网站ERR_UNSAFE_PORT/网页可能无法连接,或者它已永久性地移动到了新网址问题解决方案

浏览器无法访问此网站ERR_UNSAFE_PORT问题解决方案 一、问题描述二、问题原因三、解决方案3.1 方案1修改服务器访问端口号&#xff08;推荐&#xff09;3.2 方案2修改浏览器设置3.2.1 Chrome浏览器3.2.2 Firefox浏览器3.2.3 Edge浏览器 一、问题描述 访问某一个特定的网址之后…

Flume系列:Flume Channel使用

目录 Apache Hadoop生态-目录汇总-持续更新 1&#xff1a;Kafka Channel 2&#xff1a;File Channel 3&#xff1a;Memory Channel Apache Hadoop生态-目录汇总-持续更新 系统环境&#xff1a;centos7 Java环境&#xff1a;Java8 1&#xff1a;Kafka Channel Kafka Chan…