MNIST数据集权重及偏置参数分析

需积分: 10 2 下载量 30 浏览量 更新于2024-11-04 收藏 165KB 7Z 举报
资源摘要信息:"MNIST权重和偏置参数" 知识点一:MNIST数据集 MNIST是一个包含了成千上万的手写数字图片的数据集,用于训练和测试各种图像处理系统。数据集中的图片为28x28像素的灰度图,共包含0到9这10个数字的60000张训练图片和10000张测试图片。MNIST因其简洁性和完整性,成为了机器学习和计算机视觉研究中的经典入门数据集。 知识点二:权重与偏置参数 在机器学习模型中,权重(weights)和偏置(bias)是模型参数的两种主要形式。权重可以理解为各个输入特征对输出结果影响的程度,而偏置则用于调整输出的基线值。权重和偏置共同构成了模型对数据进行拟合的关键参数,学习正确的权重和偏置是机器学习算法训练过程中的主要任务之一。 知识点三:机器学习模型的参数训练 模型参数的训练通常采用梯度下降(Gradient Descent)等优化算法,通过不断迭代更新权重和偏置,使得模型在训练集上的预测误差最小化。权重和偏置的更新依赖于模型输出与真实标签之间的差异,即损失函数的计算结果。对于神经网络,参数训练通常涉及到反向传播算法,该算法能够高效地计算损失函数关于所有权重的梯度,进而更新这些参数。 知识点四:pickle文件格式 pickle是Python的一个序列化模块,可以将Python对象序列化为字节流,保存到文件中,也可以从文件中反序列化回Python对象。pickle格式广泛用于Python程序中的对象持久化,便于数据存储和传输。由于pickle文件能够存储几乎任何Python对象,因此常用于保存机器学习模型的权重和偏置参数,因为这些参数通常以数组或矩阵的形式存在。 知识点五:MNIST数据集的使用场景 MNIST数据集常用于训练各种图像识别模型,特别是手写数字识别算法。基于MNIST训练得到的模型,可以在现实世界的应用中识别邮政编码、银行支票上的数字等。除了作为经典入门案例之外,MNIST数据集也经常用于算法基准测试,比较不同机器学习模型和方法的性能。 知识点六:权重和偏置参数的应用 在神经网络中,权重和偏置参数定义了网络层之间的连接强度。第一层权重确定了输入层到隐藏层的连接,第二层权重则确定了隐藏层到输出层的连接。偏置参数主要用于调节神经元的激活阈值。通过学习这些参数,神经网络能够在训练过程中适应输入数据的特征,并对新的输入数据做出准确预测。 知识点七:7z压缩格式 7z是一种高压缩比的文件压缩格式,由7-Zip软件采用自己的压缩算法实现。相较于常见的ZIP或RAR格式,7z通常能提供更高的压缩率。在数据密集型的应用场景下,如机器学习模型的存储和传输,使用7z格式压缩可以显著减少所需的存储空间和传输时间。压缩和解压缩7z文件需要相应的软件支持,如7-Zip、WinRAR等。

def forward(self, l, ab, y, idx=None): K = int(self.params[0].item()) T = self.params[1].item() Z_l = self.params[2].item() Z_ab = self.params[3].item() momentum = self.params[4].item() batchSize = l.size(0) outputSize = self.memory_l.size(0) # the number of sample of memory bank inputSize = self.memory_l.size(1) # the feature dimensionality # score computation if idx is None: # 用 AliasMethod 为 batch 里的每个样本都采样 4096 个负样本的 idx idx = self.multinomial.draw(batchSize * (self.K + 1)).view(batchSize, -1) # sample positives and negatives idx.select(1, 0).copy_(y.data) # sample weight_l = torch.index_select(self.memory_l, 0, idx.view(-1)).detach() weight_l = weight_l.view(batchSize, K + 1, inputSize) out_ab = torch.bmm(weight_l, ab.view(batchSize, inputSize, 1)) # sample weight_ab = torch.index_select(self.memory_ab, 0, idx.view(-1)).detach() weight_ab = weight_ab.view(batchSize, K + 1, inputSize) out_l = torch.bmm(weight_ab, l.view(batchSize, inputSize, 1)) if self.use_softmax: out_ab = torch.div(out_ab, T) out_l = torch.div(out_l, T) out_l = out_l.contiguous() out_ab = out_ab.contiguous() else: out_ab = torch.exp(torch.div(out_ab, T)) out_l = torch.exp(torch.div(out_l, T)) # set Z_0 if haven't been set yet, # Z_0 is used as a constant approximation of Z, to scale the probs if Z_l < 0: self.params[2] = out_l.mean() * outputSize Z_l = self.params[2].clone().detach().item() print("normalization constant Z_l is set to {:.1f}".format(Z_l)) if Z_ab < 0: self.params[3] = out_ab.mean() * outputSize Z_ab = self.params[3].clone().detach().item() print("normalization constant Z_ab is set to {:.1f}".format(Z_ab)) # compute out_l, out_ab out_l = torch.div(out_l, Z_l).contiguous() out_ab = torch.div(out_ab, Z_ab).contiguous() # # update memory with torch.no_grad(): l_pos = torch.index_select(self.memory_l, 0, y.view(-1)) l_pos.mul_(momentum) l_pos.add_(torch.mul(l, 1 - momentum)) l_norm = l_pos.pow(2).sum(1, keepdim=True).pow(0.5) updated_l = l_pos.div(l_norm) self.memory_l.index_copy_(0, y, updated_l) ab_pos = torch.index_select(self.memory_ab, 0, y.view(-1)) ab_pos.mul_(momentum) ab_pos.add_(torch.mul(ab, 1 - momentum)) ab_norm = ab_pos.pow(2).sum(1, keepdim=True).pow(0.5) updated_ab = ab_pos.div(ab_norm) self.memory_ab.index_copy_(0, y, updated_ab) return out_l, out_ab

2023-04-19 上传