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