深度神经网络算子参数量和计算量分析—卷积篇

news2024/11/16 10:44:47

前言

在用于计算机视觉任务的深度神经网络模型中,卷积算子作为一种重要的特征提取方式被广泛应用,本文针对常见的卷积算子参数量和计算量的计算方法进行分析,主要包括普通卷积、深度可分离卷积、分组卷积,以及自动计算模型参数量和计算量的工具库ptflops进行简单介绍。


文章目录

    • 前言
    • 1. 普通卷积
      • (1) Params
      • (2) FLOPs
    • 2. 深度可分离卷积
      • (1) Params
      • (2) FLOPs
    • 3.分组卷积
      • (1) Params
      • (1) FLOPs
    • 4. ptflops


1. 普通卷积

在这里插入图片描述

对于普通的卷积算子,也就是让卷积核在特征图上按照既定规则进行滑动,并在每一个位置对应元素相乘后累加得到输出特征图的一个像素点。

我们假设输入特征图维度(宽、高、通道数)为 W i × H i × C i W_{i} \times H_{i} \times C_{i} Wi×Hi×Ci,卷积核的维度(宽、高、卷积核个数)为 K w × K h × C i K_{w} \times K_{h} \times C_{i} Kw×Kh×Ci,输出特征图的维度(宽、高、通道数)为 W o × H o × C o W_{o} \times H_{o} \times C_{o} Wo×Ho×Co

(1) Params

单个卷积核权重参数共有 K w × K h × C i K_{w} \times K_{h} \times C_{i} Kw×Kh×Ci偏置参数共有1个,共有 C o C_{o} Co个卷积核,因此,普通卷积算子的参数量为:

P a r a m s = ( K w × K h × C i + 1 ) × C o Params=(K_{w} \times K_{h} \times C_{i} +1) \times C_{o} Params=(Kw×Kh×Ci+1)×Co

(2) FLOPs

对于普通的卷积算子,卷积核在特征图上每滑动一次,将对应元素相乘后累加得到输出特征图中的一个像素点,因此,输出特征图中的一个像素点的计算量为:

( K w × K h × C i ) × ( K w × K h × C i − 1 ) + 1 (K_{w} \times K_{h}\times C_{i}) \times (K_{w} \times K_{h}\times C_{i}-1)+1 (Kw×Kh×Ci)×(Kw×Kh×Ci1)+1

其中 K w × K h × C i K_{w} \times K_{h}\times C_{i} Kw×Kh×Ci是做乘法运算的次数, K w × K h × C i − 1 K_{w} \times K_{h}\times C_{i}-1 Kw×Kh×Ci1是做加法运算的次数, + 1 +1 +1是加偏置运算的加法次数(每次滑动需要一次加偏置操作,或者理解为每一个输出特征像素需要一次加偏置操作)。

输出特征图的维度大小是 W o × H o × C o W_{o} \times H_{o} \times C_{o} Wo×Ho×Co,故对于普通的卷积算子总的计算量为:

F L O P s = [ ( K w × K h × C i ) × ( K w × K h × C i − 1 ) + 1 ] × W o × H o × C o = 2 × K w × K h × C i × W o × H o × C o FLOPs=[(K_{w} \times K_{h}\times C_{i}) \times (K_{w} \times K_{h}\times C_{i}-1)+1]\times W_{o} \times H_{o} \times C_{o}\\ = 2\times K_{w} \times K_{h} \times C_{i} \times W_{o} \times H_{o} \times C_{o} FLOPs=[(Kw×Kh×Ci)×(Kw×Kh×Ci1)+1]×Wo×Ho×Co=2×Kw×Kh×Ci×Wo×Ho×Co

2. 深度可分离卷积

在这里插入图片描述

对于深度可分离卷积算子,其主要由两部分操作组成,即深度卷积(上图Depthwise Convolution)和点卷积(上图Pointwise Convolution),深度卷积也叫逐通道卷积,具体实现为:对于输入特征图的每一个通道,都有一个对应的卷积核去和它做卷积运算,最后得到的特征图通道数和输入特征图通道数相同。点卷积即使用 1 × 1 1\times1 1×1大小的卷积核对特征图做普通卷积。

