1.今天用AI studio的notebook来训练模型,一直提示内存溢出,改了batchsize也不行,减少数据读取,也不奏效,原来是多线程的问题,具体解答在此
2.在paddlepaddle学习过程中遇到了一个小问题,关于python的,一直没学会这个,在此记录一下,是关于训练loss用plt显示的代码
plot_x = np.arange(MAX_EPOCH) # 横坐标,是训练轮数
plot_y = np.array(losses_train) # train时得到的loss,是一个list
plt.plot(plot_x, plot_y)
plt.show() # 显示
3.训练轮数的计算
分为外层循环和内层循环,内层循环每一个循环遍历的是数据集的一部分,即batch,外层循环是遍历所有的batch,将数据打乱之后对整个数据集训练,所以外层循环的轮数才是平常说的epoch
#在使用GPU机器时,可以将use_gpu变量设置成True
use_gpu = False # 使用cpu环境
place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace()
with fluid.dygraph.guard(place):
model = MNIST()
model.train()
EPOCH_NUM = 5 # 训练轮数,外层循环
BATCH_SIZE = 100 # batch数,内层循环数=数据集数量/batch数
# 定义学习率,并加载优化器参数到模型中
total_steps = (int(60000//BATCH_SIZE) + 1) * EPOCH_NUM
lr = fluid.dygraph.PolynomialDecay(0.01, total_steps, 0.001)
# 使用Adam优化器
optimizer = fluid.optimizer.AdamOptimizer(learning_rate=lr, parameter_list=model.parameters())
for epoch_id in range(EPOCH_NUM):
# train_loader()得到的是分割好的数据集(batch)
for batch_id, data in enumerate(train_loader()):
#准备数据,变得更加简洁
image_data, label_data = data
image = fluid.dygraph.to_variable(image_data)
label = fluid.dygraph.to_variable(label_data)
#前向计算的过程,同时拿到模型输出值和分类准确率
predict, acc = model(image, label)
avg_acc = fluid.layers.mean(acc)
#计算损失,取一个批次样本损失的平均值
loss = fluid.layers.cross_entropy(predict, label)
avg_loss = fluid.layers.mean(loss)
#每训练了200批次的数据,打印下当前Loss的情况
if batch_id % 200 == 0:
print("epoch: {}, batch: {}, loss is: {}, acc is {}".format(epoch_id, batch_id, avg_loss.numpy(),avg_acc.numpy()))
#后向传播,更新参数的过程
avg_loss.backward()
optimizer.minimize(avg_loss)
model.clear_gradients() # 清除梯度
4.在每个batch计算梯度之后,都会将梯度清零,就像“下山”那样,计算出最快下山的角度并走了一步之后,需要重新计算此时往哪个方向走,下山速度是最快的