1 过拟合问题的描述

1.1 过拟合问题概述

深度额学习训练过程中,在训练阶段得到了较好的准确率,但在识别非数据集数据时存在精度下降的问题,这种现象称为过拟合现象。

主要原因:由于模型的拟合度过高,导致模型不仅学习样本的群体规律,也学习样本的个体规律。

1.2 过拟合问题模型的设计

1.2.1 构建数据集---Over_fitting.py(第1部分)

import sklearn.datasets
import torch
import numpy as np
import  matplotlib.pyplot as plt
from LogicNet_fun import LogicNet,moving_average,predict,plot_decision_boundary# 1 构建数据集
np.random.seed(0) # 设置随机数种子
X , Y =sklearn.datasets.make_moons(40,noise=0.2) # 生成两组半圆形数据
arg = np.squeeze(np.argwhere(Y==0),axis=1) # 获取第1组数据索引
arg2 = np.squeeze(np.argwhere(Y==1),axis=1) # 获取第2组数据索引
# 显示数据
plt.title("train moons data")
plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+',label = 'data1')
plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o',label = 'data2')
plt.legend()
plt.show()

1.2.2 搭建网络模型---Over_fitting.py(第2部分)

# 2 搭建网络模型
model = LogicNet(inputdim=2,hiddendim=500,outputdim=2) # 实例化模型,增加拟合能力将hiddendim赋值为500
optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定义优化器:反向传播过程中使用。

1.2.3 训练模型,并将训练过程可视化---Over_fitting.py(第3部分)

# 3 训练模型+训练过程loss可视化
xt = torch.from_numpy(X).type(torch.FloatTensor) # 将numpy数据转化为张量
yt = torch.from_numpy(Y).type(torch.LongTensor) # 将numpy数据转化为张量
epochs = 1000 # 定义迭代次数
losses = [] # 损失值列表
for i in range(epochs):loss = model.getloss(xt,yt)losses.append(loss.item()) # 保存损失值中间状态optimizer.zero_grad() # 清空梯度loss.backward() # 反向传播损失值optimizer.step() # 更新参数
avgloss = moving_average(losses) # 获得损失值的移动平均值
plt.figure(1)
plt.subplot(211)
plt.xlabel('step number')
plt.ylabel('Training loss')
plt.title('step number vs Training loss')
plt.show()

1.2.4 将模型结果可视化,观察过拟合现象---Over_fitting.py(第4部分)

# 4 模型结果可视化,观察过拟合现象
plot_decision_boundary(lambda x: predict(model,x),X,Y)
from sklearn.metrics import accuracy_score
print("训练时的准确率",accuracy_score(model.predict(xt),yt))
# 重新生成两组半圆数据
Xtest,Ytest = sklearn.datasets.make_moons(80,noise=0.2)
plot_decision_boundary(lambda x: predict(model,x),Xtest,Ytest)
Xtest_t = torch.from_numpy(Xtest).type(torch.FloatTensor) # 将numpy数据转化为张量
Ytest_t = torch.from_numpy(Ytest).type(torch.LongTensor)
print("测试时准确率",accuracy_score(model.predict(Xtest_t),Ytest_t))

1.2.5 模型代码总览---Over_fitting.py(总结)

