当前位置: 首页 > news >正文

海口网站建设维护icp备案号怎么查

海口网站建设维护,icp备案号怎么查,西湖区建设局网站,装修效果图免费软件案例2#xff1a;构建自己的多层感知机: MNIST手写数字识别 相关知识点: numpy科学计算包#xff0c;如向量化操作#xff0c;广播机制等 1 任务目标 1.1 数据集简介 ​ MNIST手写数字识别数据集是图像分类领域最常用的数据集之一#xff0c;它包含60,000张训练图片构建自己的多层感知机: MNIST手写数字识别 相关知识点: numpy科学计算包如向量化操作广播机制等 1 任务目标 1.1 数据集简介 ​ MNIST手写数字识别数据集是图像分类领域最常用的数据集之一它包含60,000张训练图片10,000张测试图片图片中的数字均被缩放到同一尺寸且置于图像中央图片大小为28×28。MNIST数据集中的每个样本都是一个大小为784×1的矩阵(从28×28转换得到)。MNIST数据集中的数字包括0到9共10类如下图所示。注意任何关于测试集的信息都不该被引入训练过程。 ​ 在本次案例中我们将构建多层感知机来完成MNIST手写数字识别。 1.2 构建多层感知机 ​ 本次案例提供了若干初始代码可基于初始代码完成案例各文件简介如下 运行初始代码之前请自行安装TensorFlow 2.0及以上版本仅用于处理数据集禁止直接调用TensorFlow函数 mlp.ipynb包含了本案例的主要内容运行文件需安装Jupyter Noterbook. network.py定义了网络包括其前向和后向计算。 optimizer.py定义了随机梯度下降(SGD)用于完成反向传播和参数更新。 solver.py定义了训练和测试过程需要用到的函数。 plot.py用来绘制损失函数和准确率的曲线图。 ​ 此外在/criterion/和/layers/路径下使用模块化的思路定义了多个层其中每个层均包含三个函数__init__用来定义和初始化一些变量 f o r w a r d forward forward和 b a c k w a r d backward backward函数分别用来完成前向和后向计算 FCLayer为全连接层输入为一组向量必要时需要改变输入尺寸以满足要求与权重矩阵作矩阵乘法并加上偏置项得到输出向量: u W x b uWxb uWxb SigmoidLayer为 s i g m o i d sigmoid sigmoid激活层根据 f ( u ) 1 1 e − u f(u)\frac{1}{1e^{-u}} f(u)1e−u1​计算输出。 ReLULayer为 R e L U ReLU ReLU激活层根据 f ( u ) m a x ( 0 , u ) f(u)max(0,u) f(u)max(0,u)计算输出。 EuclideanLossLayer为欧式距离损失层计算各样本误差的平方和得到: 1 2 ∑ n ∣ ∣ l o g i t s ( n ) − g t ( n ) ∣ ∣ 2 2 \frac{1}{2}\sum_n||logits(n)-gt(n)||_2^2 21​∑n​∣∣logits(n)−gt(n)∣∣22​。 SoftmaxCrossEntropyLossLayer可以看成是输入到如下概率分布的映射 P ( t k 1 / x ) e X K ∑ j 1 K e X j P(t_k1/x)\frac{e^{X_K}}{\sum_{j1}^Ke^{X_j}} P(tk​1/x)∑j1K​eXj​eXK​​ 其中 X k X_k Xk​是输入向量X中的第k个元素 P ( t k 1 / x ) P(t_k1/x) P(tk​1/x)该输入被分到第 k k k个类别的概率。由于 s o f t m a x softmax softmax层的输出可以看成一组概率分布我们可以计算delta似然及其对数形式称为Cross Entropy误差函数 E − l n p ( t ( 1 ) , . . . , t ( N ) ) ∑ n 1 N E ( n ) E-ln\ p(t^{(1)},...,t^{(N)})\sum_{n1}^NE^{(n)} E−ln p(t(1),...,t(N))n1∑N​E(n) 其中 E ( n ) − ∑ k 1 K t k ( n ) l n h k ( n ) h k ( n ) P ( t k 1 / X ( n ) ) e X k ( n ) ∑ j 1 K e X j ( n ) E^{(n)}-\sum_{k1}^Kt_k^{(n)}ln\ h_k{(n)}\\h_k^{(n)}P(t_k1/X^{(n)})\frac{e^{X_k^{(n)}}}{\sum_{j1}^Ke^{X_j^{(n)}}} E(n)−k1∑K​tk(n)​ln hk​(n)hk(n)​P(tk​1/X(n))∑j1K​eXj(n)​eXk(n)​​ ​ 注意此处的softmax损失层与案例1中有所差异本次案例中的softmax层不包含可训练的参数这些可训练的参数被独立成一个全连接层。 1.3 案例要求 ​ 完成上述文件里的‘#TODO’部分(红色标记的文件)提交全部代码及一份案例报告要求如下 记录训练和测试准确率绘制损失函数和准确率曲线图 比较分别使用 S i g m o i d Sigmoid Sigmoid和 R e L U ReLU ReLU激活函数时的结果可以从收敛情况、准确率等方面比较 比较分别使用欧式距离损失和交叉熵损失时的结果 构造具有两个隐含层的多层感知机自行选取合适的激活函数和损失函数与只有一个隐含层的结果相比较 本案例中给定的超参数可能表现不佳请自行调整超参数尝试取得更好的结果记录下每组超参数的结果并作比较和分析。 1.4 注意事项 提交所有代码和一份案例报告 注意程序的运行效率尽量使用矩阵运算而不是for循环 本案例中不允许直接使用TensorFlow, Caffe, PyTorch等深度学习框架 禁止任何形式的抄袭。 2 代码设计 ​ 本节中介绍了代码整体架构以及需要补全部分的函数设计。 2.1 数据处理 本实验进行MNIST手写数字识别数据集采用 tensorflow 的tf.keras.datasets.mnist。 划分数据集 (x_train, y_train), (x_test, y_test) tf.keras.datasets.mnist.load_data()数据预处理 decode_image() 函数对图像进行归一化处理。 该函数将图像的像素值转换为浮点数然后将图像的形状变为一维的向量最后将图像的像素值缩放到 (0,1) 之间并减去图像数据的均值使得分布接近标准 正态分布 。 def decode_image(image):# 归一化处理image tf.cast(image, tf.float32)image tf.reshape(image, [784])image image / 255.0image image - tf.reduce_mean(image)return imagedecode_label() 函数将标签变为 one-hot 编码。 该函数将标签的值转换为一个长度为10的向量其中只有一个元素为1其余为0表示标签的类别。 def decode_label(label):# 将标签变为one-hot编码return tf.one_hot(label, depth10)数据预处理对训练集和测试集的图像和标签进行了预处理。 将处理后的图像和标签合并为一个数据集每个元素是一个元组包含了一个图像和一个标签。 # 数据预处理 x_train tf.data.Dataset.from_tensor_slices(x_train).map(decode_image) y_train tf.data.Dataset.from_tensor_slices(y_train).map(decode_label) data_train tf.data.Dataset.zip((x_train, y_train))x_test tf.data.Dataset.from_tensor_slices(x_test).map(decode_image) y_test tf.data.Dataset.from_tensor_slices(y_test).map(decode_label) data_test tf.data.Dataset.zip((x_test, y_test))超参数设置 本实验中采用了如下超参数并对其设置了初值。 batch_size 100 max_epoch 20 init_std 0.01learning_rate_SGD 0.001 weight_decay 0.1disp_freq 50batch_size 表示每次训练时使用的数据样本的数量。max_epoch表示训练的最大轮数。init_std 表示模型参数的初始化标准差本次实验并未使用。learning_rate_SGD 表示随机梯度下降SGD优化器的学习率。weight_decay 表示权重衰减的系数。disp_freq 表示显示训练信息的频率也就是每训练多少个批次就打印一次训练指标。 2.2 代码补全 optmizer.py 该代码实现了一个随机梯度下降SGD优化器用于更新神经网络模型的参数。需要补全的地方是更新梯度的部分此处代码如下。 # 计算梯度更新的变化量 layer.diff_W - self.learningRate * (layer.grad_W self.weightDecay * layer.W) layer.diff_b - self.learningRate * layer.grad_b# 更新权重和偏置项 layer.W layer.diff_W layer.b layer.diff_b多层感知机梯度更新公式如下 w n e w w o l d − α ( ∇ J ( w ) λ w o l d ) b n e w b o l d − α ∇ J ( b ) w_{new}w_{old}-\alpha (\nabla J(w) \lambda w_{old})\\ b_{new}b_{old}-\alpha \nabla J(b) wnew​wold​−α(∇J(w)λwold​)bnew​bold​−α∇J(b) 其中 α \alpha α 是学习率 ∇ J ( θ ) \nabla J(\theta) ∇J(θ) 是梯度 λ \lambda λ 是权重衰减的系数。 fc_layer.py 该代码实现了一个全连接层用于完全连接前后不同的神经元数的两层。 前向传播def forward() 对输入进行线性变换 Y W X b YWXb YWXb​ 然后返回输出。 def forward(self, Input):对输入计算Wxb并返回结果self.input Inputreturn np.dot(Input, self.W) self.b反向传播def backward() 根据输出的梯度来计算输入的梯度和权重和偏置的梯度然后返回输入的梯度。 KaTeX parse error: Undefined control sequence: \part at position 9: \frac {\̲p̲a̲r̲t̲ ̲E^{(n)}}{\part … 代码如下 def backward(self, delta):根据delta计算梯度self.grad_W np.dot(self.input.T, delta)self.grad_b np.sum(delta, axis0, keepdimsTrue)delta np.dot(delta, self.W.T)return deltasigmoid_layer.py 该代码实现了一个基于 sigmoid 激活函数的激活层。 前向传播def forward(self, Input) 对输入进行 Sigmoid 激活函数的处理然后返回输出。 f ( x ) 1 1 e − x f(x) \frac{1}{1e^{-x}} f(x)1e−x1​ 代码如下 def forward(self, Input):对输入应用Sigmoid激活函数并返回结果self.output 1 / (1 np.exp(-Input))return self.output反向传播def backward(self, delta) 根据输出的梯度来计算输入的梯度然后返回输入的梯度。 f ′ ( z ) f ( z ) ( 1 − f ( z ) ) f^\prime (z)f(z)(1-f(z)) f′(z)f(z)(1−f(z)) 代码如下 def backward(self, delta):根据delta计算梯度return delta * self.output * (1 - self.output)relu_layer.py 该代码实现了一个基于 Relu 激活函数的激活层。 前向传播def forward(self, Input) 对输入进行 Relu 激活函数的处理然后返回输出。 f ( z ) m a x ( 0 , z ) f(z)max(0,z) f(z)max(0,z) 代码如下 def forward(self, Input):对输入应用ReLU激活函数并返回结果self.input Inputreturn np.maximum(0, Input)反向传播def backward(self, delta) 根据输出的梯度来计算输入的梯度然后返回输入的梯度。 f ′ ( z ) { 1 , i f z ≥ 0 0 , e l s e f^\prime (z)\begin{cases}1,if\ z≥0\\0,else\end{cases} f′(z){1,if z≥00,else​ 代码如下 def backward(self, delta):根据delta计算梯度return delta * (self.input 0)euclidean_loss.py 该代码实现了一个欧氏距离损失层。 前向传播def forward(self, logit, gt) 对输出和真实标签之间的欧式距离损失进行计算并返回损失值。它接受两个参数logit表示最后一个全连接层的输出结果gt表示真实标签。 L ( y , f ( x ) ) 1 2 n ∑ i 1 n ( y i − f ( x i ) ) 2 L(\mathbf{y}, \mathbf{f}(\mathbf{x})) \frac{1}{2n} \sum_{i1}^n (\mathbf{y}_i - \mathbf{f}(\mathbf{x}_i))^2 L(y,f(x))2n1​i1∑n​(yi​−f(xi​))2 代码如下 def forward(self, logit, gt):输入: (minibatch)- logit: 最后一个全连接层的输出结果, 尺寸(batch_size, 10)- gt: 真实标签, 尺寸(batch_size, 10)# 计算欧式距离损失self.logit logitself.diff logit - gtself.loss 0.5 * np.sum(self.diff ** 2) / logit.shape[0] # 计算平均损失self.acc np.sum(np.argmax(logit, axis1) np.argmax(gt, axis1)) / logit.shape[0] # 计算平均准确率return self.loss反向传播def backward(self) 根据损失值的梯度来计算输出的梯度并返回输出的梯度。 ∂ L ∂ f ( x i ) 1 n ( f ( x i ) − y i ) \frac{\partial L}{\partial \mathbf{f}(\mathbf{x}_i)} \frac{1}{n}(\mathbf{f}(\mathbf{x}_i) - \mathbf{y}_i) ∂f(xi​)∂L​n1​(f(xi​)−yi​) 代码如下 def backward(self):# 欧式距离损失的梯度即为(logit - gt) / batch_sizereturn self.diff / self.logit.shape[0]softmax_cross_entropy.py 该代码实现了一个Softmax交叉熵损失层。 前向传播def forward(self, logit, gt) 对输出和真实标签之间的Softmax交叉熵损失进行计算并返回损失值。它接受两个参数logit表示最后一个全连接层的输出结果gt表示真实标签。 交叉熵损失函数 E ( θ ) − 1 n l n P ( t ( 1 ) , . . . , t ( n ) ) − 1 n ∑ n 1 n ( t ( n ) l n h ( x ( n ) ( 1 − t ( n ) ) l n ( 1 − h ( x ( n ) ) ) E(θ)-\frac{1}{n}lnP(t^{(1)},...,t^{(n)})-\frac{1}{n}\sum^{n}_{n1}\left(t^{(n)}ln\ h(x^{(n)}(1-t^{(n)})ln\ (1-h(x^{(n)})\right)\\ E(θ)−n1​lnP(t(1),...,t(n))−n1​n1∑n​(t(n)ln h(x(n)(1−t(n))ln (1−h(x(n))) 平均准确率 a c c u r a c y 正确分类的样本数 总样本数 \mathbf{accuracy} \frac{\text{正确分类的样本数}}{\text{总样本数}} accuracy总样本数正确分类的样本数​ ​ 对 logit 和 gt 分别沿着第二个维度求最大值的索引也就是得到每个样本的预测类别和真实类别然后比较它们是否相等得到一个一维布尔数组表示每个样本是否正确分类。 ​ 然后它对这个数组求和得到一个标量表示正确分类的样本数。然后它除以 batch_size 得到一个标量表示平均准确率保存在 self.acc 中。 代码如下 def forward(self, logit, gt):输入: (minibatch)- logit: 最后一个全连接层的输出结果, 尺寸(batch_size, 10)- gt: 真实标签, 尺寸(batch_size, 10)# 计算softmax激活函数exp_logit np.exp(logit - np.max(logit, axis1, keepdimsTrue))self.softmax_output exp_logit / np.sum(exp_logit, axis1, keepdimsTrue)# 计算交叉熵损失self.loss -np.sum(gt * np.log(self.softmax_output EPS)) / logit.shape[0]# 计算平均准确率self.acc np.sum(np.argmax(logit, axis1) np.argmax(gt, axis1)) / logit.shape[0]# 保存真实标签用于反向传播self.gt gtreturn self.loss反向传播def backward(self) 根据损失值的梯度来计算输出的梯度并返回输出的梯度。 ∇ E ( θ ) 1 N ∑ N x ( n ) ( h ( x ( n ) ) − t ( n ) ) \nabla E(\theta)\frac{1}{N}\sum_Nx^{(n)}(h(x^{(n)})-t^{(n)}) ∇E(θ)N1​N∑​x(n)(h(x(n))−t(n)) 代码如下 def backward(self):# 计算梯度return np.subtract(self.softmax_output, self.gt) / self.gt.shape[0]3 多层感知机训练 ​ 本实验分别使用了欧氏距离损失函数、Softmax交叉熵损失函数来训练具有唯一激活层的多层感知机之后再以Softmax交叉熵作为损失函数训练了具有两层隐含层的多层感知机。 3.1 使用欧氏距离损失训练多层感知机 使用 欧式距离损失 和 Sigmoid激活函数 训练多层感知机 本次训练采用3层感知机进行训练。 第一层为全连接层将784个神经元的输入转化为128个神经元的输出。第二层采用 Sigmoid 激活层为128个神经元进行非线性变换。第三层为全连接层将128个神经元的输入转化为对应数字0到9的10个输出。 sigmoidMLP Network() # 使用FCLayer和SigmoidLayer构建多层感知机 # 128为隐含层的神经元数目 sigmoidMLP.add(FCLayer(784, 128)) sigmoidMLP.add(SigmoidLayer()) sigmoidMLP.add(FCLayer(128, 10))训练结束后在测试集上进行测试准确率为 0.7810。 使用 欧式距离损失 和 Relu激活函数 训练多层感知机 本次训练采用3层感知机进行训练。 第一层为全连接层将784个神经元的输入转化为128个神经元的输出。第二层采用 Relu 激活层为128个神经元进行非线性变换。第三层为全连接层将128个神经元的输入转化为对应数字0到9的10个输出。 reluMLP Network() # 使用FCLayer和ReLULayer构建多层感知机 reluMLP.add(FCLayer(784, 128)) reluMLP.add(ReLULayer()) reluMLP.add(FCLayer(128, 10))训练结束后在测试集上进行测试准确率为 0.8586。 训练曲线对比 绘制了 loss 曲线与 acc 曲线对比以上两个感知机的训练结果。 Sigmoid 的损失训练的初值低于 Relu然而在训练过程中收敛效果不如 Relu20轮训练后 Relu 损失更小。 Relu 训练过程中的准确率始终高于 Sigmoid 的准确率。 由以上训练结果可知在使用欧氏距离作为损失函数时Relu 作为隐藏层激活函数效果好于 Sigmoid 函数。 3.2 使用Softmax交叉熵损失训练多层感知机 使用 Softmax交叉熵损失 和 Sigmoid激活函数 训练多层感知机 本次训练采用3层感知机进行训练。 第一层为全连接层将784个神经元的输入转化为128个神经元的输出。第二层采用 Sigmoid 激活层为128个神经元进行非线性变换。第三层为全连接层将128个神经元的输入转化为对应数字0到9的10个输出。 # 使用FCLayer和SigmoidLayer构建多层感知机 # 128为隐含层的神经元数目 sigmoidMLP.add(FCLayer(784, 128)) sigmoidMLP.add(SigmoidLayer()) sigmoidMLP.add(FCLayer(128, 10))训练结束后在测试集上进行测试准确率为 0.6968。 使用 Softmax交叉熵损失 和 Relu激活函数 训练多层感知机 本次训练采用3层感知机进行训练。 第一层为全连接层将784个神经元的输入转化为128个神经元的输出。第二层采用 Relu 激活层为128个神经元进行非线性变换。第三层为全连接层将128个神经元的输入转化为对应数字0到9的10个输出。 reluMLP Network() # 使用FCLayer和ReLULayer构建多层感知机 reluMLP.add(FCLayer(784, 128)) reluMLP.add(ReLULayer()) reluMLP.add(FCLayer(128, 10))训练结束后在测试集上进行测试准确率为 0.8687。 训练曲线对比 绘制了 loss 曲线与 acc 曲线对比以上两个感知机的训练结果。 Sigmoid 的损失下降速率较慢而 Relu 的损失下降明显更好始终低于前者。 Relu 的准确率始终高于 Sigmoid且 ReluSoftmax交叉损失 的组合较好于 Relu欧氏距离损失 的组合SigmoidSoftmax交叉损失 的组合差于 Sigmoid欧氏距离损失 的组合。 由以上训练结果可知在使用Softmax交叉损失作为损失函数时Relu 作为隐藏层激活函数效果好于 Sigmoid 函数且好于用欧式距离作为损失函数的训练效果。 3.3 具有两层隐含层的多层感知机 ​ 本章中采用 Softmax交叉损失 作为损失函数将 Relu 和 Sigmoid 组成四组组合作为隐藏层的两层激活层进行训练。 隐藏层为 两层Relu函数 的多层感知机 本次训练采用4层感知机进行训练。 第一层为全连接层将784个神经元的输入转化为128个神经元的输出。第二层采用 Relu 激活层为128个神经元进行非线性变换。第三层采用 Relu 激活层为128个神经元进行非线性变换。第四层为全连接层将128个神经元的输入转化为对应数字0到9的10个输出。 relu2MLP Network() # 128为隐含层的神经元数目 relu2MLP.add(FCLayer(784, 128)) relu2MLP.add(ReLULayer()) relu2MLP.add(ReLULayer()) relu2MLP.add(FCLayer(128, 10))训练结束后在测试集上进行测试准确率为 0.8696。 绘制曲线与1层 Relu 进行对比。 与1层 Relu 对比2层 Relu 训练效果略微提升但是提升不大。 隐藏层为 两层Sigmoid函数 的多层感知机 本次训练采用4层感知机进行训练。 第一层为全连接层将784个神经元的输入转化为128个神经元的输出。第二层采用 Sigmoid 激活层为128个神经元进行非线性变换。第三层采用 Sigmoid 激活层为128个神经元进行非线性变换。第四层为全连接层将128个神经元的输入转化为对应数字0到9的10个输出。 sigmoid2MLP Network() # 128为隐含层的神经元数目 sigmoid2MLP.add(FCLayer(784, 128)) sigmoid2MLP.add(SigmoidLayer()) sigmoid2MLP.add(SigmoidLayer()) sigmoid2MLP.add(FCLayer(128, 10))训练结束后在测试集上进行测试准确率为 0.1137。 绘制曲线与1层 Sigmoid 进行对比。 在使用两层 Sigmoid 作为隐藏层时训练结果极差出现了梯度消失的现象。在训练两轮之后 Loss 值不再降低准确率不再提升。 隐藏层 先为Relu层后为Sigmoid层 的多层感知机 本次训练采用4层感知机进行训练。 第一层为全连接层将784个神经元的输入转化为128个神经元的输出。第二层采用 Relu 激活层为128个神经元进行非线性变换。第三层采用 Sigmoid 激活层为128个神经元进行非线性变换。第四层为全连接层将128个神经元的输入转化为对应数字0到9的10个输出。 ReluSigmoidMLP Network() # 128为隐含层的神经元数目 ReluSigmoidMLP.add(FCLayer(784, 128)) ReluSigmoidMLP.add(ReLULayer()) ReluSigmoidMLP.add(SigmoidLayer()) ReluSigmoidMLP.add(FCLayer(128, 10))训练结束后在测试集上进行测试准确率为 0.6315。 隐藏层 先为Sigmoid层后为Relu层 的多层感知机 本次训练采用4层感知机进行训练。 第一层为全连接层将784个神经元的输入转化为128个神经元的输出。第二层采用 Sigmoid 激活层为128个神经元进行非线性变换。第三层采用 Relu 激活层为128个神经元进行非线性变换。第四层为全连接层将128个神经元的输入转化为对应数字0到9的10个输出。 SigmoidReluMLP Network() # 128为隐含层的神经元数目 SigmoidReluMLP.add(FCLayer(784, 128)) SigmoidReluMLP.add(SigmoidLayer()) SigmoidReluMLP.add(ReLULayer()) SigmoidReluMLP.add(FCLayer(128, 10))训练结束后在测试集上进行测试准确率为 0.6996。 绘制曲线与 先为Relu层后为Sigmoid层 的做对比。 由上图可知先 Sigmoid 层后 Relu 层的效果更好但是两者效果都不如两层都是 Relu 的效果好。 4 寻找最佳超参数 ​ 本章通过遍历不同超参数探索超参数对训练结果的影响寻找最佳的超参数。 4.1 利用网格搜索寻找最佳超参数 编写代码遍历超参数可能的取值寻找最佳超参数。 from criterion import SoftmaxCrossEntropyLossLayer from optimizer import SGD from layers import FCLayer, ReLULayer import itertools import gc# 定义超参数的可能取值 batch_sizes [32,64,128] max_epochs [10,20,30] learning_rates [0.001, 0.005, 0.01] weight_decays [0.1, 0.01, 0.001]# 保存最佳结果的变量 best_accuracy 0.0 best_hyperparameters {} criterion SoftmaxCrossEntropyLossLayer()def build_and_train_model(batch_size, max_epoch, learning_rate, weight_decay):sgd SGD(learning_rate, weight_decay)model Network()# 128为隐含层的神经元数目model.add(FCLayer(784, 128))model.add(ReLULayer())model.add(ReLULayer())model.add(FCLayer(128, 10))model, model_loss, model_acc train(model, criterion, sgd, data_train, max_epoch, batch_size, 1000)return model, model_loss, model_acc# 遍历所有超参数组合 for batch_size, max_epoch, learning_rate, weight_decay in itertools.product(batch_sizes, max_epochs, learning_rates, weight_decays ):# 构建和训练模型使用当前超参数组合model, model_loss, model_acc build_and_train_model(batch_size, max_epoch, learning_rate, weight_decay)accuracy test(model, criterion, data_test, batch_size, disp_freq)# 如果当前组合的性能更好则更新最佳结果if accuracy best_accuracy:best_accuracy accuracybest_hyperparameters {batch_size: batch_size,max_epoch: max_epoch,learning_rate: learning_rate,weight_decay: weight_decay}del model # 删除网络对象gc.collect() # 执行垃圾回收# 打印最佳结果 print(Best Hyperparameters:, best_hyperparameters) print(Best Accuracy:, best_accuracy)因为内存空间不足未能跑完所有的超参数在有限的内存中跑出的最佳参数及测试结果如下。 Best Hyperparameters: {‘batch_size’: 32, ‘max_epoch’: 20, ‘learning_rate’: 0.005, ‘weight_decay’: 0.001} Best Accuracy: 0.9524238782051282 可以观察到在batch_size选择较小值训练轮次较大学习率较高权重衰减较小时结果更好。 4.2 探寻学习率对训练结果的影响 编写代码让模型分别在学习率为 [0.001, 0.005, 0.01] 的值训练对比训练结果寻找最佳的取值。 # 探寻学习率对训练结果的影响 from criterion import SoftmaxCrossEntropyLossLayer from optimizer import SGD from layers import FCLayer, ReLULayerlrs [0.001, 0.005, 0.01] loss_lrs [] acc_lrs [] # 单层Relu学习率0.1 criterion SoftmaxCrossEntropyLossLayer()for lr in lrs:sgd SGD(lr, 0.001)model Network()# 128为隐含层的神经元数目model.add(FCLayer(784, 128))model.add(ReLULayer())model.add(FCLayer(128, 10))model, model_loss, model_acc train(model, criterion, sgd, data_train, max_epoch, batch_size, 1000)loss_lrs.append(model_loss)acc_lrs.append(model_acc)plot_loss_and_acc({lr0.001: [loss_lrs[0], acc_lrs[0]],lr0.005: [loss_lrs[1], acc_lrs[1]],lr0.01: [loss_lrs[2], acc_lrs[2]]})训练结果 由上图可知学习率越高训练结果越好其中学习率为 0.01 时训练效果最好。 4.3 探寻权重衰减对训练效果的影响 编写代码让模型分别在权重衰减为 [0.001, 0.005, 0.01] 的值训练对比训练结果寻找最佳的取值。 # 探寻权重衰减对训练效果的影响 from criterion import SoftmaxCrossEntropyLossLayer from optimizer import SGD from layers import FCLayer, ReLULayerwds [0.001, 0.005, 0.01] loss_wds [] acc_wds [] criterion SoftmaxCrossEntropyLossLayer()for wd in wds:sgd SGD(0.005, wd)model Network()# 128为隐含层的神经元数目model.add(FCLayer(784, 128))model.add(ReLULayer())model.add(FCLayer(128, 10))model, model_loss, model_acc train(model, criterion, sgd, data_train, max_epoch, batch_size, 1000)loss_wds.append(model_loss)acc_wds.append(model_acc)plot_loss_and_acc({wd0.001: [loss_wds[0], acc_wds[0]],wd0.005: [loss_wds[1], acc_wds[1]],wd0.01: [loss_wds[2], acc_wds[2]]})训练结果 由上图可知权重衰减值越小训练结果最好其中权重衰减值为 0.001 时结果最好。 4.4 探寻batch_size对训练效果的影响 编写代码让模型分别在batch_size为 [32, 64, 128] 的值训练对比训练结果寻找最佳的取值。 # 探寻batch_size对训练效果的影响 from criterion import SoftmaxCrossEntropyLossLayer from optimizer import SGD from layers import FCLayer, ReLULayerbss [32, 64, 128] loss_bss [] acc_bss [] criterion SoftmaxCrossEntropyLossLayer()for bs in bss:sgd SGD(0.01, 0.001)model Network()# 128为隐含层的神经元数目model.add(FCLayer(784, 128))model.add(ReLULayer())model.add(FCLayer(128, 10))model, model_loss, model_acc train(model, criterion, sgd, data_train, max_epoch, bs, 1000)loss_bss.append(model_loss)acc_bss.append(model_acc)plot_loss_and_acc({batch_size32: [loss_bss[0], acc_bss[0]],batch_size64: [loss_bss[1], acc_bss[1]],batch_size128: [loss_bss[2], acc_bss[2]]})由上图可知batch size 越小训练效果越好其中 batch size 32 时训练效果最好。 4.5 测试最佳多层感知机 ​ 根据以上研究我选取了以下超参数作为本次实验找到的最佳超参数并选取了 Softmax交叉熵 作为损失函数两层 Relu 作为隐藏层进行测试得到的结果即为本实验训练出的最佳多层感知机。 batch size 32每批次选取32张图片进行训练。max epoch 50进行50轮迭代训练。learning rate 0.1学习率设置为0.1。weight decay 0.001权重衰减设置为0.001。 # 最佳训练超参数 from criterion import SoftmaxCrossEntropyLossLayer from optimizer import SGD from layers import FCLayer, ReLULayerbatch_size 32 max_epoch 50learning_rate_SGD 0.1 weight_decay 0.001disp_freq 1000 criterion SoftmaxCrossEntropyLossLayer()sgd SGD(learning_rate_SGD, weight_decay)Best_model Network() # 128为隐含层的神经元数目 Best_model.add(FCLayer(784, 128)) Best_model.add(ReLULayer()) Best_model.add(ReLULayer()) Best_model.add(FCLayer(128, 10)) Best_model, Best_model_loss, Best_model_acc train(Best_model, criterion, sgd, data_train, max_epoch, batch_size, disp_freq)test(Best_model, criterion, data_test, batch_size, disp_freq)本实验得到的最佳多层感知机测试准确率为0.9759。 绘图对比这组超参数与之前训练较好的 ReluSoftmax交叉熵损失 组合发现该组结果明显很好。
http://www.tj-hxxt.cn/news/231403.html

