欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

keras 自定義loss損失函數(shù),sample在loss上的加權(quán)和metric詳解

 更新時(shí)間:2020年05月23日 14:17:50   作者:小佳AI  
這篇文章主要介紹了keras 自定義loss損失函數(shù),sample在loss上的加權(quán)和metric詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

首先辨析一下概念:

1. loss是整體網(wǎng)絡(luò)進(jìn)行優(yōu)化的目標(biāo), 是需要參與到優(yōu)化運(yùn)算,更新權(quán)值W的過程的

2. metric只是作為評價(jià)網(wǎng)絡(luò)表現(xiàn)的一種“指標(biāo)”, 比如accuracy,是為了直觀地了解算法的效果,充當(dāng)view的作用,并不參與到優(yōu)化過程

在keras中實(shí)現(xiàn)自定義loss, 可以有兩種方式,一種自定義 loss function,

例如:

# 方式一
def vae_loss(x, x_decoded_mean):
 xent_loss = objectives.binary_crossentropy(x, x_decoded_mean)
 kl_loss = - 0.5 * K.mean(1 + z_log_sigma - K.square(z_mean) - K.exp(z_log_sigma), axis=-1)
 return xent_loss + kl_loss
 
vae.compile(optimizer='rmsprop', loss=vae_loss)

或者通過自定義一個(gè)keras的層(layer)來達(dá)到目的, 作為model的最后一層,最后令model.compile中的loss=None:

# 方式二
# Custom loss layer
class CustomVariationalLayer(Layer):
 def __init__(self, **kwargs):
  self.is_placeholder = True
  super(CustomVariationalLayer, self).__init__(**kwargs)
 
 def vae_loss(self, x, x_decoded_mean_squash):
  x = K.flatten(x)
  x_decoded_mean_squash = K.flatten(x_decoded_mean_squash)
  xent_loss = img_rows * img_cols * metrics.binary_crossentropy(x, x_decoded_mean_squash)
  kl_loss = - 0.5 * K.mean(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)
  return K.mean(xent_loss + kl_loss)
 
 def call(self, inputs):
  x = inputs[0]
  x_decoded_mean_squash = inputs[1]
  loss = self.vae_loss(x, x_decoded_mean_squash)
  self.add_loss(loss, inputs=inputs)
  # We don't use this output.
  return x
 
y = CustomVariationalLayer()([x, x_decoded_mean_squash])
vae = Model(x, y)
vae.compile(optimizer='rmsprop', loss=None)

在keras中自定義metric非常簡單,需要用y_pred和y_true作為自定義metric函數(shù)的輸入?yún)?shù) 點(diǎn)擊查看metric的設(shè)置

注意事項(xiàng):

1. keras中定義loss,返回的是batch_size長度的tensor, 而不是像tensorflow中那樣是一個(gè)scalar

2. 為了能夠?qū)⒆远x的loss保存到model, 以及可以之后能夠順利load model, 需要把自定義的loss拷貝到keras.losses.py 源代碼文件下,否則運(yùn)行時(shí)找不到相關(guān)信息,keras會報(bào)錯(cuò)

有時(shí)需要不同的sample的loss施加不同的權(quán)重,這時(shí)需要用到sample_weight,例如

  # Class weights:
  # To balance the difference in occurences of digit class labels. 
  # 50% of labels that the discriminator trains on are 'fake'.
  # Weight = 1 / frequency
  cw1 = {0: 1, 1: 1}
  cw2 = {i: self.num_classes / half_batch for i in range(self.num_classes)}
  cw2[self.num_classes] = 1 / half_batch
  class_weights = [cw1, cw2] # 使得兩種loss能夠一樣重要

discriminator.train_on_batch(imgs, [valid, labels], class_weight=class_weights)

補(bǔ)充知識:keras模型訓(xùn)練與保存的call_back的設(shè)置

1、模型訓(xùn)練

fit(x=None, 
y=None, 
batch_size=None, 
epochs=1, 
verbose=1, 
callbacks=None, 
validation_split=0.0, 
validation_data=None, 
shuffle=True, 
class_weight=None, 
sample_weight=None, 
initial_epoch=0, 
steps_per_epoch=None, 
validation_steps=None)