#####Over_fitting.pyimport sklearn.datasets
import torch
import numpy as np
import  matplotlib.pyplot as plt
from LogicNet_fun import LogicNet,moving_average,predict,plot_decision_boundary# 1 构建数据集
np.random.seed(0) # 设置随机数种子
X , Y =sklearn.datasets.make_moons(40,noise=0.2) # 生成两组半圆形数据
arg = np.squeeze(np.argwhere(Y==0),axis=1) # 获取第1组数据索引
arg2 = np.squeeze(np.argwhere(Y==1),axis=1) # 获取第2组数据索引
# 显示数据
plt.title("train moons data")
plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+',label = 'data1')
plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o',label = 'data2')
plt.legend()
plt.show()# 2 搭建网络模型
model = LogicNet(inputdim=2,hiddendim=500,outputdim=2) # 实例化模型,增加拟合能力将hiddendim赋值为500
optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定义优化器:反向传播过程中使用。# 3 训练模型+训练过程loss可视化
xt = torch.from_numpy(X).type(torch.FloatTensor) # 将numpy数据转化为张量
yt = torch.from_numpy(Y).type(torch.LongTensor) # 将numpy数据转化为张量
epochs = 1000 # 定义迭代次数
losses = [] # 损失值列表
for i in range(epochs):loss = model.getloss(xt,yt)losses.append(loss.item()) # 保存损失值中间状态optimizer.zero_grad() # 清空梯度loss.backward() # 反向传播损失值optimizer.step() # 更新参数
avgloss = moving_average(losses) # 获得损失值的移动平均值
plt.figure(1)
plt.subplot(211)
plt.xlabel('step number')
plt.ylabel('Training loss')
plt.title('step number vs Training loss')
plt.show()# 4 模型结果可视化,观察过拟合现象
plot_decision_boundary(lambda x: predict(model,x),X,Y)
from sklearn.metrics import accuracy_score
print("训练时的准确率",accuracy_score(model.predict(xt),yt))
# 重新生成两组半圆数据
Xtest,Ytest = sklearn.datasets.make_moons(80,noise=0.2)
plot_decision_boundary(lambda x: predict(model,x),Xtest,Ytest)
Xtest_t = torch.from_numpy(Xtest).type(torch.FloatTensor) # 将numpy数据转化为张量
Ytest_t = torch.from_numpy(Ytest).type(torch.LongTensor)
print("测试时准确率",accuracy_score(model.predict(Xtest_t),Ytest_t))
LogicNet_fun.py
### LogicNet_fun.pyimport torch.nn as nn #引入torch网络模型库
import torch
import numpy as np
import matplotlib.pyplot as plt# 1.2 定义网络模型
class LogicNet(nn.Module): #继承nn.Module类,构建网络模型def __init__(self,inputdim,hiddendim,outputdim): #初始化网络结构 ===》即初始化接口部分super(LogicNet,self).__init__()self.Linear1 = nn.Linear(inputdim,hiddendim) #定义全连接层self.Linear2 = nn.Linear(hiddendim,outputdim) #定义全连接层self.criterion = nn.CrossEntropyLoss() #定义交叉熵函数def forward(self,x):# 搭建用两个全连接层组成的网络模型 ===》 即正向接口部分:将网络层模型结构按照正向传播的顺序搭建x = self.Linear1(x)# 将输入传入第一个全连接层x = torch.tanh(x)# 将第一个全连接层的结果进行非线性变化x = self.Linear2(x)# 将网络数据传入第二个全连接层return xdef predict(self,x):# 实现LogicNet类的预测窗口 ===》 即预测接口部分:利用搭建好的正向接口,得到模型预测结果#调用自身网络模型,并对结果进行softmax()处理,分别的出预测数据属于每一个类的概率pred = torch.softmax(self.forward(x),dim=1)# 将正向结果进行softmax(),分别的出预测结果属于每一个类的概率return torch.argmax(pred,dim=1)# 返回每组预测概率中最大的索引def getloss(self,x,y):# 实现LogicNet类的损失值接口 ===》 即损失值计算接口部分:计算模型的预测结果与真实值之间的误差,在反向传播时使用y_pred = self.forward(x)loss = self.criterion(y_pred,y)# 计算损失值的交叉熵return loss# 1.5 训练可视化
def moving_average(a,w=10): #计算移动平均损失值if len(a) < w:return a[:]return [val if idx < w else sum(a[(idx - w):idx]) / w for idx, val in enumerate(a)]def moving_average_to_simp(a,w=10): #if len(a) < w:return a[:]val_list = []for idx, val in enumerate(a):if idx < w:# 如果列表 a 的下标小于 w, 直接将元素添加进 xxx 列表val_list.append(val)else:#  向前取 10 个元素计算平均值, 添加到 xxx 列表val_list.append(sum(a[(idx - w):idx]) / w)def plot_losses(losses):avgloss = moving_average(losses)#获得损失值的移动平均值plt.figure(1)plt.subplot(211)plt.plot(range(len(avgloss)),avgloss,'b--')plt.xlabel('step number')plt.ylabel('Training loss')plt.title('step number vs Training loss')plt.show()# 1.7 数据可视化模型
def predict(model,x): #封装支持Numpy的预测接口x = torch.from_numpy(x).type(torch.FloatTensor)model = LogicNet(inputdim=2, hiddendim=3, outputdim=2)ans = model.predict(x)return ans.numpy()def plot_decision_boundary(pred_func,X,Y): #在直角模型中实现预测结果的可视化#计算范围x_min ,x_max = X[:,0].min()-0.5 , X[:,0].max()+0.5y_min ,y_max = X[:,1].min()-0.5 , X[:,1].max()+0.5h=0.01xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))#根据数据输入进行预测Z = pred_func(np.c_[xx.ravel(),yy.ravel()])Z = Z.reshape(xx.shape)#将数据的预测结果进行可视化plt.contourf(xx,yy,Z,cmap=plt.cm.Spectral)plt.title("Linear predict")arg = np.squeeze(np.argwhere(Y==0),axis=1)arg2 = np.squeeze(np.argwhere(Y==1),axis=1)plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+')plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o')plt.show()

