用什么技术做网站怎么简化Wordpress欢迎页面
用什么技术做网站,怎么简化Wordpress欢迎页面,wordpress 连接数据库,红河做网站引言
前序学习进程中#xff0c;已经简单学习了全连接层的概念#xff0c;知晓全连接层先把数据展平#xff0c;然后使用激活函数运算数据#xff0c;最后将输出结果直接传递给下一层。 实际上全连接层就是激活函数发挥功能的层#xff0c;通过激活函数可以引入非线性或者…引言前序学习进程中已经简单学习了全连接层的概念知晓全连接层先把数据展平然后使用激活函数运算数据最后将输出结果直接传递给下一层。实际上全连接层就是激活函数发挥功能的层通过激活函数可以引入非线性或者仅保留线性。在最近的学习中卷积运算的矩阵扩充和改变卷积核移动步长操作已经相对熟练为此我们把上述内容结合一下对卷积运算后的结果矩阵稍作运算把负值改为0正值都保留。非负值操作在PyTorch里面取非负值可以直接调用torch.max()函数学习的官方链接为torch.max。torch.max(input,*,out)原理非常简单给定输入张量input直接返回所有输入张量里面的最大值。维度最值计算要想实现数据非负的转变就把最小值设为0.0比0小的全部都会改换成0.0比0.0大的都会保持原值。由于我们的计算结果基本都是float.32这样的浮点数所以把最小值设置为浮点数有利于保持数据稳定。这里给一个简单示例importtorch# 生成5行5列的随机矩阵符合标准正态分布atorch.randn(5,5)print(a,a)# 输出torch.max()函数对比效果print(torch.max(a, 1)\n,torch.max(a,1))这里先生成一个5行5列的标准正态分布随机数矩阵然后进行非负性运算获得的输出效果为根据输出可以看到每一行的最大值都被挑选出来并且还多了一行indices用来记录每一行中最大值所在的列位置。我们最开始可能会以为所有数是和1比大小但实际上是每一行内部元素自己比大小1代表列这个维度这是torch.max(a,1)中1的本意。元素最值计算那该如何让元素和1比大小这就要仔细观察我们是在张量里面定义数据1不是张量所以要对代码稍作改变先把1转换为张量torch.tensor(1.0)importtorch# 生成5行5列的随机矩阵符合标准正态分布atorch.randn(5,5)print(a,a)# 输出torch.max()函数对比效果print(torch.max(a, 1)\n,torch.max(a,1))ttorch.tensor(1.0)print(torch.max(a, torch.tensor(1.0))\n,torch.max(a,t))次时代码的输出效果为很显然小于1.0的元素值都被强制赋值1.0其余元素保持原值卷积元素那结果非负运算在上述讨论的基础上直接进行卷积运算结果的非负运算就比较简单直观。只需要先定义一个和原始计算结果一样大小的全0矩阵然后开展非负运算就可以。核心代码# 初始化全0矩阵使其和卷积计算的结果矩阵大小一致relu_manualtorch.zeros_like(padded_output_cal_tensor)foriinrange(padded_output_cal_tensor.shape[0]):forjinrange(padded_output_cal_tensor.shape[1]):relu_manual[i,j]torch.max(torch.tensor(0.0),padded_output_cal_tensor[i,j])print(ReLu输出)print(relu_manual)此时的运算效果为实际上上述代码是为了逐行展示计算过程也可以直接对比整个矩阵让代码更简洁# 初始化全0矩阵使其和卷积计算的结果矩阵大小一致#relu_manual_storch.zeros_like(padded_output_cal_tensor)relu_manual_storch.max(torch.tensor(0.0),padded_output_cal_tensor)print(ReLu输出)print(relu_manual_s)实际上只用了一行代码就完成了对比。上述代码中的第一行被注释掉是因为确实没有用进行torch.max()对比时会自动给relu_manual_s创造一个和padded_output_cal_tensor等大的矩阵。此时的输出效果和之前一样这里给出两种代码写法输出的对比效果此时的完整代码为importtorch# 1. 定义原始输入3通道5×5和卷积核1边缘检测核input_tensortorch.tensor([# 输入通道1R5×5[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25]],# 输入通道2G5×5[[26,27,28,29,30],[31,32,33,34,35],[36,37,38,39,40],[41,42,43,44,45],[46,47,48,49,50]],# 输入通道3B5×5[[51,52,53,54,55],[56,57,58,59,60],[61,62,63,64,65],[66,67,68,69,70],[71,72,73,74,75]]],dtypetorch.float32)# 形状(3,5,5)# 输出原始通道的形状input_tensor_channels,input_tensor_h,input_tensor_winput_tensor.shapeprint(input_tensor_channels,input_tensor_channels)print(input_tensor_h,input_tensor_h)print(input_tensor_w,input_tensor_w)# 卷积核1边缘检测核3个子核每个3×3kernel1torch.tensor([[[1,0,-1],[1,0,-1],[1,0,-1]],# 子核1R通道[[1,0,-1],[1,0,-1],[1,0,-1]],# 子核2G通道[[1,0,-1],[1,0,-1],[1,0,-1]]# 子核3B通道],dtypetorch.float32)# 形状(3,3,3)# 输出卷积核的形状kernel1_channels,kernel1_h,kernel1_wkernel1.shapeprint(kernel1_channels,kernel1_channels)print(kernel1_h,kernel1_h)print(kernel1_w,kernel1_w)# 通过循环自动计算卷积值# 定义步长为1stride1# 定义卷积运算后的输出矩阵大小out_h(input_tensor_h-kernel1_h)//stride1out_w(input_tensor_w-kernel1_w)//stride1# 为避免对原始矩阵造成破坏新定义一个量来完全复制原始矩阵input_cal_tensorinput_tensor# 输出矩阵里面是所有卷积运算的效果这个矩阵比原始矩阵小先定义为纯0矩阵output_cal_tensortorch.zeros((out_h,out_w),dtypetorch.float32)# 循环计算foriinrange(out_h):forjinrange(out_w):# 对原始矩阵取块进行计算这里定义了取块的起始行in_h_starti*stride# 取块的末行in_h_endin_h_startkernel1_h# 取块的起始列in_w_startj*stride# 取块的末列in_w_endin_w_startkernel1_w# 这是取到的块input_patchinput_cal_tensor[:,in_h_start:in_h_end,in_w_start:in_w_end]# 定义一个空列表output_cal存储数据output_cal[]forkinrange(input_tensor_channels):# k代表了通道数因为每个通道都要进行卷积运算# 因此需要先得到单通道的计算效果然后把它们储存在列表中output_channel(input_patch[k]*kernel1[k]).sum()#print(input_patch[,k,],input_patch[k])#print(output_patch[, k, ], kernel1[k])# 计算结果储存在列表中output_cal.append(output_channel)# 把通道效果叠加后保存到卷积输出矩阵# 这里有3层第一层是每一个子卷积核和原始矩阵的每一个通道进行卷积运算# 第二层是将第一层的卷积运算值按照顺序排放在列表output_cal中# 第三层再将列表中获得数据直接叠加获得当下卷积运算的总值# 综合起来卷积核和每一通道内的对应块对位相乘然后全部求和输出给当前记录卷积值的矩阵# 由于每一个i和j都会对应k个通道所以使用了3层循环来表达output_cal_tensor[i,j]sum(output_cal)#print(output_cal_tensor[, i, j, ], output_cal_tensor[i, j])print(output,output_cal_tensor)# 扩充原始矩阵周围补一圈0padding1padded_hinput_tensor_h2*padding padded_winput_tensor_w2*padding padded_input_tensortorch.zeros((input_tensor_channels,padded_h,padded_w),dtypetorch.float32)padded_input_tensor[:,padding:-padding,padding:-padding]input_tensorprint(padded_input_tensor)# 对扩充后的矩阵卷积运算# 计算卷积矩阵大小padded_out_h(padded_h-kernel1_h)//stride1padded_out_w(padded_w-kernel1_w)//stride1# 为避免对原始矩阵造成破坏新定义一个量来完全复制原始矩阵padded_input_cal_tensorpadded_input_tensor# 输出矩阵里面是所有卷积运算的效果这个矩阵比原始矩阵小先定义为纯0矩阵padded_output_cal_tensortorch.zeros((padded_out_h,padded_out_w),dtypetorch.float32)foriinrange(padded_out_h):forjinrange(padded_out_w):# 对原始矩阵取块进行计算这里定义了取块的起始行in_h_starti*stride# 取块的末行in_h_endin_h_startkernel1_h# 取块的起始列in_w_startj*stride# 取块的末列in_w_endin_w_startkernel1_w# 这是取到的块input_patchpadded_input_cal_tensor[:,in_h_start:in_h_end,in_w_start:in_w_end]# 定义一个空列表output_cal存储数据output_cal[]forkinrange(input_tensor_channels):# k代表了通道数因为每个通道都要进行卷积运算# 因此需要先得到单通道的计算效果然后把它们储存在列表中output_channel(input_patch[k]*kernel1[k]).sum()#print(input_patch[,k,],input_patch[k])#print(output_patch[, k, ], kernel1[k])# 计算结果储存在列表中output_cal.append(output_channel)# 把通道效果叠加后保存到卷积输出矩阵# 这里有3层第一层是每一个子卷积核和原始矩阵的每一个通道进行卷积运算# 第二层是将第一层的卷积运算值按照顺序排放在列表output_cal中# 第三层再将列表中获得数据直接叠加获得当下卷积运算的总值# 综合起来卷积核和每一通道内的对应块对位相乘然后全部求和输出给当前记录卷积值的矩阵# 由于每一个i和j都会对应k个通道所以使用了3层循环来表达padded_output_cal_tensor[i,j]sum(output_cal)#print(padded_output_cal_tensor[, i, j, ], padded_output_cal_tensor[i, j])print(padded_output,padded_output_cal_tensor)# 使卷积计算的负值为0正值不变# 初始化全0矩阵使其和卷积计算的结果矩阵大小一致relu_manualtorch.zeros_like(padded_output_cal_tensor)foriinrange(padded_output_cal_tensor.shape[0]):forjinrange(padded_output_cal_tensor.shape[1]):relu_manual[i,j]torch.max(torch.tensor(0.0),padded_output_cal_tensor[i,j])print(ReLu输出)print(relu_manual)# 简洁代码# 初始化全0矩阵使其和卷积计算的结果矩阵大小一致#relu_manual_storch.zeros_like(padded_output_cal_tensor)relu_manual_storch.max(torch.tensor(0.0),padded_output_cal_tensor)print(ReLu输出)print(relu_manual_s)细节说明torch.max()函数包括维度最值和元素最值两种写法虽然简单但一定要区分比较的元素属性。总结学习了卷积运算结果的非线性处理中的非负性操作。