【动手学深度学习】多层感知机之暂退法问题研究详情

目录

🌊问题研究1

🌞问题研究2

🌲问题研究3

🌍问题研究4

🌳问题研究5

🌌问题研究6


🌊问题研究1

如果更改第一层和第二层的暂退法概率,会发生什么情况?具体地说,如果交换这两个层,会发生什么情况?设计一个实验来回答这些问题,定量描述该结果,并总结定性的结论

在原始的代码中,首先应用了nn.Linear层,然后在第一个全连接层之后添加了一个dropout层,接着是第二个全连接层,并在第二个全连接层之后添加了另一个dropout层。交换这两个层的顺序,即将第一个全连接层和第一个dropout层交换位置,第二个全连接层和第二个dropout层交换位置,那么模型的结构将发生变化。 如果增加第一层的Dropout概率,可能会导致模型在训练集上的准确度下降,但在测试集上的准确度可能会有所提高。这是因为较高的Dropout概率可以减少过拟合,从而改善模型的泛化能力。 如果增加第二层的Dropout概率,可能会导致模型在训练集和测试集上的准确度都下降。较高的Dropout概率可能导致模型丢失过多的信息,使其难以学习有效的表示。 如果交换第一层和第二层的位置,可能会对模型的性能产生影响,但具体效果取决于具体设置。这种变化可能会导致模型在训练过程中更早或更晚应用Dropout,从而影响模型的学习能力和泛化能力。

import torch
from torch import nn
from d2l import torch as d2ldef dropout_layer(X, dropout):assert 0 <= dropout <= 1if dropout == 1:return torch.zeros_like(X)if dropout == 0:return Xmask = (torch.rand(X.shape) > dropout).float()return mask * X / (1.0 - dropout)X = torch.arange(16, dtype=torch.float32).reshape((2, 8))
print(X)
print(dropout_layer(X, 0.))
print(dropout_layer(X, 0.5))
print(dropout_layer(X, 1.))num_inputs, num_outputs, num_hiddens1, num_hiddens2 = 784, 10, 256, 256dropout1, dropout2 = 0.2, 0.5class Net(nn.Module):def __init__(self, num_inputs, num_outputs, num_hiddens1, num_hiddens2,is_training=True):super(Net, self).__init__()self.num_inputs = num_inputsself.training = is_trainingself.lin1 = nn.Linear(num_inputs, num_hiddens1)self.lin2 = nn.Linear(num_hiddens2, num_hiddens1)  # 交换层的顺序self.lin3 = nn.Linear(num_hiddens1, num_outputs)  # 交换层的顺序self.relu = nn.ReLU()def forward(self, X):H1 = self.relu(self.lin1(X.reshape((-1, self.num_inputs))))if self.training == True:H1 = dropout_layer(H1, dropout1)H2 = self.relu(self.lin2(H1))if self.training == True:H2 = dropout_layer(H2, dropout2)out = self.lin3(H2)return outnet = Net(num_inputs, num_outputs, num_hiddens1, num_hiddens2)num_epochs, lr, batch_size = 10, 0.5, 256
loss = nn.CrossEntropyLoss(reduction='mean')
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
trainer = torch.optim.SGD(net.parameters(), lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

运行上述代码将会执行两个实验,分别是使用原始的dropout概率和交换了dropout概率的模型训练。

输出结果将包括每个epoch的训练损失、训练准确率和测试准确率。


🌞问题研究2

增加训练轮数,并将使用暂退法和不使用暂退法时获得的结果进行比较。

import torch
from torch import nn
from d2l import torch as d2ldef dropout_layer(X, dropout):assert 0 <= dropout <= 1if dropout == 1:return torch.zeros_like(X)if dropout == 0:return Xmask = (torch.rand(X.shape) > dropout).float()return mask * X / (1.0 - dropout)num_inputs, num_outputs, num_hiddens1, num_hiddens2 = 784, 10, 256, 256
dropout1, dropout2 = 0.2, 0.5class Net(nn.Module):def __init__(self, num_inputs, num_outputs, num_hiddens1, num_hiddens2, is_training=True):super(Net, self).__init__()self.num_inputs = num_inputsself.training = is_trainingself.lin1 = nn.Linear(num_inputs, num_hiddens1)self.lin2 = nn.Linear(num_hiddens1, num_hiddens2)self.lin3 = nn.Linear(num_hiddens2, num_outputs)self.relu = nn.ReLU()def forward(self, X):H1 = self.relu(self.lin1(X.reshape((-1, self.num_inputs))))if self.training == True:H1 = dropout_layer(H1, dropout1)H2 = self.relu(self.lin2(H1))if self.training == True:H2 = dropout_layer(H2, dropout2)out = self.lin3(H2)return outnet = Net(num_inputs, num_outputs, num_hiddens1, num_hiddens2)num_epochs, lr, batch_size = 50, 0.5, 256
loss = nn.CrossEntropyLoss(reduction='mean')
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
trainer = torch.optim.SGD(net.parameters(), lr=lr)train_loss, test_acc_dropout, test_acc_nodropout = d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)# Plotting the results
epochs = list(range(1, num_epochs + 1))plt.plot(epochs, train_loss, label='Train Loss')
plt.plot(epochs, test_acc_dropout, label='Test Accuracy (Dropout)')
plt.plot(epochs, test_acc_nodropout, label='Test Accuracy (No Dropout)')
plt.xlabel('Epochs')
plt.ylabel('Value')
plt.title('Training Loss and Test Accuracy')
plt.legend()
plt.show()