2 改善过拟合现象的方法

2.1 过拟合现象产生的原因

因为神经网络在训练过程中,只看到有限的信息,在数据量不足的情况下,无法合理地区分哪些属于个体特征,哪些属于群体特征。而在真实场景下,所有的样本特征都是多样的,很难在训练数据集中将所有的样本情况全部包括。

2.2 有效改善过拟合现象的方法

2.2.1 early stopping

在发生过拟合之前提前结束训l练。这个方法在理论上是可行的,但是这个结束的时间点不好把握。

2.2.2 数据集扩增(data augmentation)

让模型见到更多的情况,可以最大化满足全样本,但实际应用中,对于未来事件的颈测却显得力不丛心。

2.2.3 正则化

通过范数的概念,增强模型的泛化能力,包括L1正则化、L2正则化(L2正则化也称为weight decay).

2.2.4 dropout

每次训练时舍去一些节点来增强泛化能力

3 正则化

在神经网络计算损失值的过程中,在损失后面再加一项。这样损失值所代表的输出与标准结果间的误差就会受到干扰,导致学习参数w和b无法按照目标方向来调整。实现模型无法与样本完全拟合的结果,达到防止过拟合的效果。

3.1 正则化效果描述

不加正则化训练出来的模型:

加了正则的模型表现

可以看到训练出来的模型太复杂,会影响使用,容易过拟合。

3.2 正则化的分类与公式

3.2.1 干扰项的特性

当欠拟合(模型的拟合能力不足)时,希望它对模型误差影响尽量小,让模型快速来拟合实际。
当过拟合(模型的拟合能力过强)时,希望它对模型误差影响尽量大,让模型不要产生过拟合的情况。

3.2.2 范数

L1:所有学习参数w的绝对值的和

L2:所有学习参数w的平方和,然后求平方根

3.2.3 正则化的损失函数-L1

3.2.4 正则化的损失函数-L2

3.3 L2正则化的实现

3.3.1 正则化实现

使用weight_decay参数指定权重衰减率,相当于L2正则化中的正则化系数,用来调整正则化对loss的影响。

weight_decay参数默认对模型中的所有参数进行L2正则化处理,包括权重w和偏置b。

3.3.2 优化器参数的方式实现正则化:字典的方式实现

optimizer =torch.optim.Adam([{'params':weight_p,'weight_decay':0.001},{'params':bias_p,'weight_decay':0}],lr=0.01)

字典中的param以指的是模型中的权重。将具体的权重张量放入优化器再为参数weight_decay赋值,指定权重值哀减率,便可以实现为指定参数进行正则化处理。

如何获得权重张量weight_p与bias_p?

# 主要通过实例化后的模型对象得到
weight_p , bias_p =[],[]
for name , p in model.named_parameters():if 'bias' in name:bias_p += [p]else:weight_p += [p]

3.4 使用L2正则化改善模型的过拟合状况

3.4.1 修改Over_fitting.py 中的优化器部分

import sklearn.datasets
import torch
import numpy as np
import  matplotlib.pyplot as plt
from LogicNet_fun import LogicNet,moving_average,predict,plot_decision_boundary# 1 构建数据集
np.random.seed(0) # 设置随机数种子
X , Y =sklearn.datasets.make_moons(40,noise=0.2) # 生成两组半圆形数据
arg = np.squeeze(np.argwhere(Y==0),axis=1) # 获取第1组数据索引
arg2 = np.squeeze(np.argwhere(Y==1),axis=1) # 获取第2组数据索引
# 显示数据
plt.title("train moons data")
plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+',label = 'data1')
plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o',label = 'data2')
plt.legend()
plt.show()# 2 搭建网络模型
model = LogicNet(inputdim=2,hiddendim=500,outputdim=2) # 实例化模型,增加拟合能力将hiddendim赋值为500
#optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定义优化器:反向传播过程中使用。
# 修改为:
#添加正则化处理
weight_p , bias_p =[],[]
for name , p in model.named_parameters(): # 获取模型中的所有参数及参数名字if 'bias' in name:bias_p += [p] # 收集偏置参数else:weight_p += [p] # 收集权重
optimizer =torch.optim.Adam([{'params':weight_p,'weight_decay':0.001},{'params':bias_p,'weight_decay':0}],lr=0.01) # 带有正则化处理的优化器

