Pytorch:一维卷积及其伴随的定义

文章目录

      • 一、数学表达
      • 二、步长
        • 2.1、步长的作用
        • 2.2、步长的示例
          • 步长为 1
          • 步长为 2
        • 2.3、总结
      • 三、零填充
        • 3.1、零填充的作用:
        • 3.2、类型和大小
        • 3.3、 应用示例
      • 四、通道数
        • 4.1、通道数的定义
        • 4.2、示例说明
        • 4.3、深度学习中的应用
      • 五、batch_size
        • 5.1、batch_size和数据形状
        • 5.2、举例解释
      • 六、nn.Conv1d函数
        • 6.1、功能和使用
        • 6.2、参数详解
        • 6.3、pytorch中的卷积核
        • 6.4、示例代码

基础请移步:卷积的数学原理。

  一维卷积运算是信号处理和机器学习中常见的一种运算,它主要用于信号的特征提取和分析。在机器学习,特别是深度学习领域,一维卷积经常被用于处理时间序列数据、语音信号等。

  一维卷积的基本原理是:一个一维的输入信号(通常是一串数字)通过一个滤波器(或称为卷积核),滤波器在输入信号上滑动,每次滑动覆盖信号的一部分,然后将覆盖部分的元素与滤波器的对应元素相乘,并将乘积相加,从而得到输出信号的一个元素。这个过程重复进行,直到滤波器覆盖了输入信号的所有部分。

一、数学表达

如果输入信号为 x [ n ] x[n] x[n] ,卷积核为 h [ k ] h[k] h[k],那么输出 y [ n ] y[n] y[n] 可以用以下卷积公式表示:
y [ n ] = ∑ k = − ∞ ∞ x [ k ] ⋅ h [ n − k ] y[n] = \sum_{k=-\infty}^{\infty} x[k] \cdot h[n-k] y[n]=k=x[k]h[nk]
实际应用中, x [ n ] x[n] x[n] h [ k ] h[k] h[k] 都是有限长度的,所以求和也是在有限的范围内进行。

二、步长

  在卷积运算中,步长Stride)是一个重要的参数,它定义了卷积核在进行卷积操作时在输入信号上每次计算移动的间隔。步长决定了输出信号的尺寸以及卷积操作的覆盖范围和重叠程度

2.1、步长的作用
  1. 控制输出大小步长较大时,卷积核覆盖输入信号的速度更快,因此输出的尺寸会更小;步长较小则输出尺寸更大。 输出尺寸和卷积核大小以及步长有关
  2. 调节覆盖和重叠:步长较小意味着卷积核在信号上的滑动有更多的重叠,这可能会捕捉到更细微的特征,但也会增加计算量;较大的步长可能会遗漏一些特征,但计算更快,特别是对于大尺寸的输入信号。
2.2、步长的示例

考虑一个简单的一维卷积例子,假设我们有以下输入信号和卷积核:

  • 输入信号 x = [ 1 , 2 , 3 , 4 , 5 ] x = [1, 2, 3, 4, 5] x=[1,2,3,4,5]
  • 卷积核 h = [ − 1 , 0 , 1 ] h = [-1, 0, 1] h=[1,0,1]
步长为 1

当步长为 1 时,卷积核从输入信号的第一个元素开始,每次向右移动 1 个元素。计算每个位置的输出如下:

  • 第一个位置: 1 × 1 + 2 × 0 + 3 × − 1 = 1 − 3 = − 2 1 \times 1 + 2 \times 0 + 3 \times -1 = 1 - 3 = -2 1×1+2×0+3×1=13=2
  • 第二个位置: 2 × 1 + 3 × 0 + 4 × − 1 = 2 − 4 = − 2 2 \times 1 + 3 \times 0 + 4 \times -1 = 2 - 4 = -2 2×1+3×0+4×1=24=2
  • 第三个位置: 3 × 1 + 4 × 0 + 5 × − 1 = 3 − 5 = − 2 3 \times 1 + 4 \times 0 + 5 \times -1 = 3 - 5 = -2 3×1+4×0+5×1=35=2

输出信号为 [ − 2 , − 2 , − 2 ] [-2, -2, -2] [2,2,2]

步长为 2