import torch
from torch import nn
import matplotlib.pyplot as plt
from d2l import torch as d2l# ... 省略定义模型和其他代码 ...def train(net, train_iter, test_iter, loss, num_epochs, optimizer):train_loss, test_acc_dropout, test_acc_nodropout = [], [], []for epoch in range(num_epochs):net.train()train_l_sum, train_acc_sum, n = 0.0, 0.0, 0for X, y in train_iter:optimizer.zero_grad()y_hat = net(X)l = loss(y_hat, y)l.backward()optimizer.step()# Record training losstrain_l_sum += l.item()train_acc_sum += (y_hat.argmax(dim=1) == y).sum().item()n += y.shape[0]# Calculate test accuracy with dropoutnet.eval()with torch.no_grad():test_acc_dropout.append(d2l.evaluate_accuracy(net, test_iter))# Calculate test accuracy without dropoutnet.training = Falsewith torch.no_grad():test_acc_nodropout.append(d2l.evaluate_accuracy(net, test_iter))net.training = Truetrain_loss.append(train_l_sum / n)print(f"Epoch {epoch + 1}, Loss: {train_loss[-1]:.4f}, Accuracy (Dropout): {test_acc_dropout[-1]:.4f}, Accuracy (No Dropout): {test_acc_nodropout[-1]:.4f}")return train_loss, test_acc_dropout, test_acc_nodropout# ... 定义模型、数据加载和优化器 ...train_loss, test_acc_dropout, test_acc_nodropout = train(net, train_iter, test_iter, loss, num_epochs, trainer)# Plotting the results
epochs = list(range(1, num_epochs + 1))plt.plot(epochs, train_loss, label='Train Loss')
plt.plot(epochs, test_acc_dropout, label='Test Accuracy (Dropout)')
plt.plot(epochs, test_acc_nodropout, label='Test Accuracy (No Dropout)')
plt.xlabel('Epochs')
plt.ylabel('Value')
plt.title('Training Loss and Test Accuracy')
plt.legend()
plt.show()

运行50个训练轮次,并记录训练损失、使用dropout时的测试准确率和不使用dropout时的测试准确率。然后,通过绘制训练损失和测试准确率随训练轮数的变化曲线,进行比较。


🌲问题研究3

当应用或不应用暂退法时,每个隐藏层中激活值的方差是多少?绘制一个曲线图,以显示这两个模型的每个隐藏层中激活值的方差是如何随时间变化的。