3.4.2 regularization01.py 总览

import sklearn.datasets
import torch
import numpy as np
import  matplotlib.pyplot as plt
from LogicNet_fun import LogicNet,moving_average,predict,plot_decision_boundary# 1 构建数据集
np.random.seed(0) # 设置随机数种子
X , Y =sklearn.datasets.make_moons(40,noise=0.2) # 生成两组半圆形数据
arg = np.squeeze(np.argwhere(Y==0),axis=1) # 获取第1组数据索引
arg2 = np.squeeze(np.argwhere(Y==1),axis=1) # 获取第2组数据索引
# 显示数据
plt.title("train moons data")
plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+',label = 'data1')
plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o',label = 'data2')
plt.legend()
plt.show()# 2 搭建网络模型
model = LogicNet(inputdim=2,hiddendim=500,outputdim=2) # 实例化模型,增加拟合能力将hiddendim赋值为500
#optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定义优化器:反向传播过程中使用。
# 修改为:
#添加正则化处理
weight_p , bias_p =[],[]
for name , p in model.named_parameters(): # 获取模型中的所有参数及参数名字if 'bias' in name:bias_p += [p] # 收集偏置参数else:weight_p += [p] # 收集权重
optimizer =torch.optim.Adam([{'params':weight_p,'weight_decay':0.001},{'params':bias_p,'weight_decay':0}],lr=0.01) # 带有正则化处理的优化器# 3 训练模型+训练过程loss可视化
xt = torch.from_numpy(X).type(torch.FloatTensor) # 将numpy数据转化为张量
yt = torch.from_numpy(Y).type(torch.LongTensor) # 将numpy数据转化为张量
epochs = 1000 # 定义迭代次数
losses = [] # 损失值列表
for i in range(epochs):loss = model.getloss(xt,yt)losses.append(loss.item()) # 保存损失值中间状态optimizer.zero_grad() # 清空梯度loss.backward() # 反向传播损失值optimizer.step() # 更新参数
avgloss = moving_average(losses) # 获得损失值的移动平均值
plt.figure(1)
plt.subplot(211)
plt.xlabel('step number')
plt.ylabel('Training loss')
plt.title('step number vs Training loss')
plt.show()# 4 模型结果可视化,观察过拟合现象
plot_decision_boundary(lambda x: predict(model,x),X,Y)
from sklearn.metrics import accuracy_score
print("训练时的准确率",accuracy_score(model.predict(xt),yt))
# 重新生成两组半圆数据
Xtest,Ytest = sklearn.datasets.make_moons(80,noise=0.2)
plot_decision_boundary(lambda x: predict(model,x),Xtest,Ytest)
Xtest_t = torch.from_numpy(Xtest).type(torch.FloatTensor) # 将numpy数据转化为张量
Ytest_t = torch.from_numpy(Ytest).type(torch.LongTensor)
print("测试时准确率",accuracy_score(model.predict(Xtest_t),Ytest_t))

4 数据集扩增(data augmentation)

4.1 数据集增广

增加数据集

4.2 通过增大数据集的方式改善过拟合的状况

4.2.1 修改Over_fitting.py 中的优化器部分

# 2 搭建网络模型
model = LogicNet(inputdim=2,hiddendim=500,outputdim=2) # 实例化模型,增加拟合能力将hiddendim赋值为500
optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定义优化器:反向传播过程中使用。# 3 训练模型+训练过程loss可视化
# xt = torch.from_numpy(X).type(torch.FloatTensor) # 将numpy数据转化为张量
# yt = torch.from_numpy(Y).type(torch.LongTensor) # 将numpy数据转化为张量
# epochs = 1000 # 定义迭代次数
# losses = [] # 损失值列表
# for i in range(epochs):
#     loss = model.getloss(xt,yt)
#     losses.append(loss.item()) # 保存损失值中间状态
#     optimizer.zero_grad() # 清空梯度
#     loss.backward() # 反向传播损失值
#     optimizer.step() # 更新参数
# avgloss = moving_average(losses) # 获得损失值的移动平均值# 修改为
epochs = 1000 # 定义迭代次数
losses = [] # 损失值列表
for i in range(epochs):X ,Y = sklearn.datasets.make_moons(40,noise=0.2)xt = torch.from_numpy(X).type(torch.FloatTensor)yt = torch.from_numpy(Y).type(torch.LongTensor)loss = model.getloss(xt,yt)losses.append(loss.item())optimizer.zero_grad()loss.backward()optimizer.step()