我们假设输入特征图的维度(宽、高、通道数)为 W i × H i × C i W_{i} \times H_{i}\times C_{i} Wi×Hi×Ci,深度可分离卷积中的深度卷积维度(宽、高、卷积核个数)为 K w × K h × C i K_{w} \times K_{h}\times C_{i} Kw×Kh×Ci,经过深度卷积后的维度(宽、高、通道数)为 W m × H m × C i W_{m} \times H_{m} \times C_{i} Wm×Hm×Ci,深度可分离卷积中的点卷积维度(宽、高、卷积核通道数卷积核个数)为 1 × 1 × C i × C o 1 \times 1 \times C_{i} \times C_{o} 1×1×Ci×Co,输出特征图的维度(宽、高、通道数)为 W o × H o × C o W_{o} \times H_{o}\times C_{o} Wo×Ho×Co

我们再对照着上面的假设理解一次深度可分离卷积的过程,首先对于 W i × H i × C i W_{i} \times H_{i}\times C_{i} Wi×Hi×Ci输入特征图进行深度卷积,即逐通道 W i × H i W_{i} \times H_{i} Wi×Hi和深度卷积核 K w × K h K_{w} \times K_{h} Kw×Kh进行卷积运算然后生成一张特征图,输入特征图的通道数和深度卷积核的个数都为于 C i C_{i} Ci,故深度卷积共有 C i C_{i} Ci张输出特征图,然后对深度卷积得到的 C i C_{i} Ci张输出特征图进行点卷积(普通卷积),即每一个点卷积核 1 × 1 × C i 1 \times 1 \times C_{i} 1×1×Ci和深度卷积得到的 C i C_{i} Ci张输出特征图进行普通卷积得到一张 W o × H o W_{o} \times H_{o} Wo×Ho的特征图,而点卷积的个数共有 C o C_{o} Co 个,故输出特征图维度为 W o × H o × C o W_{o} \times H_{o}\times C_{o} Wo×Ho×Co

理解其过程后,下面我们分析深度可分离卷积算子的参数量和计算量

(1) Params

对于深度卷积,单个卷积核的维度大小(宽、高、卷积核通道)为 K w × K h × 1 K_{w} \times K_{h}\times 1 Kw×Kh×1偏置参数共有1个, 共有 C i C_{i} Ci个深度卷积核,故其参数量为:

P a r a m s 深度卷积 = ( K w × K h × 1 + 1 ) × C i Params_{深度卷积} = (K_{w} \times K_{h} \times1+1) \times C_{i} Params深度卷积=(Kw×Kh×1+1)×Ci

对于点卷积,单个卷积核的维度大小(宽、高、卷积核通道)为 1 × 1 × C i 1 \times 1 \times C_{i} 1×1×Ci偏置参数共有1个, 共有 C o C_{o} Co个深度卷积核,故其参数量为:

P a r a m s 点卷积 = ( 1 × 1 × C i + 1 ) × C o Params_{点卷积} = (1 \times 1 \times C_{i}+1) \times C_{o} Params点卷积=(1×1×Ci+1)×Co

故,对于深度可分离卷积来说,其总的参数量为:

P a r a m s = P a r a m s 深度卷积 + P a r a m s 点卷积 = [ ( K w × K h + 1 ) × C i ] + [ ( 1 × 1 × C i + 1 ) × C o ] Params=Params_{深度卷积}+Params_{点卷积} =[(K_{w} \times K_{h}+1) \times C_{i}] + [(1 \times 1 \times C_{i}+1) \times C_{o}] Params=Params深度卷积+Params点卷积=[(Kw×Kh+1)×Ci]+[(1×1×Ci+1)×Co]

(2) FLOPs

对于深度卷积,同样的深度卷积核在特征图上每滑动一次,将对应元素相乘后累加得到输出特征图中的一个像素点,因此,输出特征图中的一个像素点的计算量为:

( K w × K h × 1 ) × ( K w × K h × 1 − 1 ) + 1 (K_{w} \times K_{h} \times1) \times (K_{w} \times K_{h} \times 1-1)+1 (Kw×Kh×1)×(Kw×Kh×11)+1

其中 K w × K h × 1 K_{w} \times K_{h} \times1 Kw×Kh×1是做乘法运算的次数, K w × K h × 1 − 1 K_{w} \times K_{h} \times1-1 Kw×Kh×11是做加法运算的次数, + 1 +1 +1是加偏置运算的加法次数(每次滑动需要一次加偏置操作,或者理解为每一个输出特征像素需要一次加偏置操作)。