參數(shù):

x: 訓(xùn)練數(shù)據(jù)的 Numpy 數(shù)組(如果模型只有一個(gè)輸入), 或者是 Numpy 數(shù)組的列表(如果模型有多個(gè)輸入)。 如果模型中的輸入層被命名,你也可以傳遞一個(gè)字典,將輸入層名稱映射到 Numpy 數(shù)組。 如果從本地框架張量饋送(例如 TensorFlow 數(shù)據(jù)張量)數(shù)據(jù),x 可以是 None(默認(rèn))。

y: 目標(biāo)(標(biāo)簽)數(shù)據(jù)的 Numpy 數(shù)組(如果模型只有一個(gè)輸出), 或者是 Numpy 數(shù)組的列表(如果模型有多個(gè)輸出)。 如果模型中的輸出層被命名,你也可以傳遞一個(gè)字典,將輸出層名稱映射到 Numpy 數(shù)組。 如果從本地框架張量饋送(例如 TensorFlow 數(shù)據(jù)張量)數(shù)據(jù),y 可以是 None(默認(rèn))。

batch_size: 整數(shù)或 None。每次梯度更新的樣本數(shù)。如果未指定,默認(rèn)為 32。

epochs: 整數(shù)。訓(xùn)練模型迭代輪次。一個(gè)輪次是在整個(gè) x 和 y 上的一輪迭代。 請注意,與 initial_epoch 一起,epochs 被理解為 「最終輪次」。模型并不是訓(xùn)練了 epochs 輪,而是到第 epochs 輪停止訓(xùn)練。

verbose: 0, 1 或 2。日志顯示模式。 0 = 安靜模式, 1 = 進(jìn)度條, 2 = 每輪一行。

callbacks: 一系列的 keras.callbacks.Callback 實(shí)例。一系列可以在訓(xùn)練時(shí)使用的回調(diào)函數(shù)。

validation_split: 0 和 1 之間的浮點(diǎn)數(shù)。用作驗(yàn)證集的訓(xùn)練數(shù)據(jù)的比例。 模型將分出一部分不會被訓(xùn)練的驗(yàn)證數(shù)據(jù),并將在每一輪結(jié)束時(shí)評估這些驗(yàn)證數(shù)據(jù)的誤差和任何其他模型指標(biāo)。 驗(yàn)證數(shù)據(jù)是混洗之前 x 和y 數(shù)據(jù)的最后一部分樣本中。

validation_data: 元組 (x_val,y_val) 或元組 (x_val,y_val,val_sample_weights), 用來評估損失,以及在每輪結(jié)束時(shí)的任何模型度量指標(biāo)。 模型將不會在這個(gè)數(shù)據(jù)上進(jìn)行訓(xùn)練。這個(gè)參數(shù)會覆蓋 validation_split。

shuffle: 布爾值(是否在每輪迭代之前混洗數(shù)據(jù))或者 字符串 (batch)。 batch 是處理 HDF5 數(shù)據(jù)限制的特殊選項(xiàng),它對一個(gè) batch 內(nèi)部的數(shù)據(jù)進(jìn)行混洗。 當(dāng) steps_per_epoch 非 None 時(shí),這個(gè)參數(shù)無效。

class_weight: 可選的字典,用來映射類索引(整數(shù))到權(quán)重(浮點(diǎn))值,用于加權(quán)損失函數(shù)(僅在訓(xùn)練期間)。 這可能有助于告訴模型 「更多關(guān)注」來自代表性不足的類的樣本。

sample_weight: 訓(xùn)練樣本的可選 Numpy 權(quán)重?cái)?shù)組,用于對損失函數(shù)進(jìn)行加權(quán)(僅在訓(xùn)練期間)。 您可以傳遞與輸入樣本長度相同的平坦(1D)Numpy 數(shù)組(權(quán)重和樣本之間的 1:1 映射), 或者在時(shí)序數(shù)據(jù)的情況下,可以傳遞尺寸為 (samples, sequence_length) 的 2D 數(shù)組,以對每個(gè)樣本的每個(gè)時(shí)間步施加不同的權(quán)重。 在這種情況下,你應(yīng)該確保在 compile() 中指定 sample_weight_mode="temporal"。

