CPU深度学习训练速度过慢+keras深度学习训练常见函数解释 您所在的位置:网站首页 python提高cpu利用率 CPU深度学习训练速度过慢+keras深度学习训练常见函数解释

CPU深度学习训练速度过慢+keras深度学习训练常见函数解释

2023-08-17 22:08| 来源: 网络整理| 查看: 265

2020/5/2-5/5 记录 cpu训练速度慢的可能原因

请参考 深度学习训练速度的提高的一些浅见(1)gpu,cpu,硬盘等硬件

1.【线程】 pytorch以及tensorflow的多线程输入设定过大,一般推荐较大数据流4线程,较小2线程。具体问题具体分析,要看数据输入是否是训练速度优化的瓶颈。 numpy或者opencv等的多线程操作或者tensorflow以及pytorch在cpu运行上的op。这些模块使用OMP或者MKL进行多线程加速,一般默认为cpu线程总数的一半,十分浪费计算力,推荐使用4线程,详见下表。 在这里插入图片描述 解决办法:在python文件中加入以下语句,置于顶部,并放在import numpy等的前面,提前声明全局环境变量。

import os os.environ["MKL_NUM_THREADS"] = '4' os.environ["NUMEXPR_NUM_THREADS"] = 4' os.environ["OMP_NUM_THREADS"] = '4'

【2】硬盘IO 【3】内存

VGG训练的主程序train.py主要内容 VGG训练的主程序中主要函数解释

训练的主函数主要包括如下部分:读数据+建模型+设置+训练。 1、读取训练用txt,并打乱,利用该txt进行训练集和测试集的划分。 2、建立VGG16模型,载入权重。这里要注意skip_mismatch=True。 3、利用model.layers[i].trainable = False将VGG16前面的卷积层设置成不可训练。仅训练最后五层。 3、设定模型保存的方式、学习率下降的方式、是否需要早停。 4、利用model.fit_generator训练模型。

str.split函数用法 name= lines [i].split(';')[0] #取每个样本的名字,因为txt文件中是这样存储的“cat.10002.jpg;0” #str.split(“;”)[0]得到的是第一个;之前的内容 #str.split(“;”)[1]得到的是第一个;和第二个;之间的内容

str.split详细解释及范例

cv2.imread()

cv2.imread()用于读取图片文件

imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形式,有三种:

cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1。 cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0。 cv2.IMREAD_UNCHANGED:包括alpha,可以直接写-1

cv2.imread()读取图片后已多维数组的形式保存图片信息,前两维表示图片的像素坐标,最后一维表示图片的通道索引,具体图像的通道数由图片的格式来决定

to_catergorical

简单来说:keras.utils.to_categorical函数:是把类别标签转换为onehot编码(categorical就是类别标签的意思,表示现实世界中你分类的各类别), 而onehot编码是一种方便计算机处理的二元编码。 参考:https://blog.csdn.net/qian2213762498/article/details/86584335

file.readlines()函数

python中read(), readline(), readlines()

np.random.seed()和np.random.shuffle() np.random.seed(10101) np.random.shuffle(lines) #打乱lines np.random.seed(None)

#seed( ) 用于指定随机数生成时所用算法开始的整数值, # 如果使用相同的seed( )值,则每次生成的随即数都相同,每次shuffle结果都相同 # 如果不设置这个值,则系统根据时间来自己选择这个值, # 此时每次生成的随机数因时间差异而不同。 #只针对每个程序,即程序A中seed(345)和程序B 中seed(345)生成的还是不一样的随机数

ModelCheckpoint 和 EarlyStopping

函数原型

keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)

作用

该回调函数将在每个epoch后保存模型到filepath

参数

filename:字符串,保存模型的路径,filepath可以是格式化的字符串,里面的占位符将会被epoch值和传入on_epoch_end的logs关键字所填入。 例如: filepath = “weights_{epoch:03d}-{val_loss:.4f}.h5” 则会生成对应epoch和验证集loss的多个文件。

monitor:需要监视的值,通常为:val_acc 或 val_loss 或 acc 或 loss

verbose:信息展示模式,0或1。为1表示输出epoch模型保存信息,默认为0表示不输出该信息,信息形如: Epoch 00001: val_acc improved from -inf to 0.49240, saving model to /xxx/checkpoint/model_001-0.3902.h5

save_best_only:当设置为True时,将只保存在验证集上性能最好的模型

mode:‘auto’,‘min’,‘max’之一,在save_best_only=True时决定性能最佳模型的评判准则,例如,当监测值为val_acc时,模式应为max,当检测值为val_loss时,模式应为min。在auto模式下,评价准则由被监测值的名字自动推断。

save_weights_only:若设置为True,则只保存模型权重,否则将保存整个模型(包括模型结构,配置信息等)