这段代码将绘制一个曲线图,其中包括两个隐藏层在应用和不应用Dropout时激活值的方差随时间变化的情况。图表中有四条曲线:Layer 1 (Dropout)表示应用Dropout时第一个隐藏层的方差,Layer 2 (Dropout)表示应用Dropout时第二个隐藏层的方差,Layer 1 (No Dropout)表示不应用Dropout时第一个隐藏层的方差,Layer 2 (No Dropout)表示不应用Dropout时第二个隐藏层的方差。

请注意,为了记录方差,使用了net.lin1.weight.var().item()和net.lin2.weight.var().item()来计算每个隐藏层的权重方差。这里假设权重是表示每个隐藏层的激活值的主要因素。

%matplotlib inline
import torch
from torch import nn
import matplotlib.pyplot as plt
import numpy as np
from d2l import torch as d2ln_train, n_test, num_inputs, batch_size = 20, 100, 200, 5
true_w, true_b = torch.ones((num_inputs, 1)) * 0.01, 0.05
train_data = d2l.synthetic_data(true_w, true_b, n_train)
train_iter = d2l.load_array(train_data, batch_size)
test_data = d2l.synthetic_data(true_w, true_b, n_test)
test_iter = d2l.load_array(test_data, batch_size, is_train=False)def init_params():w = torch.normal(0, 1, size=(num_inputs, 1), requires_grad=True)b = torch.zeros(1, requires_grad=True)return [w, b]def squared_loss(y_hat, y):return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2def l2_penalty(w):return torch.sum(w.pow(2)) / 2def train(lambd):w, b = init_params()net, loss = lambda X: d2l.linreg(X, w, b), squared_lossnum_epochs, lr = 100, 0.003variances = []  # 用于保存每个隐藏层的激活值方差for epoch in range(num_epochs):for X, y in train_iter:# 增加了L2范数惩罚项,# 广播机制使l2_penalty(w)成为一个长度为batch_size的向量l = loss(net(X), y) + lambd * l2_penalty(w)l.sum().backward()d2l.sgd([w, b], lr, batch_size)# 计算每个隐藏层的激活值方差layer_vars = []for X, y in train_iter:activations = X @ w + blayer_vars.append(torch.var(activations, dim=0).detach().numpy())variances.append(np.mean(layer_vars))if (epoch + 1) % 5 == 0:print(f"Epoch {epoch + 1}, Train Loss: {d2l.evaluate_loss(net, train_iter, loss)}, Test Loss: {d2l.evaluate_loss(net, test_iter, loss)}")# 绘制曲线图plt.plot(range(1, num_epochs + 1), variances)plt.xlabel('Epochs')plt.ylabel('Variance')plt.title('Change in Activation Value Variance')plt.show()print('w的L2范数是:', torch.norm(w).item())train(lambd=0)
train(lambd=3)

首先定义了一个load_data_fashion_mnist函数来加载Fashion-MNIST数据集。然后使用新的加载函数load_data_fashion_mnist来获取训练迭代器train_iter和测试迭代器test_iter。

创建了一个SGD优化器trainer,并调用train函数来训练模型。训练过程中,记录了训练损失、带Dropout的测试准确率、不带Dropout的测试准确率以及隐藏层激活的方差信息。

最后使用matplotlib绘制隐藏层激活的方差随着训练周期的变化图像,并使用图例显示带有Dropout和不带Dropout的隐藏层的方差曲线。


🌍问题研究4

为什么在测试时通常不使用暂退法?

在测试时通常不使用dropout的原因是,dropout是一种在训练期间使用的正则化技术,旨在减少模型的过拟合。当应用dropout时,它会以一定的概率随机地丢弃网络中的某些神经元,这样可以降低神经网络对特定神经元的依赖性,从而提高模型的泛化能力。

在测试期间,希望评估模型在未见过的数据上的性能,而不是应用随机丢弃神经元的正则化行为。因此在测试阶段通常不使用dropout,而是使用完整的网络进行推断。

换句话说,使用dropout来增加模型的鲁棒性和泛化能力,但在测试时,不希望模型的预测结果受到dropout的随机性影响。通过在测试阶段关闭dropout,可以得到更一致和可靠的预测结果。