initial_epoch: 整數(shù)。開始訓(xùn)練的輪次(有助于恢復(fù)之前的訓(xùn)練)。

steps_per_epoch: 整數(shù)或 None。 在聲明一個(gè)輪次完成并開始下一個(gè)輪次之前的總步數(shù)(樣品批次)。 使用 TensorFlow 數(shù)據(jù)張量等輸入張量進(jìn)行訓(xùn)練時(shí),默認(rèn)值 None 等于數(shù)據(jù)集中樣本的數(shù)量除以 batch 的大小,如果無法確定,則為 1。

validation_steps: 只有在指定了 steps_per_epoch 時(shí)才有用。停止前要驗(yàn)證的總步數(shù)(批次樣本)

fit_generator(generator, 
steps_per_epoch=None, 
epochs=1, 
verbose=1, 
callbacks=None, 
validation_data=None, 
validation_steps=None, 
class_weight=None, 
max_queue_size=10, 
workers=1, 
use_multiprocessing=False, 
shuffle=True, 
initial_epoch=0)

使用 Python 生成器(或 Sequence 實(shí)例)逐批生成的數(shù)據(jù),按批次訓(xùn)練模型

參數(shù)

generator: 一個(gè)生成器,或者一個(gè) Sequence (keras.utils.Sequence) 對象的實(shí)例, 以在使用多進(jìn)程時(shí)避免數(shù)據(jù)的重復(fù)。 生成器的輸出應(yīng)該為以下之一:

一個(gè) (inputs, targets) 元組

一個(gè) (inputs, targets, sample_weights) 元組。

這個(gè)元組(生成器的單個(gè)輸出)組成了單個(gè)的 batch。 因此,這個(gè)元組中的所有數(shù)組長度必須相同(與這一個(gè) batch 的大小相等)。 不同的 batch 可能大小不同。 例如,一個(gè) epoch 的最后一個(gè) batch 往往比其他 batch 要小, 如果數(shù)據(jù)集的尺寸不能被 batch size 整除。 生成器將無限地在數(shù)據(jù)集上循環(huán)。當(dāng)運(yùn)行到第 steps_per_epoch 時(shí),記一個(gè) epoch 結(jié)束。

steps_per_epoch: 在聲明一個(gè) epoch 完成并開始下一個(gè) epoch 之前從 generator 產(chǎn)生的總步數(shù)(批次樣本)。 它通常應(yīng)該等于你的數(shù)據(jù)集的樣本數(shù)量除以批量大小。 對于 Sequence,它是可選的:如果未指定,將使用len(generator) 作為步數(shù)。

epochs: 整數(shù)。訓(xùn)練模型的迭代總輪數(shù)。一個(gè) epoch 是對所提供的整個(gè)數(shù)據(jù)的一輪迭代,如 steps_per_epoch 所定義。注意,與 initial_epoch 一起使用,epoch 應(yīng)被理解為「最后一輪」。模型沒有經(jīng)歷由 epochs 給出的多次迭代的訓(xùn)練,而僅僅是直到達(dá)到索引 epoch 的輪次。

verbose: 0, 1 或 2。日志顯示模式。 0 = 安靜模式, 1 = 進(jìn)度條, 2 = 每輪一行。

callbacks: keras.callbacks.Callback 實(shí)例的列表。在訓(xùn)練時(shí)調(diào)用的一系列回調(diào)函數(shù)。

validation_data: 它可以是以下之一:

驗(yàn)證數(shù)據(jù)的生成器或 Sequence 實(shí)例

一個(gè) (inputs, targets) 元組

一個(gè) (inputs, targets, sample_weights) 元組。

在每個(gè) epoch 結(jié)束時(shí)評估損失和任何模型指標(biāo)。該模型不會對此數(shù)據(jù)進(jìn)行訓(xùn)練。

validation_steps: 僅當(dāng) validation_data 是一個(gè)生成器時(shí)才可用。 在停止前 generator 生成的總步數(shù)(樣本批數(shù))。 對于 Sequence,它是可選的:如果未指定,將使用 len(generator) 作為步數(shù)。