相关文章:

  • 苏州网站建设找思创唐山百度搜索排名优化
  • 教育培训机构有关的网站作图网址
  • 中航长江建设工程有限公司网站网站推广计划的内容
  • 网站设计制作全网优惠100元建网站
  • 站长工具在线陕西建设厅官网首页
  • 平凉崆峒建设局网站我要建立自己的网站
  • 女朋友在互联网公司做网站成都住建局官网住建局
  • 网站建设的费用计什么科目杭州小程序搭建
  • 建筑网站推荐知乎wordpress安装主题后无法查看媒体
  • 2017 上海网站备案php 网站 下载
  • 哈尔滨网站建设团队西安企业家名单
  • 简述网站技术解决方案鄂伦春网站建设
  • 国内高端大气的网站设计设计院一般年薪
  • 做视频搬运工的网站海南住房建设厅定额网站
  • 郑州php网站建设外包公司一个人头挣多少钱
  • 东莞做网站优化哪家好网站设计的风格有哪些
  • 山东住房建设厅官网站网站设计 用户心理研究
  • 网站系统建设网站建设服务器环境配置
  • 做情侣网站电子商务网站建设学什么软件
  • 龙之向导外贸经理人网站东莞网站建设对比
  • 哪个网站可以找题目给小孩做朝阳市网站建设
  • 时尚网站设计案例如何做图片网站
  • 大数据培训班需要多少钱百度seo快速见效方法
  • 上海做网站的公Wordpress 新建标签
  • 做网站怎么排版好看最新新闻热点事件2022年
  • 西安企业免费建站装修加盟
  • 湖南营销型网站建设多少钱广州电子商务网站建设费用
  • 电子商务网站建设利益分析网站制作公司前十排名
  • 镇江网站建设案例杭州平面设计培训
  • 企业网站主页设计工作态度和责任心句子