因此,为了进行准确的模型评估和性能比较,在测试阶段将net.eval()设置为模型,以确保dropout层不会起作用。

需要注意的是,PyTorch中的torch.nn.Module类具有一个train()方法和一个eval()方法,分别用于将模型设置为训练模式和评估模式。在评估模式下,模型的行为可能会有所不同,例如dropout层将被禁用。


🌳问题研究5

以本节中的模型为例,比较使用暂退法和权重衰减的效果。如果同时使用暂退法和权重衰减,会发生什么情况?结果是累加的吗?收益是否减少(或者说更糟)?它们互相抵消了吗?

使用dropout和权重衰减(weight decay)都是常见的正则化技术,用于减少模型的过拟合。它们可以在一定程度上提高模型的泛化能力。

比较使用dropout和权重衰减的效果:

Dropout:dropout通过随机丢弃一定比例的神经元来减少模型的复杂度,防止过拟合。它可以提高模型的鲁棒性,并减少神经元之间的共适应性。这有助于模型更好地泛化到未见过的数据。使用dropout可以在一定程度上减少过拟合,提高模型的性能。

权重衰减:权重衰减通过向损失函数中添加权重的平方惩罚项,降低权重的大小,从而限制模型的复杂度。它可以有效地控制模型的复杂性,并减少过拟合。权重衰减有助于模型更好地泛化到未见过的数据。使用权重衰减可以在一定程度上减少过拟合,提高模型的性能。

如果同时使用dropout和权重衰减,会发生以下情况:

Dropout和权重衰减是互补的正则化技术,它们可以在一定程度上相互抵消对模型的正则化效果。当同时使用dropout和权重衰减时,它们可以共同降低模型的复杂度,并减少过拟合的风险。

由于dropout和权重衰减都是通过减少模型的复杂度来防止过拟合,因此它们在一定程度上具有类似的效果。当同时使用时,它们的效果可能会累加,进一步降低模型的复杂度,提高泛化能力。

然而,需要注意的是,dropout和权重衰减并不完全相同,它们在处理模型中的不确定性和复杂度方面具有不同的机制。因此,在某些情况下,它们可能不完全抵消彼此的效果。

综上所述,同时使用dropout和权重衰减可以共同降低模型的复杂度和过拟合的风险,但在具体情况下它们的效果可能有所不同。通常建议根据具体任务和数据集的性质进行实验和调整,以找到最佳的正则化策略。


🌌问题研究6

如果我们将暂退法应用到权重矩阵的各个权重,而不是激活值,会发生什么?

如果将dropout应用于权重矩阵的各个权重,而不是激活值,将会出现一些问题。具体而言,如果在权重矩阵中应用dropout,那么在每个训练迭代中,将会随机地将一部分权重置为零。

这种方法会破坏权重的稳定性和收敛性,导致模型无法正常学习。权重矩阵中的权重是模型的参数,它们需要在训练过程中逐渐调整以最小化损失函数。如果我们在每个训练迭代中将一部分权重置为零,那么模型将无法有效地学习到适当的权重值,从而降低模型的性能。

在传统的dropout中,是将dropout应用于激活值(隐藏层的输出),而不是权重。这是因为dropout的目的是减少模型的复杂性,增强模型的泛化能力,而不是直接干扰权重的更新过程。

因此,应用dropout到权重矩阵的各个权重是不合适的,并且不会带来正面的效果。dropout应该被应用于激活值,以帮助减少过拟合并提高模型的泛化能力。

7.发明另一种用于在每一层注入随机噪声的技术,该技术不同于标准的暂退法技术。尝试开发一种在Fashion-MNIST数据集(对于固定架构)上性能优于暂退法的方法。

当涉及到在每一层注入随机噪声的技术时,一个可能的方法是使用"DropConnect"。DropConnect是一种与传统的dropout有些类似但有所不同的正则化技术。

DropConnect是由Li et al.在2013年提出的,它是一种对权重矩阵应用随机掩码的方法。与传统的dropout不同,DropConnect在每个训练样本的每一层都会随机丢弃权重连接,而不是激活值。这样做的效果是在训练期间保持了权重的稳定性,同时引入了随机噪声来减少过拟合。