period:CheckPoint之间的间隔的epoch数

EarlyStopping

函数原型

keras.callbacks.EarlyStopping(monitor='val_loss', patience=0, verbose=0, mode='auto')

当监测值不再改善时,该回调函数将中止训练

参数

monitor: 监控的数据接口,有’acc’,’val_acc’,’loss’,’val_loss’等等。正常情况下如果有验证集,就用’val_acc’或者’val_loss’。但是因为笔者用的是5折交叉验证,没有单设验证集,所以只能用’acc’了。

min_delta:增大或减小的阈值,只有大于这个部分才算作improvement。这个值的大小取决于monitor,也反映了你的容忍程度。例如笔者的monitor是’acc’,同时其变化范围在70%-90%之间,所以对于小于0.01%的变化不关心。加上观察到训练过程中存在抖动的情况(即先下降后上升),所以适当增大容忍程度,最终设为0.003%。

patience:能够容忍多少个epoch内都没有improvement。这个设置其实是在抖动和真正的准确率下降之间做tradeoff。如果patience设的大,那么最终得到的准确率要略低于模型可以达到的最高准确率。如果patience设的小,那么模型很可能在前期抖动,还在全图搜索的阶段就停止了,准确率一般很差。patience的大小和learningrate直接相关。在learning rate设定的情况下,前期先训练几次观察抖动的epoch number,比其稍大些设置patience。在learning rate变化的情况下,建议要略小于最大的抖动epoch number。笔者在引入EarlyStopping之前就已经得到可以接受的结果了,EarlyStopping算是锦上添花,所以patience设的比较高,设为抖动epoch number的最大值。

mode: 就’auto’, ‘min’, ,max’三个可能。如果知道是要上升还是下降,建议设置一下。笔者的monitor是’acc’,所以mode=’max’。

min_delta和patience都和“避免模型停止在抖动过程中”有关系,所以调节的时候需要互相协调。通常情况下,min_delta降低,那么patience可以适当减少;min_delta增加,那么patience需要适当延长;反之亦然。

ReduceLROnPlateau keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', epsilon=0.0001, cooldown=0, min_lr=0)

verbose:如果为True,则为每次更新向stdout输出一条消息。 默认值:False monitor:被监测的量

factor:每次减少学习率的因子,学习率将以lr = lr*factor的形式被减少

patience:当patience个epoch过去而模型性能不提升时,学习率减少的动作会被触发

mode:‘auto’,‘min’,‘max’之一,在min模式下,如果检测值触发学习率减少。在max模式下,当检测值不再上升则触发学习率减少。

epsilon:阈值,用来确定是否进入检测值的“平原区”

cooldown:学习率减少后,会经过cooldown个epoch才重新进行正常操作

min_lr:学习率的下限

keras model.compile的用法

通过调用 compile 方法配置该模型的学习流程:

optimizer:优化器,如Adam

loss:计算损失,这里用的是交叉熵损失

metrics: 列表,包含评估模型在训练和测试时的性能的指标,典型用法是metrics=[‘accuracy’]。如果要在多输出模型中为不同的输出指定不同的指标,可向该参数传递一个字典,例如metrics={‘output_a’: ‘accuracy’}

model.compile(optimizer=tf.keras.optimizers.Adam(0.001), loss=tf.keras.losses.categorical_crossentropy, metrics=[tf.keras.metrics.categorical_accuracy])

loss函数大全

model.fit_generator() model.fit_generator(generate_array_from_file([:num_train],batch_size), steps_per_epoch=max(1,num_train//batch_size), validation_data=generate_array_from_file(lines[num_train:],batch_size), validation_steps= max(1,num_val//batch_size), epochs=50, initial_epoch=0, callbacks=[checkpoint_period1,reduce_lr] #callbacks=[回调函数们]callback函数执行了大量的工作, # 包括loss、acc值的记录,以及训练中间结果的日志反馈, # 最重要的是模型数据的输出,也是通过callback的方式实现; )

model.fit_generator参数解释 callbacks

if name == ‘main’

一个Python源码文件(.py)除了可以被直接运行外,还可以作为模块(也就是库),被其他.py文件导入。不管是直接运行还是被导入,.py文件的最顶层代码都会被运行(Python用缩进来区分代码层次),而当一个.py文件作为模块被导入时,我们可能不希望一部分代码被运行。 if name == 'main’的意思是:当.py文件被直接运行时,if name == 'main’之下的代码块将被运行;当.py文件以模块形式被导入时,if name == 'main’之下的代码块不被运行。

请参考:Python中if name == ‘main’,__init__和self 的解析

with tf.name_scope(‘resize_image’)

tf.name_scope python 中的with用法 with tf.name_scope



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有