class_weight: 可選的將類索引(整數(shù))映射到權(quán)重(浮點(diǎn))值的字典,用于加權(quán)損失函數(shù)(僅在訓(xùn)練期間)。 這可以用來告訴模型「更多地關(guān)注」來自代表性不足的類的樣本。

max_queue_size: 整數(shù)。生成器隊(duì)列的最大尺寸。 如未指定,max_queue_size 將默認(rèn)為 10。

workers: 整數(shù)。使用的最大進(jìn)程數(shù)量,如果使用基于進(jìn)程的多線程。 如未指定,workers 將默認(rèn)為 1。如果為 0,將在主線程上執(zhí)行生成器。

use_multiprocessing: 布爾值。如果 True,則使用基于進(jìn)程的多線程。 如未指定, use_multiprocessing 將默認(rèn)為 False。 請注意,由于此實(shí)現(xiàn)依賴于多進(jìn)程,所以不應(yīng)將不可傳遞的參數(shù)傳遞給生成器,因?yàn)樗鼈儾荒鼙惠p易地傳遞給子進(jìn)程。

shuffle: 是否在每輪迭代之前打亂 batch 的順序。 只能與 Sequence (keras.utils.Sequence) 實(shí)例同用。

initial_epoch: 開始訓(xùn)練的輪次(有助于恢復(fù)之前的訓(xùn)練)

fit與fit_generator函數(shù)都返回一個(gè)History的對象,其History.history屬性記錄了損失函數(shù)和其他指標(biāo)的數(shù)值隨epoch變化的情況,如果有驗(yàn)證集的話,也包含了驗(yàn)證集的這些指標(biāo)變化情況,可以寫入文本后續(xù)查看

2、保存模型結(jié)構(gòu)、訓(xùn)練出來的權(quán)重、及優(yōu)化器狀態(tài)

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

在每個(gè)訓(xùn)練期之后保存模型

參數(shù):

filepath: 字符串,保存模型的路徑。如 epoch1.h5 或者 epoch1.weight(save_weights_only=True)

monitor: 被監(jiān)測的數(shù)據(jù)。

verbose: 詳細(xì)信息模式,0 或者 1 。

save_best_only: 如果 save_best_only=True, 被監(jiān)測數(shù)據(jù)的最佳模型就不會被覆蓋。

mode: {auto, min, max} 的其中之一。 如果 save_best_only=True,那么是否覆蓋保存文件的決定就取決于被監(jiān)測數(shù)據(jù)的最大或者最小值。 對于 val_acc,模式就會是 max,而對于 val_loss,模式就需要是 min,等等。 在 auto 模式中,方向會自動從被監(jiān)測的數(shù)據(jù)的名字中判斷出來。

save_weights_only: 如果 True,那么只有模型的權(quán)重會被保存 (model.save_weights(filepath)), 否則的話,整個(gè)模型會被保存 (model.save(filepath))。

period: 每個(gè)檢查點(diǎn)之間的間隔(訓(xùn)練輪數(shù))

例子:

checkpoint = ModelCheckpoint(filepath=model_weight_filepath, monitor='val_acc',
         verbose=0, save_best_only=True, save_weights_only=True, mode='max', period=1)
model.fit(X_train, Y_train, callbacks=[checkpoint])

3、當(dāng)驗(yàn)證損失不再繼續(xù)降低時(shí),如何中斷訓(xùn)練?當(dāng)監(jiān)測值不再改善時(shí)中止訓(xùn)練

EarlyStopping回調(diào)函數(shù):

keras.callbacks.EarlyStopping(
monitor='val_loss', 
min_delta=0, 
patience=0, 
verbose=0, 
mode='auto',
baseline=None, 
restore_best_weights=False)

當(dāng)被監(jiān)測的數(shù)量不再提升,則停止訓(xùn)練

參數(shù):

monitor: 被監(jiān)測的數(shù)據(jù)。

min_delta: 在被監(jiān)測的數(shù)據(jù)中被認(rèn)為是提升的最小變化, 例如,小于 min_delta 的絕對變化會被認(rèn)為沒有提升。

