本进度条代码的本质是:在每个训练轮次中,记录当前已训练个数,并除以训练样本总数获得进度值。再将进度值 乘以 ' 填充符号 ' ,制成进度条。最后,利用print(\r)的光标返回操作,实现进度条的实时更新。
核心代码如下所示:
rate = int(num_plt / 50) # 我们的进度条总长度设定为50
# 进度条的显示部分:
if i % 10 == 9: # 每进行10个批次的训练,添加一个‘=’
progress_bar = '[' + ('=' * ((i + 1) // rate)) + \# 计算当前进度等价于几个‘=’
(' ' * ((train_size // rate - (i + 1) // rate))) + ']'
# 计算‘#’后面的空格长度
print('\repoch: {:d} loss: {:.3f} {}' # \r:光标返回文本开头
.format(epoch + 1, loss, progress_bar), end=" ") # format:三个'{}' 分别对应可更新的 训练轮次、损失值、进度条
由于本人的程序中,一个轮次为500个数据组。并为了使进度条长度为50个字符,防止进度条过长,事先利用数据总数/50 得到换算比例rate,使用时只需整除rate,即可转化为需要的比例。
例如,当运行到第200个数据组时,由于此时rate为10,得到进度条显示为20个“ = ”与30个“ ”。
# 输出结果:
# epoch: 1 loss: 0.000 [==================== ]
# Total accuracy :
完整代码:
此段代码以训练神经网络为应用场景。模拟了将64000份数据分为500批次输入神经网络,进行20轮训练。并根据已训练的数据个数,实时显示训练进度。
完整的训练代码如下所示。相关语句的功能已注释,望各位多提宝贵意见,谢谢!
import time
num_plt = 500
fileNames = range(500)
num = 0
rate = int(num_plt/50)
for file in range(num_plt):
# 进度条的显示部分:
# 进度条的显示部分:
num += 1
time.sleep(0.1)
progress_bar = '[' + ('=' * ((num + 1) // rate)) + \
('*' * ((num_plt // rate - (num + 1) // rate))) + ']'# 计算当前进度等价于几个‘=’,计算‘#’后面的空格长度
print('\rschedule: {:f} {}file: {:d} ' # \r:光标返回文本开头
.format(float(num/num_plt), progress_bar, fileNames[file]), end=" ") # format:三个'{}' 分别对应可更新的 训练轮次、损失值、进度条