4.2.2 Data_increase.py

import sklearn.datasets
import torch
import numpy as np
import  matplotlib.pyplot as plt
from LogicNet_fun import LogicNet,moving_average,predict,plot_decision_boundary# 1 构建数据集
np.random.seed(0) # 设置随机数种子
X , Y =sklearn.datasets.make_moons(40,noise=0.2) # 生成两组半圆形数据
arg = np.squeeze(np.argwhere(Y==0),axis=1) # 获取第1组数据索引
arg2 = np.squeeze(np.argwhere(Y==1),axis=1) # 获取第2组数据索引
# 显示数据
plt.title("train moons data")
plt.scatter(X[arg,0],X[arg,1],s=100,c='b',marker='+',label = 'data1')
plt.scatter(X[arg2,0],X[arg2,1],s=40,c='r',marker='o',label = 'data2')
plt.legend()
plt.show()# 2 搭建网络模型
model = LogicNet(inputdim=2,hiddendim=500,outputdim=2) # 实例化模型,增加拟合能力将hiddendim赋值为500
optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 定义优化器:反向传播过程中使用。# 3 训练模型+训练过程loss可视化
# xt = torch.from_numpy(X).type(torch.FloatTensor) # 将numpy数据转化为张量
# yt = torch.from_numpy(Y).type(torch.LongTensor) # 将numpy数据转化为张量
# epochs = 1000 # 定义迭代次数
# losses = [] # 损失值列表
# for i in range(epochs):
#     loss = model.getloss(xt,yt)
#     losses.append(loss.item()) # 保存损失值中间状态
#     optimizer.zero_grad() # 清空梯度
#     loss.backward() # 反向传播损失值
#     optimizer.step() # 更新参数
# avgloss = moving_average(losses) # 获得损失值的移动平均值# 修改为
epochs = 1000 # 定义迭代次数
losses = [] # 损失值列表
for i in range(epochs):X ,Y = sklearn.datasets.make_moons(40,noise=0.2)xt = torch.from_numpy(X).type(torch.FloatTensor)yt = torch.from_numpy(Y).type(torch.LongTensor)loss = model.getloss(xt,yt)losses.append(loss.item())optimizer.zero_grad()loss.backward()optimizer.step()plt.figure(1)
plt.subplot(211)
plt.xlabel('step number')
plt.ylabel('Training loss')
plt.title('step number vs Training loss')
plt.show()# 4 模型结果可视化,观察过拟合现象
plot_decision_boundary(lambda x: predict(model,x),X,Y)
from sklearn.metrics import accuracy_score
print("训练时的准确率",accuracy_score(model.predict(xt),yt))
# 重新生成两组半圆数据
Xtest,Ytest = sklearn.datasets.make_moons(80,noise=0.2)
plot_decision_boundary(lambda x: predict(model,x),Xtest,Ytest)
Xtest_t = torch.from_numpy(Xtest).type(torch.FloatTensor) # 将numpy数据转化为张量
Ytest_t = torch.from_numpy(Ytest).type(torch.LongTensor)
print("测试时准确率",accuracy_score(model.predict(Xtest_t),Ytest_t))
												