patience: 沒有進(jìn)步的訓(xùn)練輪數(shù),在這之后訓(xùn)練就會被停止。

verbose: 詳細(xì)信息模式,0或1。

mode: {auto, min, max} 其中之一。 在 min 模式中, 當(dāng)被監(jiān)測的數(shù)據(jù)停止下降,訓(xùn)練就會停止;在 max 模式中,當(dāng)被監(jiān)測的數(shù)據(jù)停止上升,訓(xùn)練就會停止;在 auto 模式中,方向會自動從被監(jiān)測的數(shù)據(jù)的名字中判斷出來。

baseline: 要監(jiān)控的數(shù)量的基準(zhǔn)值。 如果模型沒有顯示基準(zhǔn)的改善,訓(xùn)練將停止。

restore_best_weights: 是否從具有監(jiān)測數(shù)量的最佳值的時(shí)期恢復(fù)模型權(quán)重。 如果為 False,則使用在訓(xùn)練的最后一步獲得的模型權(quán)重。

例子:

earlystopping = EarlyStopping(monitor='val_acc', verbose=1, patience=3)

model.fit(X_train, Y_train, callbacks=[earlystopping])

4、學(xué)習(xí)率動態(tài)調(diào)整

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

當(dāng)標(biāo)準(zhǔn)評估停止提升時(shí),降低學(xué)習(xí)速率。

當(dāng)學(xué)習(xí)停止時(shí),模型總是會受益于降低 2-10 倍的學(xué)習(xí)速率。 這個(gè)回調(diào)函數(shù)監(jiān)測一個(gè)數(shù)據(jù)并且當(dāng)這個(gè)數(shù)據(jù)在一定「有耐心」的訓(xùn)練輪之后還沒有進(jìn)步, 那么學(xué)習(xí)速率就會被降低。

參數(shù)

monitor: 被監(jiān)測的數(shù)據(jù)。

factor: 學(xué)習(xí)速率被降低的因數(shù)。新的學(xué)習(xí)速率 = 學(xué)習(xí)速率 * 因數(shù)

patience: 沒有進(jìn)步的訓(xùn)練輪數(shù),在這之后訓(xùn)練速率會被降低。

verbose: 整數(shù)。0:安靜,1:更新信息。

mode: {auto, min, max} 其中之一。如果是 min 模式,學(xué)習(xí)速率會被降低如果被監(jiān)測的數(shù)據(jù)已經(jīng)停止下降; 在 max 模式,學(xué)習(xí)塑料會被降低如果被監(jiān)測的數(shù)據(jù)已經(jīng)停止上升; 在 auto 模式,方向會被從被監(jiān)測的數(shù)據(jù)中自動推斷出來。

min_delta: 對于測量新的最優(yōu)化的閥值,只關(guān)注巨大的改變。

cooldown: 在學(xué)習(xí)速率被降低之后,重新恢復(fù)正常操作之前等待的訓(xùn)練輪數(shù)量。

min_lr: 學(xué)習(xí)速率的下邊界。

例子:

reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2,
        patience=5, min_lr=0.001)
model.fit(X_train, Y_train, callbacks=[reduce_lr])

4、Tensorboard可視化

keras.callbacks.TensorBoard(
log_dir='./logs', 
histogram_freq=0, 
batch_size=32, 
write_graph=True, 
write_grads=False, 
write_images=False, 
embeddings_freq=0, 
embeddings_layer_names=None, 
embeddings_metadata=None, 
embeddings_data=None, 
update_freq='epoch')

回調(diào)函數(shù)為 Tensorboard 編寫一個(gè)日志, 這樣你可以可視化測試和訓(xùn)練的標(biāo)準(zhǔn)評估的動態(tài)圖像, 也可以可視化模型中不同層的激活值直方圖。

如果你已經(jīng)使用 pip 安裝了 Tensorflow,你應(yīng)該可以從命令行啟動 Tensorflow:

tensorboard --logdir=/full_path_to_your_logs

參數(shù):

log_dir: 用來保存被 TensorBoard 分析的日志文件的文件名。