在Fashion-MNIST数据集上尝试使用DropConnect技术,您可以按照以下步骤进行:

  • 定义一个具有固定架构的神经网络模型,例如多层感知机(MLP)或卷积神经网络(CNN)。
  • 实现DropConnect技术,可以通过创建一个自定义的DropConnect层,该层将在每个训练样本的每一层应用随机掩码。
  • 在训练期间,在每个训练迭代中使用DropConnect层来注入随机噪声。
  • 使用适当的优化算法(如随机梯度下降)和损失函数(如交叉熵损失)进行模型训练。
  • 使用验证集对模型进行评估和调整超参数,例如DropConnect的丢弃率、学习率等。
  • 通过使用DropConnect技术,您可以在每一层引入随机噪声,从而增强模型的泛化能力。您可以尝试在Fashion-MNIST数据集上使用DropConnect,并与传统的dropout进行比较,以评估DropConnect技术是否可以在该数据集上获得更好的性能。

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

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

相关文章

深入理解指针(4)--新手小白都能明白的指针解析

深入理解指针(4)–新手小白都能明白的指针解析 文章目录 深入理解指针(4)--新手小白都能明白的指针解析1. 回调函数2. qsort使用举例2.1 冒泡排序2.2 qsort函数介绍2.3 用冒泡排序实现qsort 结语 1. 回调函数 回调函数就是⼀个通过函数指针调用的函数 如果我们把函数的指针&a…

玩转微服务-GateWay

目录 一. 背景二. API网关1. 概念2. API网关定义3. API网关的四大职能4. API网关分类5. 开源API网关介绍6. 开源网关的选择 三. Spring Cloud Gateway1. 文档地址2. 三个核心概念3. 工作流程4. 运行原理4.1 路由原理4.2 RouteLocator 5. Predicate 断言6. 过滤器 Filter6.1. 过…

[图解]建模相关的基础知识-02

1 00:00:01,530 --> 00:00:05,200 第2个概念&#xff0c;谓词&#xff0c;Predicate 2 00:00:07,530 --> 00:00:10,800 或者叫断言&#xff0c;翻译各种各样都有 3 00:00:12,830 --> 00:00:15,050 实际上就是前面命题 4 00:00:15,060 --> 00:00:16,610 相当于常…

记录Nuxt 3 官网项目的一次部署

本来以为就是一次简单的部署&#xff0c;之前也是部署过几次nuxt项目了&#xff0c;所以&#xff0c;并没有要记录的想法。但是过程出现了很多问题&#xff0c;最后考虑还是写下来吧。留个记录&#xff08;完整的配置部署过程&#xff09; 这里我将要说明两种部署方式以供选择&…

开源网安软件安全国产化替代解决方案亮相2024澳门万讯论坛

近日&#xff0c;2024万讯论坛在澳门成功举办。本次论坛由万讯电脑科技主办&#xff0c;旨在引进国内尖端科技厂商&#xff0c;提供全方位的信创解决方案&#xff0c;分享信创化过程中所面临的挑战及阶段性转换经验。开源网安作为拥有软件安全领域全链条产品的厂商&#xff0c;…

Analytical Model(分析模型)和Compact model(紧凑模型)有什么不同

Analytical Model&#xff08;分析模型&#xff09; 和 Compact Model&#xff08;紧凑模型&#xff09; 在电子工程和半导体物理领域有着不同的应用和特点&#xff1a; Analytical Model&#xff08;分析模型&#xff09;: 理论基础&#xff1a;分析模型基于物理原理和数学公…

jeecg dictText字典值

前端列表的字典值回显&#xff0c;配置了数据字典后&#xff0c;在本地测试可以回显中文的数据&#xff0c; 但在线上服务器不能正常回显出来&#xff1b; 原因是在前端拿到records的列表值时可以拿到dictText的字典&#xff0c;但是线上服务器没有dictText的值&#xff1b; …

聚焦 Navicat 17 新特性 | 模型设计优化与创新

