Keras

keras中文官方文件

寫在前面

keras是對tensorflow的high-level封裝,之前一直都用pytorch,但是pytorch訓練出來的模型不太好部署應用,最近需要使用keras訓練模型,因此簡單瞭解了一些keras的訓練推斷使用方法。總體而言,keras上手比較簡單,搭建網路圖紙計算也很方便,給的API介面對訓練調參很友好(簡直就是調參器:),本文寫了一部分訓練流程,隨著我學習的深入會不斷更新本教程。

訓練流程

只要安裝了keras-gpu版本,自動呼叫GPU進行訓練,預設只會單卡訓練,

一定要注意,使用pip或keras安裝

conda install keras(-gpu)

,不帶gpu只會裝cpu版本!!

使用

os。environ[“CUDA_VISIBLE_DEVICES”]=“xx”

指定可見顯示卡

tf會申請資源,但是不一定全都是利用的,可以顯式地控制視訊記憶體資源的用量

import tensorflow as tf

from keras。backend。tensorflow_backend import set_session

config= tf。ConfigProto()

config。gpu_options。per_process_gpu_memory_fraction = set_session(tf。Session(config=config))

多卡訓練:

只需要在外層使用multi_gpu_model() wrap一下並返回就OK了,預設會呼叫所有的GPU資源

from keras。utils import multi_gpu_model

multi_train_model = multi_gpu_model(model, gpus=, cpu_relocation=False)#對原來的model外層包一下並返回

該方法的並行方式也是將模型copy到多個GPU上面,訓練時將batch_size平均分配到多個GPU上面,最後再reduce到CPU或者GPU上處理後更新多個GPU的權重引數 注意:如果batch_size=1,原則上是無法進行多卡並行的,但是keras會在可見GPUs上面開闢空間,但是隻會在一張卡上訓練,因此會看到只有一張卡的utils在活動,其餘卡只會佔用視訊記憶體而不具體工作

呼叫的keras庫

from keras import Input, Model#搭建模型輸入庫,模型庫

from keras。applications。vgg16/resnet50 import VGG16/ResNet50#網路模型庫

from keras。layers import Concatenate, Conv2D, upSampling2D, BatchNormalization#網路層

from keras。utils import multi_gpu_model#多GPU訓練

from keras。optimizers import Adam, SGD#最佳化器

from keras。callbacks import EarlyStopping, ModelCheckpoint, TensorBoard#訓練時後端callbacks

import tensorflow as tf

建立自己的模型

from keras import Input, Model

from keras。applications。vgg import VGG16

class Network:

def __init__(self, *argv, **kwargs):

self。_input = Input(name‘,#定義一個Input的例項

shape=(),

dtype=’float‘)

vgg = VGG16(input_tensor=self。input_img#送入輸入的input_tensor

weights=’imagenet‘,

dtype=’float32‘)

def build_graph(self):

Conv2D(**kwargs)(vgg)。。。#此處定義自己的網路層

return Model(inputs=self。_input, outputs=)#

net_instance = Network(。。。)

model = net_instance。build_graph()

編譯網路

在該過程中需要指定loss函式和最佳化器,compile完成後相當於固定網路的計算圖紙

model。compile(loss=, optimizer=)

列印網路資訊

model。summary()#列印網路資訊,包括網路層數,中間層尺寸變化,以及引數量等資訊

訓練網路

generator=送入需要訓練的資料,需要自己定義資料生成的方法

model。fit_generator(generator=data_gen_func(),

steps_per_epoch=,#每個epoch迭代多少次,注意 step * batchsize = total_nums

epochs=,#共訓練多少個Epoch

validation_data=,

verbose=,

initial_epoch=,#開始訓練的epoch

callbacks= [ModelCheckpoint(filepath=,#儲存檔案路徑,str最後預留剩餘%s可以在命名時儲存訓練的一些loss

save_best_only=,#之儲存

verbose=),

TensorBoard(log_dir=,

histogram_freq=0,

write_graph=True,

writer_images=False)])

model。save(filepath=)#儲存網路物件

model。save_weights(filepath=)#只儲存網路權重

介紹:

callbacks: 訓練時後臺的一些呼叫服務,常用的有ModelCheckpoint和TensorBoard。。

網路推斷模式/預測

Model。predict(x)#x為輸入測試資料

pred = model。predict(x, batch_size=None, steps=None)

x:輸入資料,Numpy array

輸出即為網路output