histogram_freq: 對于模型中各個(gè)層計(jì)算激活值和模型權(quán)重直方圖的頻率(訓(xùn)練輪數(shù)中)。 如果設(shè)置成 0 ,直方圖不會被計(jì)算。對于直方圖可視化的驗(yàn)證數(shù)據(jù)(或分離數(shù)據(jù))一定要明確的指出。

write_graph: 是否在 TensorBoard 中可視化圖像。 如果 write_graph 被設(shè)置為 True,日志文件會變得非常大。

write_grads: 是否在 TensorBoard 中可視化梯度值直方圖。 histogram_freq 必須要大于 0 。

batch_size: 用以直方圖計(jì)算的傳入神經(jīng)元網(wǎng)絡(luò)輸入批的大小。

write_images: 是否在 TensorBoard 中將模型權(quán)重以圖片可視化。

embeddings_freq: 被選中的嵌入層會被保存的頻率(在訓(xùn)練輪中)。

embeddings_layer_names: 一個(gè)列表,會被監(jiān)測層的名字。 如果是 None 或空列表,那么所有的嵌入層都會被監(jiān)測。

embeddings_metadata: 一個(gè)字典,對應(yīng)層的名字到保存有這個(gè)嵌入層元數(shù)據(jù)文件的名字。 查看 詳情 關(guān)于元數(shù)據(jù)的數(shù)據(jù)格式。 以防同樣的元數(shù)據(jù)被用于所用的嵌入層,字符串可以被傳入。

embeddings_data: 要嵌入在 embeddings_layer_names 指定的層的數(shù)據(jù)。 Numpy 數(shù)組(如果模型有單個(gè)輸入)或 Numpy 數(shù)組列表(如果模型有多個(gè)輸入)。 Learn ore about embeddings。

update_freq: 'batch' 或 'epoch' 或 整數(shù)。當(dāng)使用 'batch' 時(shí),在每個(gè) batch 之后將損失和評估值寫入到 TensorBoard 中。同樣的情況應(yīng)用到 'epoch' 中。如果使用整數(shù),例如 10000,這個(gè)回調(diào)會在每 10000 個(gè)樣本之后將損失和評估值寫入到 TensorBoard 中。注意,頻繁地寫入到 TensorBoard 會減緩你的訓(xùn)練。

5、如何記錄每一次epoch的訓(xùn)練/驗(yàn)證損失/準(zhǔn)確度?

Model.fit函數(shù)會返回一個(gè) History 回調(diào),該回調(diào)有一個(gè)屬性history包含一個(gè)封裝有連續(xù)損失/準(zhǔn)確的lists。

代碼如下:

hist = model.fit(X, y,validation_split=0.2)

print(hist.history)

Keras輸出的loss,val這些值如何保存到文本中去

Keras中的fit函數(shù)會返回一個(gè)History對象,它的History.history屬性會把之前的那些值全保存在里面,如果有驗(yàn)證集的話,也包含了驗(yàn)證集的這些指標(biāo)變化情況,具體寫法:

hist=model.fit(train_set_x,train_set_y,batch_size=256,shuffle=True,nb_epoch=nb_epoch,validation_split=0.1)
with open('log_sgd_big_32.txt','w') as f:
 f.write(str(hist.history))

6、多個(gè)回調(diào)函數(shù)用逗號隔開

例如:

model_weight_filepath = "./bert_classfition-test_model" + str(i) + ".weight"
earlystopping = EarlyStopping(monitor='val_acc', verbose=1, patience=3)
reducelronplateau = ReduceLROnPlateau(monitor="val_acc", verbose=1, mode='max', factor=0.5, patience=2)
checkpoint = ModelCheckpoint(filepath=model_weight_filepath, monitor='val_acc',
        verbose=0, save_best_only=True, save_weights_only=True, mode='max', period=1)
model.fit_generator(
 train_D.__iter__(),
 steps_per_epoch=len(train_D),
 epochs=epochs,
 validation_data=valid_D.__iter__(),
 validation_steps=len(valid_D),
 callbacks=[earlystopping, reducelronplateau, checkpoint])

以上這篇keras 自定義loss損失函數(shù),sample在loss上的加權(quán)和metric詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論