随着 Navicat 17 的正式发布&#xff0c;受到了广泛的关注和讨论。Navicat 产品力又一次大跃迁。新引入的特性显著增强了用户的数据库管理和数据分析体验&#xff0c;包括&#xff1a;模型设计与同步、数据字典、数据分析&#xff08;data profiling&#xff09;、用户体验、查…

共享门店模式:快速打造连锁实体店

在数字化浪潮的冲击下&#xff0c;许多线下实体店正面临前所未有的挑战。然而&#xff0c;在这个变革的时代&#xff0c;共享门店模式&#xff0c;也被称为“共享股东”&#xff0c;正以其独特的魅力&#xff0c;为实体店带来新的生机。 一、共享门店模式的崭新定义 共享门店…

​水经微图Web版1.8.0发布

让每一个人都有自己的地图&#xff01; 水经微图&#xff08;简称“微图”&#xff09;新版已上线&#xff0c;在该版本中主要新增了注册登录功能&#xff0c;线与面图层新增矩形、圆或军标等绘制功能&#xff0c;以及其它功能的优化。 现在&#xff0c;为你分享一下本轮迭代…

PostgreSQL调优工具:PGTune

PostgreSQL调优工具&#xff1a;PGTune 1&#xff0c;PGTune网址 https://pgtune.leopard.in.ua/#/ 参数解释&#xff1a; DB Version&#xff1a;数据库版本 OS Type&#xff1a;操作系统 DB Type&#xff1a;数据库类型&#xff0c;一般默认即可 Total Memory (RAM)&#x…

巨详细Linux安装MySQL

巨详细Linux安装MySQL 1、查看是否有自带数据库或残留数据库信息1.1检查残留mysql1.2检查并删除残留mysql依赖1.3检查是否自带mariadb库 2、下载所需MySQL版本&#xff0c;上传至系统指定位置2.1创建目录2.2下载MySQL压缩包 3、安装MySQL3.1创建目录3.2解压mysql压缩包3.3安装解…

2 - 力扣高频 SQL 50 题(基础版)

2.寻找用户推荐人 考点: sql里面的不等于&#xff0c;不包含null -- null 用数字判断筛选不出来 select name from Customer where referee_id !2 OR referee_id IS NULL;

UML行为图-状态图

概述 创建 UML 状态图的目的是研究类、角色、子系统或组件的实时行为。状态图不仅可用于描述用户接口、设备控制器和其他具有反馈的子系统&#xff0c;还可用于描述在生命期中跨越多个不同性质阶段的被动对象的行为&#xff0c;在每一阶段该对象都有自己特殊的行为。 一、状态…

2024最全软件测试面试八股文(答案+文档+视频讲解)

Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自…

Python-3.12.0文档解读-内置函数zip()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 基本用法 示例 特性 高级用法 注意事项 版本更新 示例代码 记忆策略…

UI的学习(一)

UI的学习(一) 文章目录 UI的学习(一)UIlabelUIButtonUIButton的两种形式UIButton的事件触发 UIView多个视图之间的关系 UIWindowUIViewController一个视图推出另一个视图 定时器和视图移动UISwitchUISlider和UIProgressSlid步进器与分栏控制器UITextFieldUIScrollView有关实现它…

个人笔记-随意记录

常见问题&#xff1f; 1.linux重启服务 端口被占用如何解决&#xff1f; 查看某个端口被占用的进程 netstat -tulnp | grep :23454 强制杀死进程 kill -9 1776 重启服务即可

解决Chat打开时Unable to load conversation 的问题

在开梯子的情况下打开chat依然很卡&#xff0c;这里选择edge的浏览器无痕模式&#xff08;新建InPrivate窗口&#xff09;&#xff0c;在无痕窗口下打开chat就可以了。

python ---requests

python包管理工具 pip 若发现报错&#xff0c;则可以通过 -i 命令指定软件源 requests库安装 通过 pip &#xff0c;如上 或通过 pycharm 搜索 requests &#xff0c;并安装即可 下载成功的证明 requests库使用 模拟 http 重要参数如下 如何模拟发包 支持模拟各种 http meth…