Unet项目解析(7): 模型编译-优化函数、损失函数、指标列表
項目GitHub主頁:https://github.com/orobix/retina-unet
參考論文:Retina blood vessel segmentation with a convolution neural network (U-net)
1. 模型編譯
model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])在訓練模型之前,需要通過compile來對學習過程進行配置。compile接收三個參數:
- 優化器optimizer:指定為已預定義的優化器名,如rmsprop、adagrad,或一個Optimizer類的對象
- 損失函數loss:最小化的目標函數,為預定義的損失函數名,如categorical_crossentropy、mse,也可以為一個損失函數
- 指標列表metrics:對分類問題,一般設置為metrics=['accuracy']。指標可以是一個預定義指標的名字,也可以是一個用戶定制的函數.指標函數應該返回單個張量,或一個完成metric_name - > metric_value映射的字典.
2. 優化器optimizer
優化器是編譯Keras模型必要的兩個參數之一。
調用方法:
# 調用model.compile()之前初始化一個優化器對象,然后傳入該函數: sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='mean_squared_error', optimizer=sgd)#在調用model.compile()時傳遞一個預定義優化器名 model.compile(loss='mean_squared_error', optimizer='sgd')經常使用的優化器:
1. SGD:隨機梯度下降法,支持動量參數,支持學習衰減率,支持Nesterov動量
keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False) # lr:大或等于0的浮點數,學習率 # momentum:大或等于0的浮點數,動量參數 # decay:大或等于0的浮點數,每次更新后的學習率衰減值 # nesterov:布爾值,確定是否使用Nesterov動量2.?RMSprop:該優化器通常是面對遞歸神經網絡時的一個良好選擇,除學習率可調整外,建議保持優化器的其他默認參數不變
keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06) # lr:大或等于0的浮點數,學習率 # rho:大或等于0的浮點數 # epsilon:大或等于0的小浮點數,防止除0錯誤3. Adagrad:建議保持優化器的默認參數不變 keras.optimizers.Adagrad(lr=0.01, epsilon=1e-06) # lr:大或等于0的浮點數,學習率 # epsilon:大或等于0的小浮點數,防止除0錯誤4.?Adadelta:建議保持優化器的默認參數不變
keras.optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=1e-06) # lr:大或等于0的浮點數,學習率 # rho:大或等于0的浮點數 # epsilon:大或等于0的小浮點數,防止除0錯誤5.?Adam: keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08) # lr:大或等于0的浮點數,學習率 # beta_1/beta_2:浮點數, 0<beta<1,通常很接近1 # epsilon:大或等于0的小浮點數,防止除0錯誤6.?Nadam:Nesterov Adam optimizer: Adam本質上像是帶有動量項的RMSprop,Nadam就是帶有Nesterov 動量的Adam RMSprop
keras.optimizers.Nadam(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=1e-08, schedule_decay=0.004) # lr:大或等于0的浮點數,學習率 # beta_1/beta_2:浮點數, 0<beta<1,通常很接近1 # epsilon:大或等于0的小浮點數,防止除0錯誤3. 損失函數loss
目標函數,或稱損失函數,是編譯一個模型必須的兩個參數之一。
可以通過傳遞預定義目標函數名字指定目標函數,也可以傳遞一個Theano/TensroFlow的符號函數作為目標函數,該函數對每個數據點應該只返回一個標量值,并以下列兩個參數為參數:
- y_true:真實的數據標簽,Theano/TensorFlow張量
- y_pred:預測值,與y_true相同shape的Theano/TensorFlow張量
3.1 封裝好的目標函數
mean_squared_error或mse;mean_absolute_error或mae;mean_absolute_percentage_error或mape;mean_squared_logarithmic_error或msle;squared_hinge;hinge;categorical_hinge;binary_crossentropy(亦稱作對數損失,logloss);logcosh;categorical_crossentropy:亦稱作多類的對數損失,注意使用該目標函數時,需要將標簽轉化為形如(nb_samples, nb_classes)的二值序列。sparse_categorical_crossentrop:同上,但接受稀疏標簽。注意,使用該函數時仍然需要標簽與輸出值的維度相同,可能需要在標簽數據上增加一個維度:np.expand_dims(y,-1);kullback_leibler_divergence:從預測值概率分布Q到真值概率分布P的信息增益,用以度量兩個分布的差異;poisson:即(predictions - targets * log(predictions))的均值;cosine_proximity:即預測值與真實標簽的余弦距離平均值的相反數
具體的實現,可以參考Coffee的博文。
3.2 自定義的目標函數
from keras import backend as Kdef my_loss(y_true,y_pred):return K.mean((y_pred-y_true),axis = -1) model.compile(loss=my_loss,optimizer='SGD',metrics=['accuracy'])4. 性能評估函數
性能評估模塊提供了一系列用于模型性能評估的函數,這些函數在模型編譯時由metrics關鍵字設置。
性能評估函數類似與目標函數, 只不過該性能的評估結果講不會用于訓練.
4.1 預定義評估函數
binary_accuracy: 對二分類問題,計算在所有預測值上的平均正確率 categorical_accuracy:對多分類問題,計算再所有預測值上的平均正確率 sparse_categorical_accuracy:與categorical_accuracy相同,在對稀疏的目標值預測時有用 top_k_categorical_accracy: 計算top-k正確率,當預測值的前k個值中存在目標類別即認為預測正確 sparse_top_k_categorical_accuracy:與top_k_categorical_accracy作用相同,但適用于稀疏情況4.2 自定義評估函數
定制的評估函數可以在模型編譯時傳入,該函數應該以(y_true, y_pred)為參數。
總結
以上是生活随笔為你收集整理的Unet项目解析(7): 模型编译-优化函数、损失函数、指标列表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是巴氏消毒?
- 下一篇: Win2000/XP服务与后门技术