注意:这里的 × 1 \times 1 ×1表示卷积核通道数,因为是逐通道卷积,也就是通道数为1的卷积运算。

深度卷积输出特征图的维度大小是 W m × H m × C i W_{m} \times H_{m}\times C_{i} Wm×Hm×Ci,故对于深度卷积算子总的计算量为:

F L O P s 深度卷积 = [ ( K w × K h ) × ( K w × K h − 1 ) + 1 ] × W m × H m × C i = 2 ⋅ ( K w × K h ) × W m × H m × C i FLOPs_{深度卷积} =[(K_{w} \times K_{h}) \times (K_{w} \times K_{h}-1)+1]\times W_{m} \times H_{m}\times C_{i}\\=2\cdot (K_{w} \times K_{h})\times W_{m} \times H_{m}\times C_{i} FLOPs深度卷积=[(Kw×Kh)×(Kw×Kh1)+1]×Wm×Hm×Ci=2(Kw×Kh)×Wm×Hm×Ci

对于点卷积,同样的点卷积核在特征图上每滑动一次,将对应元素相乘后累加得到输出特征图中的一个像素点,因此,输出特征图中的一个像素点的计算量为:

( 1 × 1 × C i ) × ( 1 × 1 × C i − 1 ) + 1 (1 \times 1 \times C_{i}) \times (1 \times 1 \times C_{i}-1)+1 (1×1×Ci)×(1×1×Ci1)+1

其中 1 × 1 × C i 1 \times 1 \times C_{i} 1×1×Ci是做乘法运算的次数, 1 × 1 × C i − 1 1 \times 1 \times C_{i}-1 1×1×Ci1是做加法运算的次数, + 1 +1 +1是加偏置运算的加法次数(每次滑动需要一次加偏置操作,或者理解为每一个输出特征像素需要一次加偏置操作)。

点卷积输出特征图的维度大小是 W o × H o × C o W_{o} \times H_{o}\times C_{o} Wo×Ho×Co,故对于点卷积算子总的计算量为:

F L O P s 点卷积 = [ ( 1 × 1 × C i ) × ( 1 × 1 × C i − 1 ) + 1 ] × W o × H o × C o = 2 ⋅ C i × W o × H o × C o FLOPs_{点卷积} =[(1 \times 1 \times C_{i}) \times (1 \times 1 \times C_{i}-1)+1] \times W_{o} \times H_{o}\times C_{o}\\ =2\cdot C_{i}\times W_{o} \times H_{o}\times C_{o} FLOPs点卷积=[(1×1×Ci)×(1×1×Ci1)+1]×Wo×Ho×Co=2Ci×Wo×Ho×Co

故对于深度可分离卷积来说,其总的计算量为:

F L O P s = F L O P s 深度卷积 + F L O P s 点卷积 = [ 2 ⋅ ( K w × K h ) × W m × H m × C i ] + [ 2 ⋅ C i × W o × H o × C o ] FLOPs=FLOPs_{深度卷积}+FLOPs_{点卷积} =[2\cdot (K_{w} \times K_{h})\times W_{m} \times H_{m}\times C_{i}] + [2\cdot C_{i}\times W_{o} \times H_{o}\times C_{o}] FLOPs=FLOPs深度卷积+FLOPs点卷积=[2(Kw×Kh)×Wm×Hm×Ci]+[2Ci×Wo×Ho×Co]

3.分组卷积

在这里插入图片描述

分组卷积是卷积神经网络中常用的一种卷积操作,它将输入的特征图分成若干组,每组特征图分别与对应的卷积核进行卷积操作,然后将各组的卷积结果拼接在一起形成最终的输出特征图。上图左边是普通卷积的示意图,右图是分组卷积的示意图,下面大概介绍一下分组卷积的基本流程:

  1. 输入特征图分组:将输入特征图按照通道数分成若干组,每组包含相等数量的通道。
  2. 分组卷积核:为每个分组准备对应的卷积核,每个卷积核组的数量与输入特征图的分组数量相同。
  3. 分组卷积操作:对每个分组的输入特征图分别使用对应的分组卷积核进行卷积操作,得到各组的卷积结果。
  4. 输出特征图拼接:将各组的卷积结果按照通道顺序进行拼接,形成最终的输出特征图。

