DeepLearning参数相关
内置参数
参数属于模型内部的配置变量,它们通常在建模过程自动学习得出。如:线性回归或逻辑回归中的系数、支持向量机中的支持向量、神经网络中的权重。
reset_parameters()
函数用来初始化参数
1.kaiming_uniform_按照均匀分布初始化tensor
2.kaiming_normal_,即参数在N(0,std)中采样
超参数
超参数属于模型外部的配置变量,他们通常由研究员根据自身建模经验手动设定。如学习速率,迭代次数,层数、K近邻中的K值。
1. epoch
当一个完整的数据集通过神经网络一次并且返回一次的过程称为一个epoch。 然而,当一个epoch对于计算机太过庞大时,就需要把它分成多个小块。
2. batch
在不能将数据一次性通过神经网络的适合,就需要将数据集分成几个batch。
3. batch_size
直观的理解 一个batch中的样本总数(一次训练所选取的样本数)。batch_size的大小影响模型的优化程度和速度。同时其直接影响到GPU内存的使用情况,假如你GPU显存不大,该数值最好设置小一点。
4. 为什么要提出Batch Size?
在没有使用Batch Size之前,这意味着网络在训练时,是一次把所有的数据(整个数据库)输入网络中,然后计算它们的梯度进行反向传播,由于在计算梯度时使用了整个数据库,所以计算得到的梯度方向更为准确。但在这情况下,计算得到不同梯度值差别巨大,难以使用一个全局的学习率,所以这时一般使用Rprop这种基于梯度符号的训练算法,单独进行梯度更新。
在小样本数的数据库中,不使用Batch Size是可行的,而且效果也很好。但是一旦是大型的数据库,一次性把所有数据输进网络,肯定会引起内存的爆炸。所以就提出了Batch Size的概念。
5. Batch Size设置合适时的优点:
1、通过并行化提高内存的利用率。就是尽量让你的GPU满载运行,提高训练速度。
2、单个epoch的迭代次数减少了,参数的调整也慢了,假如要达到相同的识别精度,需要更多的epoch。
3、适当Batch Size使得梯度下降方向更加准确。
6. Batch Size从小到大的变化对网络影响
1、没有Batch Size,梯度准确,只适用于小样本数据库
2、Batch Size=1,梯度变来变去,非常不准确,网络很难收敛。
3、Batch Size增大,梯度变准确,
4、Batch Size增大,梯度已经非常准确,再增加Batch Size也没有用
注意:Batch Size增大了,要到达相同的准确度,必须要增大epoch。
7. iteration
所谓iterations就是完成一次epoch所需的batch个数。
batch numbers(NUM_BATCH_PER_EPOCH)就是iterations。
个人理解有两种情况:
- 假设训练集有2000个数据,设置batch_size为500,则会被分成4个batch。运行所有的数据进行训练,完成1个epoch,需要进行4次iterations,所以NUM_BATCH_PER_EPOCH也是4(不需要手动设置NUM_BATCH_PER_EPOCH,不会重复使用训练集的数据)。
- 设置了NUM_BATCH_PER_EPOCH,每次从训练集随机选取batch_size个数据,1个epoch里面循环NUM_BATCH_PER_EPOCH次。
例如:
def train():
model.train()
for e in range(EPOCHS):
for batch in range(NUM_BATCH_PER_EPOCH):
batch_src_index = np.random.choice(train_index, size=(BTACH_SIZE,))
batch_src_label = torch.from_numpy(train_label[batch_src_index]).long().to(DEVICE)
batch_sampling_result = multihop_sampling(batch_src_index, NUM_NEIGHBORS_LIST, data.adjacency_dict)
batch_sampling_x = [torch.from_numpy(x[idx]).float().to(DEVICE) for idx in batch_sampling_result]
batch_train_logits = model(batch_sampling_x)
loss = criterion(batch_train_logits, batch_src_label)
optimizer.zero_grad()
loss.backward() # 反向传播计算参数的梯度
optimizer.step() # 使用优化方法进行梯度更新
print("Epoch {:03d} Batch {:03d} Loss: {:.4f}".format(e, batch, loss.item()))
test()
参考资料:
神经网络中epoch、batch、batch_size、epoch、iteration理解
Pytorch 默认参数初始化
深度学习中的Epoch,Batchsize,Iterations,都是什么鬼?