当步长为 2 时,卷积核每次向右移动 2 个元素。计算每个位置的输出如下:

  • 第一个位置: 1 × 1 + 2 × 0 + 3 × − 1 = 1 − 3 = − 2 1 \times 1 + 2 \times 0 + 3 \times -1 = 1 - 3 = -2 1×1+2×0+3×1=13=2
  • 第二个位置: 3 × 1 + 4 × 0 + 5 × − 1 = 3 − 5 = − 2 3 \times 1 + 4 \times 0 + 5 \times -1 = 3 - 5 = -2 3×1+4×0+5×1=35=2

输出信号为 [ − 2 , − 2 ] [-2, -2] [2,2]

2.3、总结

步长的选择依赖于特定的应用需求和所需的输出尺寸。较小的步长可以提供更高的特征分辨率,但增加了计算成本;较大的步长则可以减少计算量和输出尺寸,但可能会牺牲一些特征的捕获。在设计卷积网络或处理信号时,合理选择步长是实现良好性能和效率的关键。

三、零填充

零填充Zero-padding)是在处理信号或图像时常用的一种技术,尤其是在执行卷积操作时。这种技术涉及在输入数据的边界周围添加额外的零值,具体可以是数据的开始、结束、或是两者。

3.1、零填充的作用:
  • 调整输出尺寸

    • 在不使用零填充的情况下,卷积操作通常会缩小输出的尺寸,因为卷积核可能无法完全覆盖输入数据的边缘部分。通过添加零填充,可以人为地扩大输入数据的尺寸,使得卷积核能够在输入的实际边缘也进行操作,从而保持输出数据的尺寸不变或按预定方式改变。
  • 提升边缘处理性能

    • 在许多情况下,数据的边缘包含重要信息。如果不使用零填充,这些信息在卷积过程中可能会被忽略或不足够重视,因为卷积核只能在数据的中间区域完全展开。零填充确保了边缘区域能够得到与中心区域相似的处理,从而允许网络更好地学习和利用这些边缘信息。
  • 保持空间一致性

    • 在特定的应用,如图像处理和特征检测中,保持输出的空间尺寸与输入一致是很重要的,因为这样可以保留位置信息,使得每个输出单元与输入数据中的相应位置对应。这对于进行图像分割、物体检测等任务尤其关键。
3.2、类型和大小

零填充可以有不同的类型和大小:

  • Valid Padding:不添加任何零,仅在原始数据内部进行卷积。这通常会缩小输出尺寸。
  • Same Padding:添加足够的零以使输出大小等于输入大小。这通常需要在输入数据的周围均匀添加零。
  • Full Padding:添加足够的零以让卷积核可以完全覆盖每个数据点,包括所有边缘。这会导致输出大小大于输入大小。

按照输出长度不同,卷积可分为三类:

  • 窄卷积
    • 使用这种卷积方式时,输出尺寸会小于输入尺寸。具体来说,如果输入大小是 n n n,卷积核大小是 k k k,则输出尺寸是 n − k + 1 n−k+1 nk+1
  • 宽卷积
    • 使用这种卷积方式时,输出尺寸会大于输入尺寸。具体来说,如果输入大小是 n n n,卷积核大小是 k k k,则输出尺寸是 n + k + 1 n+k+1 n+k+1
  • 等宽卷积:输出长度和输入长度相同。
3.3、 应用示例

假设我们有一个一维信号 [3, 1, 2, 5] 和一个卷积核 [1, 0, -1],且我们希望输出大小与输入相同。

  • 无填充:卷积操作将缩减输出长度。
  • 使用Same Padding:我们可以在序列开始和结束各添加一个零:[0, 3, 1, 2, 5, 0]。这样,卷积操作可以在每个原始数据点上进行,输出长度保持不变。

通过这种方式,零填充不仅可以控制输出尺寸,还可以影响模型学习到的特征类型,尤其是在处理边界区域时。这使得它在深度学习和信号处理中成为一项非常重要的技术。


下面将先介绍通道数、batch_size的含义。

四、通道数

在处理多维数据如图像、音频或其他形式的输入时,"通道数"这一概念非常关键。在深度学习和信号处理中,通道数通常指的是数据的一个特定维度,用来区分不同类型的信息。

