CPU深度学习训练速度过慢+keras深度学习训练常见函数解释 | 您所在的位置:网站首页 › python提高cpu利用率 › CPU深度学习训练速度过慢+keras深度学习训练常见函数解释 |
2020/5/2-5/5 记录
cpu训练速度慢的可能原因
请参考 深度学习训练速度的提高的一些浅见(1)gpu,cpu,硬盘等硬件 1.【线程】 pytorch以及tensorflow的多线程输入设定过大,一般推荐较大数据流4线程,较小2线程。具体问题具体分析,要看数据输入是否是训练速度优化的瓶颈。 numpy或者opencv等的多线程操作或者tensorflow以及pytorch在cpu运行上的op。这些模块使用OMP或者MKL进行多线程加速,一般默认为cpu线程总数的一半,十分浪费计算力,推荐使用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 实验室设备网 版权所有 |