【Pytorch神经网络理论篇】 14 过拟合问题的优化技巧(一):基本概念+正则化+数据增大相关推荐

  1. 【Pytorch神经网络理论篇】 15 过拟合问题的优化技巧(二):Dropout()方法

    1 Dropout方法 2.1 Dropout原理 在训练过程中,每次随机选择一部分节点不去进行学习. 2.1.1 从Dropout原理来看过拟合的原因 任何一个模型不能完全把数据分开,在某一类中一定 ...

  2. 【Pytorch神经网络理论篇】 16 过拟合问题的优化技巧(三):批量归一化

    1 批量归一化理论 1.1 批量归一化原理 1.2 批量归一化定义 将每一层运算出来的数据归一化成均值为0.方差为1的标准高斯分布.这样就会在保留样本的分布特征,又消除了层与层间的分布差异. 在实际应 ...

  3. 【Pytorch神经网络理论篇】 20 神经网络中的注意力机制

    注意力机制可以使神经网络忽略不重要的特征向量,而重点计算有用的特征向量.在抛去无用特征对拟合结果于扰的同时,又提升了运算速度. 1 注意力机制 所谓Attention机制,便是聚焦于局部信息的机制,比 ...

  4. 【Pytorch神经网络理论篇】 27 图神经网络DGL库:简介+安装+卸载+数据集+PYG库+NetWorkx库

    DGL库是由纽约大学和亚马逊联手推出的图神经网络框架,支持对异构图的处理,开源相关异构图神经网络的代码,在GCMC.RGCN等业内知名的模型实现上也取得了很好的效果. 1 DGL库 1.1 DGL库的 ...

  5. 【Pytorch神经网络理论篇】 06 神经元+神经网络模型+全连接网络模型

    1 神经元 1.1 概述 1.1.1 神经网络 神经网络:一种人工模仿动物中枢系统的数学模型,用于对函数进行近似估计 1.1.2 神经元 神经网络的基本单位是神经元. 神经元是一种处理单元,是对人脑组 ...

  6. 【Pytorch神经网络理论篇】 34 样本均衡+分类模型常见损失函数

    同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深 ...

  7. 【Pytorch神经网络理论篇】 32 PNASNet模型:深层可分离卷积+组卷积+空洞卷积

    1 PNASNet模型简介 PNASNet模型是Google公司的AutoML架构自动搜索所产生的模型,它使用渐进式网络架构搜索技术,并通过迭代自学习的方式,来寻找最优网络结构.即用机器来设计机器学习 ...

  8. 【Pytorch神经网络理论篇】 31 图片分类模型:ResNet模型+DenseNet模型+EffcientNet模型

    1 ResNet模型 在深度学习领域中,模型越深意味着拟合能力越强,出现过拟合问题是正常的,训练误差越来越大却是不正常的. 1.1 训练误差越来越大的原因 在反向传播中,每一层的梯度都是在上一层的基础 ...

  9. 【Pytorch神经网络理论篇】 29 图卷积模型的缺陷+弥补方案

    图卷积模型在每个全连接网络层的结果中加入了样本间的特征计算.其述质是依赖深度学特征与缺陷. 1.1 全连接网络的特征与缺陷 多层全连接神经网络被称为万能的拟合神经网络.先在单个网络层中用多个神经元节点 ...

最新文章

  1. 机器视觉系统的几个问题解析
  2. 如何做一个新产品的第一个版本:关于MVP和上线时间的权衡
  3. python androidhelper怎么点击屏幕_python:如何模拟helper方法?
  4. 个人觉得不错的网站或文章
  5. python获取坐标颜色,python – 根据一组坐标的数据着色地图
  6. Android Animation学习(三) ApiDemos解析:XML动画文件的使用
  7. linux去掉日志中的skipping,Linux日志文件总管 logrotate
  8. 读《刘帅:在失望中寻找希望》有感
  9. ASP.NET MVC中的控制器激活与反射之间的联系(帮助理解)
  10. php 后端服务错误定义,【后端开发】php常见的错误类型有哪四种
  11. mybatis当传入数据类型为Int时并且值为0时,会判断为空字符串
  12. 收集最火的开源项目——PHP 篇
  13. 初学键盘计算机输入时注意,打字练习说明.doc
  14. 7.8 Introduce Local Extension 引入本地扩展
  15. XingGAN for Person Image Generation(人体姿势生成笔记)
  16. 如何实现微信和淘宝的扫码登录 ?
  17. 【matlab】拟合直线的方法
  18. 清理电脑C盘全攻略 - 是时候给你的系统盘放个假了!
  19. python 将函数封装成pyd或者so文件,调用该文件
  20. OpenGL程序VC框架:Bezier 曲线

热门文章

  1. 千位分隔符转换为数字
  2. ipv4到ipv6的过渡
  3. vue项目token放在哪里_关于vue动态菜单的那点事
  4. Python脚本实现图片加水印
  5. ubuntu系统下Java环境JDK的安装
  6. 计算机研究所专业课,【择校必看】十三所计算机专业课只考数据结构的985院校!...
  7. php excel 分页,excel分页线怎么增加
  8. 面向对象与软件工程—团队作业1
  9. 五分钟读懂UML类图
  10. java console 到文件