4.1、通道数的定义
  • 对于图像数据,通道数可以是指颜色通道。例如,常见的彩色图像通常有三个颜色通道:红色、绿色和蓝色(RGB)。灰度图像只有一个通道。
  • 对于音频数据,通道数可以指立体声中的左右声道,单声道音频只有一个通道,而立体声音频有两个。
  • 在深度学习模型中,通道数还可以指特征映射的数量,这通常是在通过卷积网络的各层后产生的。例如,一层可能会生成多个特征映射,每个映射都可以视为一个独立的"通道"。
4.2、示例说明
  1. 图像示例
    • RGB 图像tensor([[[255, 0, 0], [0, 255, 0], [0, 0, 255]], ...])
      这里,最外层的维度可能有多个元素,每个元素代表一个像素的RGB值,所以这个图像的通道数是3。
    • 灰度图像tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
      这里,整个数据只有一个颜色层次,因此是单通道图像。
      简单解释一下灰度图像是个啥:RGB图像中每个像素点对应于三个通道中的一个RGB值,而灰度图像中每个像素点对应于灰度图像单通道上的一个值,这个值是灰度值,0表示黑色,255/65535表示白色,在此之间的灰度值就是黑白的程度。
  2. 音频示例
    • 单声道音频tensor([0.1, 0.2, 0.3, ...])
      这个张量表示音频波形,且只有一个通道。
    • 立体声音频tensor([[0.1, 0.2], [0.1, 0.2], [0.1, 0.2], ...])
      这个张量中,每个内部数组包含两个元素,分别表示左声道和右声道的样本,因此是双通道音频。

由以上例子可以观察到,同一个维度的张量可能会有不同的通道数。数据的形状并不总能直接告诉我们哪一个维度是通道维度,特别是在处理高维数据时。 显式指明通道数有助于明确数据的组织方式,确保数据在处理过程中被正确解释。

4.3、深度学习中的应用

在使用例如PyTorch的深度学习框架中,数据的形状通常是 (batch_size, channels, ...其他维度...)。例如,一批大小为10的RGB图像可能具有形状 (10, 3, 224, 224),其中 3 表示RGB三个颜色通道。

通道数的概念在设计和训练神经网络模型时非常重要,因为不同的输入和处理层可能需要调整以适应不同的通道数,特别是在构建卷积神经网络时。

五、batch_size

在机器学习和深度学习中,batch_size是一个基本且重要的概念,它指的是每次迭代(每个训练步骤)中用于训练模型的数据样本数量batch_size 直接影响模型训练的效率、速度和稳定性,是超参数调整过程中的关键因素之一。

5.1、batch_size和数据形状

在构建深度学习模型时,输入数据通常需要具有固定的形状,以便模型可以正确地处理数据。数据形状中的batch_size通常是形状的第一个维度,表示每次传递给网络的样本数。

  • 例如
    • 假设处理的是图像数据,每张图像的大小为 28x28 像素,且是灰度图。如果你设置batch_size=64,那么每次喂给模型的数据形状将是 (64, 28, 28),其中 64 是批量大小,表示有 64 张图像。
    • 对于彩色图像,如果每张图像是 28x28 像素且有3个颜色通道,则数据形状将是 (64, 3, 28, 28),其中 64 依然是批量大小。
5.2、举例解释