分组卷积的主要优势在于可以减少参数量和计算量,同时提高模型的并行性,特别适用于计算资源有限的场景。这种技术在一些轻量级的神经网络结构中得到了广泛的应用。

我们假设分组卷积的分组数为 g g g组,输入特征图的维度(宽、高、通道数)为 W i × H i × C i W_{i} \times H_{i}\times C_{i} Wi×Hi×Ci,那么每一组输入特征图的维度(宽、高、通道数)为 W i × H i × C i g W_{i} \times H_{i} \times \frac{C_{i}}{g} Wi×Hi×gCi,共有 g g g组输入特征图;

卷积算子分组数同样为 g g g组,其维度(宽、高、通道数卷积核个数)为 K w × K h × C i g × C o g K_{w} \times K_{h} \times \frac{C_{i}}{g} \times \frac{C_{o}}{g} Kw×Kh×gCi×gCo

每一组中输入特征图和分组卷积核做卷积得到每一组的输出特征图维度为 W o × H o × C o g W_{o} \times H_{o} \times \frac{C_{o}}{g} Wo×Ho×gCo,g个组的输出特征图拼接在一起就是 W o × H o × C o W_{o} \times H_{o} \times C_{o} Wo×Ho×Co

理解其过程后,下面我们分析深度可分离卷积算子的参数量和计算量

(1) Params

对于单个分组卷积算子来说,其维度(宽、高、通道数)为 K w × K h × C i g K_{w} \times K_{h} \times \frac{C_{i}}{g} Kw×Kh×gCi偏置参数共有1个,单个分组的卷积核个数为 C o g \frac{C_{o}}{g} gCo,共有 g g g个分组卷积,故其参数量为:

P a r a m s = ( K w × K h × C i g + 1 ) × C o g × g Params=(K_{w} \times K_{h} \times \frac{C_{i}}{g}+1) \times \frac{C_{o}}{g}\times g Params=(Kw×Kh×gCi+1)×gCo×g

(1) FLOPs

对于分组卷积算子来说,同样的单个分组的卷积核在特征图上每滑动一次,将对应元素相乘后累加得到输出特征图中的一个像素点,因此,输出特征图中的一个像素点的计算量为:

( K w × K h × C i g ) + ( K w × K h × C i g − 1 ) + 1 (K_{w} \times K_{h} \times \frac{C_{i}}{g})+(K_{w} \times K_{h} \times \frac{C_{i}}{g}-1)+1 (Kw×Kh×gCi)+(Kw×Kh×gCi1+1

其中 K w × K h × C i g K_{w} \times K_{h} \times \frac{C_{i}}{g} Kw×Kh×gCi是做乘法运算的次数, K w × K h × C i g − 1 K_{w} \times K_{h} \times \frac{C_{i}}{g}-1 Kw×Kh×gCi1是做加法运算的次数, + 1 +1 +1是加偏置运算的加法次数(每次滑动需要一次加偏置操作,或者理解为每一个输出特征像素需要一次加偏置操作)。

单个分组的卷积输出特征图维度为 W o × H o × C o g W_{o} \times H_{o} \times \frac{C_{o}}{g} Wo×Ho×gCo,故对于单个分组卷积算子总的计算量为:

F L O P s 单个分组 = [ ( K w × K h × C i g ) + ( K w × K h × C i g − 1 ) + 1 ] × W o × H o × C o g FLOPs_{单个分组}=[(K_{w} \times K_{h} \times \frac{C_{i}}{g})+(K_{w} \times K_{h} \times \frac{C_{i}}{g}-1)+1]\times W_{o} \times H_{o} \times \frac{C_{o}}{g} FLOPs单个分组=[(Kw×Kh×gCi)+(Kw×Kh×gCi1+1]×Wo×Ho×gCo

又因为共有 g g g组操作,故其总的计算量为

F L O P s = [ ( K w × K h × C i g ) + ( K w × K h × C i g − 1 ) + 1 ] × W o × H o × C o g × g = 2 × K w × K h × C i g × W o × H o × C o FLOPs=[(K_{w} \times K_{h} \times \frac{C_{i}}{g})+(K_{w} \times K_{h} \times \frac{C_{i}}{g}-1)+1] \times W_{o} \times H_{o} \times \frac{C_{o}}{g}\times g\\ = 2\times K_{w} \times K_{h} \times \frac{C_{i}}{g} \times W_{o} \times H_{o} \times C_{o} FLOPs=[(Kw×Kh×gCi)+(Kw×Kh×gCi1+1]×Wo×Ho×gCo×g=2×Kw×Kh×gCi×Wo×Ho×Co

回顾一下普通卷积的参数量核计算量,可以发现分组卷积的参数量和计算量都是普通卷积的 1 g \frac{1}{g} g1倍。

4. ptflops

ptflops 是一个自动计算模型参数量和计算量的库,可以通过pip/conda直接下载,即

pip install ptflops

速度过慢时可以使用-i参数指定源,即

pip install ptflops -i https://pypi.tuna.tsinghua.edu.cn/simple

使用举例:

import torch
from torchvision.models import resnet18
from ptflops import get_model_complexity_info
  
model = resnet50()
macs, params = get_model_complexity_info(model, (3, 224, 224), as_strings=True,print_per_layer_stat=True, verbose=True)
                                           
print("MACs=", str(macs / 1e9) + '{}'.format("G"))
print("MACs=", str(macs / 1e6) + '{}'.format("M"))

虽然它可以自己计算模型的参数量和计算量,但是对一些自定义的层或算子不支持,并且不支持带有批量的计算。

参考:
全连接-普通卷积-深度可分离卷积-分组卷积-计算量和参数量
普通卷积、分组卷积和深度分离卷积概念以及参数量计算

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

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

相关文章

无人机交付:跨境电商的数字化未来

随着科技的不断进步,跨境电商行业正经历着前所未有的数字化变革。其中,无人机交付正成为这一领域的未来之路,为电商企业和消费者带来了新的便利和机遇。本文将深入探讨无人机交付在跨境电商中的应用,以及它如何塑造数字化未来。 无…

大促期间治理品牌窜货的诀窍

渠道问题中,最常见的是窜货,窜货还会伴随低价,会影响其他经销商的利益,同时窜货还可能带来假货,所以治理窜货是品牌的责任,对于出货量巨大的双十一大促,品牌更应重视对窜货问题的治理。 力维网络…

上课笔记(11.11之前笔记)

一.数据结构的分类 1.数据结构中分为四大类:线性表,哈希表,树,图。 2.线性表(line table):呈现线性结构的一种数据结构。具有顺序性,也就是所有数据都是有序的; 数组&…

(1)(1.14) LightWare SF10/SF11激光雷达

文章目录 前言 1 串行连接 2 I2C 连接 3 参数说明 前言 Lightware SF20 和 LW20 是体积小、测距远(100m)、精度高的测距仪。有两种型号,LW20/Ser 使用串行接口,LW20/I2C 使用 I2C 接口。 1 串行连接 对于串行连接&#xff0…

Autosar模块介绍:FEE(Flash模拟EEPROM)

上一篇 | 返回主目录 | 下一篇 Autosar模块介绍:FEE(Flash模拟EEPROM 1 基本术语解释2 Ea组成结构图3 Ea基本操作3.1 通用操作3.2 作业的进程(通用需求)3.3 读操作过程3.4 写操作过程3.5 擦除过程3.6 比较过程 4 Ea常用操作时序4.1 初始化4.…

uniapp打包安卓app获取包名

uniapp打包安卓app获取包名的两种方式 1.uniapp云打包 这上面直接可以看到包名,可以修改,也可以在 manifest.json 文件中配置修改 package配置的就是包名,要确保唯一性 2.使用aapt工具获取 1.下载aapt工具,然后添加到环境变量…

汽车FMCW毫米波雷达信号处理流程(推荐---基础详细---清楚的讲解了雷达的过程---强烈推荐)

毫米波雷达在进行多目标检测时,TX发射一个Chirp,在不同距离下RX会接收到多个反射Chirp信号(仅以单个chirp为例)。 雷达通过接收不同物体的发射信号,并转为IF信号,利用傅里叶变换将产生一个具有不同的分离峰…

高端NEV | 地表最强纯电,极氪001 FR上市做到“技惊四座”了吗?

百万超跑赛道越来越“香”,本以为它是来“凑热闹”的,竟成「地表最强」? “友商们,五年内造不出来!”的极氪001 FR上市口号火速传遍全网。 ◎图源网络 上周,号称地表最强纯电“战士”极氪001 FR在北京举行…

修改/etc/fstab文件导致Linux无法正常启动

如果把 /etc/fstab 文件修改错了,也重启了,系统崩溃启动不了了,那该怎么办?比如: [rootlocalhost ~]# vi /etc/fstab UUIDc2ca6f57-b15c-43ea-bca0-f239083d8bd2 ext4 defaults 1 1 UUID0b23d315-33a7-48a4-bd37-9248…

hive里因为列名用了关键字导致建表失败

代码 现象 ParseException line 6:4 cannot recognize input near percent String COMMENT in column name or primary key or foreign key 23/11/13 11:52:57 ERROR org.apache.hadoop.hive.ql.Driver: FAILED: ParseException line 6:4 cannot recognize input near percent …

C++编程案例讲解-评委打分案例

评委打分案例 案例说明 案例说明 有5名选手,10个评委分别对每一名选手打分,去除最高分,去除最低分,取平均分 要求以下步骤: 创建5名选手,放到vector中遍历vector容器,取出来每一位选手&#x…

Python爬取天气数据及可视化分析!

天气预报我们每天都会关注,我们可以根据未来的天气增减衣物、安排出行,每天的气温、风速风向、相对湿度、空气质量等成为关注的焦点。 本次使用python中requests和BeautifulSoup库对中国天气网当天和未来14天的数据进行爬取,保存为csv文件&a…

你知道调试一个 Web 的 Android 应用有多麻烦吗

你知道调试一个 Web 的 Android 应用有多麻烦吗 我用的 uniapp 写的页面,全是坑,各种坑,生命周期不触发等。但由于已经做完大部分内容了,也不好换了。 我用的是 capacitor h5 > Android 的方式 我的调试过程是这样的&#…

【Proteus仿真】【51单片机】停车场车位管理系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用按键、LED、蜂鸣器、LCD1602、红外传感器、74HC595模块等。 主要功能: 系统运行后,LCD1602显示进入、驶出、剩余车位数&am…

如何提取信号的包络

包络提取 如何提取信号的包络。 创建双边带振幅调制信号。载波频率为 1 kHz。调制频率为 50 Hz。调制深度为 100%。采样率为 10 kHz。 t 0:1e-4:0.1; x (1cos(2*pi*50*t)).*cos(2*pi*1000*t);plot(t,x) xlim([0 0.04]) 使用 hilbert 函数提取包络。包络是由 hilbert 计算的…

c语言:解决数组元素右旋问题,时间复杂度O(N)

题目: 给一个数组,如【1,2,3,4,5,6,7】,k3。 要求得到新数组【5,6,7,1,2,3,4】。 方法一,思路和…

CPS:实现销售和广告的完美结合

随着互联网的快速发展,电商行业呈现出爆炸性的增长。在这个充满竞争的市场中,如何有效地吸引和引导消费者购买产品,成为电商企业成功的关键。而CPS(Cost Per Sales)作为一种创新的广告模式,正逐渐成为电商行…

cadence virtuoso layout 创建保护环 GuardRing

本文使用的是smic130nm工艺库 参考文章:基于IC617创建保护环GuardRing(一)_版图保护环的意义-CSDN博客 SP GuardRing 按O,M1_SUB columns5 画出版图 量出各图层之间的间距,比如: CT-CT 0.18 CT-AA 0.0…

十大跑步运动耳机品牌,适合运动时戴的蓝牙耳机有哪些?

​运动耳机不仅具备出色的音质和舒适度,还有着强大的防汗防水功能,可以满足你在运动中的各种需求。无论你是喜欢户外跑步,还是喜欢室内健身,运动耳机都能为你提供优秀的音乐动力,让你更加享受运动的过程。那么怎么去选…

自动生成Form表单提交在苹果浏览器中的注意事项

以下是本人在公司旧系统中看到的该段代码 function Post(URL, PARAMTERS) {//创建form表单var temp_form document.createElement("form");temp_form.action URL;//如需打开新窗口,form的target属性要设置为_blanktemp_form.target "_blank"…