我们在conv1d函数中,需要指定`batch_size``和通道数,我们举例来说明一下为什么。

import torch# 设定 batch_size
batch_size = 4# 创建一个随机数据张量来模拟批量图像输入
# 形状 [batch_size, channels, height, width]
# 这里 channels=1 表示灰度图像,height=width=28 对应于图像的尺寸
images = torch.randn(batch_size, 1, 28, 28)

通过上述代码,我们可以发现形状 [batch_size, channels, height, width],实际上表示的是一个4维张量。张量的最高维是batch_size,意义是:每个批次训练数据是一个batch_size数量的 三维张量[channels, height, width]

  1. 第一维度 (batch_size)

    • 这一维度表示每个批次包含的独立数据项(通常是图像)的数量。在训练过程中,这允许模型同时处理多个数据项,从而提高计算效率和优化梯度下降。
  2. 第二维度 (channels)

    • 对于图像数据,这一维度通常表示图像的颜色通道。例如,彩色图像的RGB通道会有三个通道(红、绿、蓝),灰度图像则只有一个通道。在更复杂的应用中,如多光谱成像或特定类型的数据特征图,通道数可以更多。
  3. 第三维度和第四维度 (heightwidth)

    • 这两个维度表示每个图像的空间维度,即图像的高度和宽度。

六、nn.Conv1d函数

由于这里只是一维卷积运算,而函数不得不指明batch_size和输入通道数导致问题复杂起来,所以为了方便,你只需要把它们都认为是1,照着最开始卷积计算时只需要看输入信号长度和卷积核长度去理解即可。

因为一维卷积只是一维向量的卷积,批次和通道并不是计算的本质。所以理解这里为什么是一维卷积却需要输入三维张量很关键的在于计算卷积的到底是什么。

在PyTorch中,使用nn.Conv1d计算一维卷积,其期望的输入是一个三维张量,具有以下维度:[batch_size, in_channels, input_length]。同样,卷积核也需要转换成合适的维度。一般来说,卷积操作期望输入信号和卷积核的维度满足这种规范。

  • batch_size表示一次输入的样本数量,通常情况下使用1。
  • in_channels表示输入信号的通道数。
  • input_length表示输入信号的长度。

可以使用张量的.view()方法,修改为指定张量维度,最后一个参数为-1,可以自动计算最后一个维度的大小,比如:

import torch
x=torch.tensor([[1,2,1],[3,4,1]])
x=x.view(1,2,-1)
print(x)
tensor([[[1, 2, 1],[3, 4, 1]]])
6.1、功能和使用

nn.Conv1d 用于执行一维输入数据的卷积操作,这是通过滑动一个或多个卷积核(filters)来实现的,卷积核在输入数据的一个维度上移动(通常是时间或空间),用于提取特征。

6.2、参数详解

以下是创建 nn.Conv1d 的主要初始化参数

  • in_channels (int):输入信号的通道数。例如,对于单声道音频,此值为1;对于立体声音频,此值为2。
  • out_channels (int):卷积产生的输出通道数。这等于卷积核的数量。
  • kernel_size (int 或 tuple):卷积核的大小。如果是整数,则所有卷积核将有相同的大小;如果是元组,则指定每个维度的大小。
  • stride (int 或 tuple, 可选):卷积时卷积核的移动步长。默认为1。
  • padding (int 或 tuple, 可选):输入数据两端添加的零的层数。用于控制输出的空间维度。默认为0(无填充)。
  • dilation (int 或 tuple, 可选):卷积核中元素之间的间距。这被用来实现扩张卷积(dilated convolution),有助于增加感受野。默认为1。
  • groups (int, 可选):将输入分组,每个组使用不同的卷积核。这有助于减少参数数量。默认为1,表示不分组。
  • bias (bool, 可选):是否添加偏置项(b)。默认为True。

之后输入输入信号,输出的输出信号的维度它们的batch_size是一样的,因此最高维相同。输出信号的通道数由你指定,输出信号的长度根据卷积核变换。

6.3、pytorch中的卷积核
  • 卷积核的具体数据可以自己指定,也可以默认随机初始化。以下说的是卷积核的形状,不过在实际训练的时候不太需要考虑。
  • 卷积核的通道数和输入信号的通道数相同
  • 卷积核的“数量”和输出信号的通道数相同,即“每一个”卷积核会对输入信号进行一次计算得到输出信号的一个通道。
  • 卷积核形状=[output_channel,input_channel,卷积核大小] (二维也是如此)
  • 注意这里卷积核最高维的意义并不是batch_size
  • 最终输出信号的每个通道的长度还是得看每个卷积计算了之后的长度,输出信号的通道数只是看卷了多少次
    • 输入batch_size == 输出batch_size,相当于一次需要计算多少批,这并不影响卷积计算,而只是指明有多个堆需要计算样本,每一堆是一个整体。
    • 输入通道数 == 卷积核通道数,相当于每次卷积计算约束的条件(一维卷积通道数为1)
    • 输入通道数 == 卷积核通道数,相当于每次卷积计算约束的条件(一维卷积通道数为1)
    • 输出通道数 ==卷积核个数,相当于每个卷积核卷积计算输入信号之后得到输出信号的一个通道。
    • 卷积核大小+步长+填充影响了每个通道输出信号的长度。
6.4、示例代码

下面是一个简单的示例,展示如何在PyTorch中使用 nn.Conv1d

import torch
import torch.nn as nn# 创建输入数据:批大小为1,通道数为1,长度为10
input = torch.randn(1, 1, 10)# 创建Conv1d层
# 输入通道数为1,输出通道数为16,卷积核大小为3,步长为2,无填充
conv1d = nn.Conv1d(in_channels=1, out_channels=16, kernel_size=3, stride=2)# 应用卷积层到输入数据
output = conv1d(input)print("Input shape:", input.shape)
print("Output shape:", output.shape)

这个例子创建了一个 nn.Conv1d 层,它接受一个长度为10的一维信号,使用16个长度为3的卷积核进行卷积,步长为2,没有填充。输出结果的形状将根据输入参数而变化,可以通过输出的形状看到经过卷积层处理后的结果的维度。
这里默认随机初始化的一维卷积核:

  • 16个卷积核:输出通道数
  • 长度为3:kernel_size=3
  • 卷积核通道数:in_channels
  • 卷积核形状:[out_channels,in_channels,kernel_size]

也可以指定nn.Conv1d.weight.data,来指定卷积核(数据,形状等等)。

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

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

相关文章

AI赋能校园管理,打造平安智慧校园解决方案

背景: 2020年教育部办公厅印发《教育系统安全专项整治三年行动实施方案》,文中要求,学校在所辖范围内组织开展安全专项整治三年行动,健全完善安全责任体系,建立风险管控和隐患治理的安全防控体系,开展消防等…

在线药房数据惨遭Ransomhub窃取,亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件119起,与上周相比勒索事件有所增长。 本周Blacksuit是影响最严重的勒索家族,Ransomhub和Blackbasta恶意家族紧随其后,从整体上看Lockbit3.0依旧是影响最严重的勒索家族,需要注意防范。…

基于 YOLOv9 的自定义数据集目标检测

点击下方卡片,关注“小白玩转Python”公众号 在本指南中,我们将展示使用自定义数据集训练 YOLOv9 模型的过程。具体而言,我们将提供一个示例,重点介绍训练一个视觉模型来识别篮球场上的篮球运动员。但是,这个指南是多功…

并查集的实现与应用(力扣)

并查集的实现与应用(力扣) 并查集的实现力扣323 130 990 学习地址 并查集的实现 package com.caoii;/**program:labu-pratice-study*package:com.caoii*author: Alan*Time: 2024/4/12 21:53*description: 并查集的实现*/public class UnionFind {// 记…

Web中使用Weblogic用户

WebLogic用户,组设置 1. 登录weblogic console, domain结构中选择Security Realms,显示安装时默认创建的Realm : myrealm 2. 点击myrealm, 选择 users and Group, 追加用户和组 选择既存的权限组追加到新规的组中,赋予…

servicecomb bmi例子无法正常启动

前端报错404,后端显示:[ntloop-thread-7] o.a.s.c.rest.locator.OperationLocator : locate path failed, status:Not Found, http method:GET, path:/, microserviceName:gateway 原因: 在resource-->application.yml中: # …

java智慧校园系统源码saas电子班牌固件安卓7.1+Java Android原生系统源码

java智慧校园系统源码saas电子班牌固件安卓7.1+Java Android原生系统源码 智慧校园是促进信息技术与教育教学深度有效融合、提高学与教的效果为目的,以物联网、云计算、大数据分析等新技术为核心技术,提供一种环境全面感知、智慧型、数据化、…

数据结构——简单二叉树的性质和遍历

二叉树 两个值得注意的性质: 1.二叉树是有序树,这个我想了很久不知道为什么,可是为什么二叉树只有三种遍历方式,而不是六种?说明每个形态不同的树都有不同的含义。那完全二叉树和平衡二叉树呢?也是一样的…

.NET/C#汇总 —— 多线程

1.根据线程安全的相关知识,分析以下代码,当调⽤test⽅法时i>10时是否会引起死锁?并简要说 明理由。 public void test(int i) {lock(this){if (i>10){i--;test(i);}} } 不会发⽣死锁,(但有⼀点int是按值传递的,所以每次改变的都只是⼀个副本,因此不会出现死锁。…

Linux 删除文件或文件夹命令(新手)

一、删除文件夹 rm -rf 路径/目录名 1 强制删除文件夹及其子文件。 二、删除文件/文件夹:rm 命令 rm 删除命令,它可以永久删除文件系统中指定的文件或目录。 rm [选项] 文件或目录 选项: -f:强制删除(force&am…

前端大屏项目适配方法

要在F11全屏模式下查看 方法一,rem font-size 动态设置HTML根字体大小 和 body 字体大小(lib_flexible.js) 将设计稿的宽(1920)平均分成 24 等份, 每一份为 80px。HTML字体大小就设置为 80 px&#xff…

SonarQube 9.9.4 LTS社区版安装

目标 安装个SonarQube社区版. 安装SonarQube9.9.4 LTS社区版 https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.9.4.87374.zip # 切换到安装目录 cd /opt # 下载安装包 sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube…

[管理者与领导者-160] :社交策略和智慧-3,如何用积极的语言表达他人的赞美,构建和谐的人际关系

目录 一、用积极的语言表达他人的赞美他人的重要性 1.1 消极语言的危害 1.2 批评性语言的危害 1.3 积极的语言表达他人的赞美他人的重要性 二、有哪些积极的赞美他人的语言? 2.1 有哪些消极性语言 2.2 有哪些积极性语言 2.3 有哪些批评性语言 2.4 有哪些赞…

C语言--结构体大小

基本数据类型占用的字节数分别为:char(1),short(2),int(4),long(4),long long(8),float(4),double(8)。 分析一下下面结构体占用的字节数。 struct A { int a; }; struct B { char a; int b; }; int main() { printf("sizeof(struct A)%d\n", sizeof(struct A));//测…

Nginx小册(博客笔记迁移)

nginx基础 1.常用命令 nginx -v #查看版本 ps -ef | grep nginx #输出linux进程、 nginx #启动nginx进程 nginx -s reload #重载配置 nginx -s stop # 停止进程 nginx -t # 检查是否有语法错误,以及配置文件地址2.nginx的配置文件 # 用户组的设置 windows上不生…

Java面试题:什么是Java的集合框架?详细举例说明常用的集合,及其应用场景

Java的集合框架(Java Collections Framework)是Java编程语言中提供的一套用于表示和操作集合的统一架构。它包含了一系列接口、类和算法,用于创建和操作集合对象,如列表、集合、映射等。这些集合对象在Java程序中广泛用于存储和组…

支持0V充电700MA线性锂电池充电芯片-YB4055SL

支持0V充电700MA线性锂电池充电芯片 描述: YB4055SL是一款完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。其SOT 封装与较少的外部元件数目使得YB4055SL成为便携式应用的理想选择YB4055SL可以适合 USB 电源和适配器电源工作。 由于采用了内部PMOSFET架构&am…

微信小程序 uniapp+vue.js医疗在线问诊挂号系统4oy17

预约挂号系统的逐渐发展,进一步方便了广大用户,使其可以更方便、快捷地预约挂号,并且也有效地防止号贩子“倒号”,使用户预约挂号更公平,然而现有预约挂号系统或多或少有所欠缺 小程序前端框架:uniapp 小程…

AndroidAutomotive模块介绍(三)CarService服务

前言 上一篇文档总结 Android Automotive 框架的 APP 和 API 部分内容,本篇文档将会继续根据 Android Automotive 框架结构,总结 Framework 层 CarService 服务的内容。 本文档对 Android Automotive Framework 层服务将会按照如下顺序展开描述&#x…

windows搭建ftp服务器

安装iis 点击安装即可,搜索iis打开 创建ftp服务器 身份验证:只勾选匿名,不勾选基本,网上的很多教程会添加基本,导致的问题会出现浏览提需要输入账号密码的情况,这里为了方便大家更直观的感受FTP建立的过程&#xff0…