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

keras中的loss、optimizer、metrics用法

 更新時(shí)間:2020年06月15日 09:48:38   作者:wyf  
這篇文章主要介紹了keras中的loss、optimizer、metrics用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

用keras搭好模型架構(gòu)之后的下一步,就是執(zhí)行編譯操作。在編譯時(shí),經(jīng)常需要指定三個(gè)參數(shù)

loss

optimizer

metrics

這三個(gè)參數(shù)有兩類選擇:

使用字符串

使用標(biāo)識(shí)符,如keras.losses,keras.optimizers,metrics包下面的函數(shù)

例如:

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
  optimizer=sgd,
  metrics=['accuracy'])

因?yàn)橛袝r(shí)可以使用字符串,有時(shí)可以使用標(biāo)識(shí)符,令人很想知道背后是如何操作的。下面分別針對(duì)optimizer,loss,metrics三種對(duì)象的獲取進(jìn)行研究。

optimizer

一個(gè)模型只能有一個(gè)optimizer,在執(zhí)行編譯的時(shí)候只能指定一個(gè)optimizer。

在keras.optimizers.py中,有一個(gè)get函數(shù),用于根據(jù)用戶傳進(jìn)來(lái)的optimizer參數(shù)獲取優(yōu)化器的實(shí)例:

def get(identifier):
 # 如果后端是tensorflow并且使用的是tensorflow自帶的優(yōu)化器實(shí)例,可以直接使用tensorflow原生的優(yōu)化器 
 if K.backend() == 'tensorflow':
 # Wrap TF optimizer instances
 if isinstance(identifier, tf.train.Optimizer):
  return TFOptimizer(identifier)
 # 如果以json串的形式定義optimizer并進(jìn)行參數(shù)配置
 if isinstance(identifier, dict):
 return deserialize(identifier)
 elif isinstance(identifier, six.string_types):
 # 如果以字符串形式指定optimizer,那么使用優(yōu)化器的默認(rèn)配置參數(shù)
 config = {'class_name': str(identifier), 'config': {}}
 return deserialize(config)
 if isinstance(identifier, Optimizer):
 # 如果使用keras封裝的Optimizer的實(shí)例
 return identifier
 else:
 raise ValueError('Could not interpret optimizer identifier: ' +
    str(identifier))

其中,deserilize(config)函數(shù)的作用就是把optimizer反序列化制造一個(gè)實(shí)例。

loss

keras.losses函數(shù)也有一個(gè)get(identifier)方法。其中需要注意以下一點(diǎn):

如果identifier是可調(diào)用的一個(gè)函數(shù)名,也就是一個(gè)自定義的損失函數(shù),這個(gè)損失函數(shù)返回值是一個(gè)張量。這樣就輕而易舉的實(shí)現(xiàn)了自定義損失函數(shù)。除了使用str和dict類型的identifier,我們也可以直接使用keras.losses包下面的損失函數(shù)。

def get(identifier):
 if identifier is None:
 return None
 if isinstance(identifier, six.string_types):
 identifier = str(identifier)
 return deserialize(identifier)
 if isinstance(identifier, dict):
 return deserialize(identifier)
 elif callable(identifier):
 return identifier
 else:
 raise ValueError('Could not interpret '
    'loss function identifier:', identifier)

metrics

在model.compile()函數(shù)中,optimizer和loss都是單數(shù)形式,只有metrics是復(fù)數(shù)形式。因?yàn)橐粋€(gè)模型只能指明一個(gè)optimizer和loss,卻可以指明多個(gè)metrics。metrics也是三者中處理邏輯最為復(fù)雜的一個(gè)。

在keras最核心的地方keras.engine.train.py中有如下處理metrics的函數(shù)。這個(gè)函數(shù)其實(shí)就做了兩件事:

根據(jù)輸入的metric找到具體的metric對(duì)應(yīng)的函數(shù)

計(jì)算metric張量

在尋找metric對(duì)應(yīng)函數(shù)時(shí),有兩種步驟:

使用字符串形式指明準(zhǔn)確率和交叉熵

使用keras.metrics.py中的函數(shù)

def handle_metrics(metrics, weights=None):
 metric_name_prefix = 'weighted_' if weights is not None else ''

 for metric in metrics:
 # 如果metrics是最常見(jiàn)的那種:accuracy,交叉熵
 if metric in ('accuracy', 'acc', 'crossentropy', 'ce'):
  # custom handling of accuracy/crossentropy
  # (because of class mode duality)
  output_shape = K.int_shape(self.outputs[i])
  # 如果輸出維度是1或者損失函數(shù)是二分類損失函數(shù),那么說(shuō)明是個(gè)二分類問(wèn)題,應(yīng)該使用二分類的accuracy和二分類的的交叉熵
  if (output_shape[-1] == 1 or
  self.loss_functions[i] == losses.binary_crossentropy):
  # case: binary accuracy/crossentropy
  if metric in ('accuracy', 'acc'):
   metric_fn = metrics_module.binary_accuracy
  elif metric in ('crossentropy', 'ce'):
   metric_fn = metrics_module.binary_crossentropy
  # 如果損失函數(shù)是sparse_categorical_crossentropy,那么目標(biāo)y_input就不是one-hot的,所以就需要使用sparse的多類準(zhǔn)去率和sparse的多類交叉熵
  elif self.loss_functions[i] == losses.sparse_categorical_crossentropy:
  # case: categorical accuracy/crossentropy
  # with sparse targets
  if metric in ('accuracy', 'acc'):
   metric_fn = metrics_module.sparse_categorical_accuracy
  elif metric in ('crossentropy', 'ce'):
   metric_fn = metrics_module.sparse_categorical_crossentropy
  else:
  # case: categorical accuracy/crossentropy
  if metric in ('accuracy', 'acc'):
   metric_fn = metrics_module.categorical_accuracy
  elif metric in ('crossentropy', 'ce'):
   metric_fn = metrics_module.categorical_crossentropy
  if metric in ('accuracy', 'acc'):
   suffix = 'acc'
  elif metric in ('crossentropy', 'ce'):
   suffix = 'ce'
  weighted_metric_fn = weighted_masked_objective(metric_fn)
  metric_name = metric_name_prefix + suffix
 else:
  # 如果輸入的metric不是字符串,那么就調(diào)用metrics模塊獲取
  metric_fn = metrics_module.get(metric)
  weighted_metric_fn = weighted_masked_objective(metric_fn)
  # Get metric name as string
  if hasattr(metric_fn, 'name'):
  metric_name = metric_fn.name
  else:
  metric_name = metric_fn.__name__
  metric_name = metric_name_prefix + metric_name

 with K.name_scope(metric_name):
  metric_result = weighted_metric_fn(y_true, y_pred,
      weights=weights,
      mask=masks[i])

 # Append to self.metrics_names, self.metric_tensors,
 # self.stateful_metric_names
 if len(self.output_names) > 1:
  metric_name = self.output_names[i] + '_' + metric_name
 # Dedupe name
 j = 1
 base_metric_name = metric_name
 while metric_name in self.metrics_names:
  metric_name = base_metric_name + '_' + str(j)
  j += 1
 self.metrics_names.append(metric_name)
 self.metrics_tensors.append(metric_result)

 # Keep track of state updates created by
 # stateful metrics (i.e. metrics layers).
 if isinstance(metric_fn, Layer) and metric_fn.stateful:
  self.stateful_metric_names.append(metric_name)
  self.stateful_metric_functions.append(metric_fn)
  self.metrics_updates += metric_fn.updates

無(wú)論怎么使用metric,最終都會(huì)變成metrics包下面的函數(shù)。當(dāng)使用字符串形式指明accuracy和crossentropy時(shí),keras會(huì)非常智能地確定應(yīng)該使用metrics包下面的哪個(gè)函數(shù)。因?yàn)閙etrics包下的那些metric函數(shù)有不同的使用場(chǎng)景,例如:

有的處理的是one-hot形式的y_input(數(shù)據(jù)的類別),有的處理的是非one-hot形式的y_input

有的處理的是二分類問(wèn)題的metric,有的處理的是多分類問(wèn)題的metric

當(dāng)使用字符串“accuracy”和“crossentropy”指明metric時(shí),keras會(huì)根據(jù)損失函數(shù)、輸出層的shape來(lái)確定具體應(yīng)該使用哪個(gè)metric函數(shù)。在任何情況下,直接使用metrics下面的函數(shù)名是總不會(huì)出錯(cuò)的。

keras.metrics.py文件中也有一個(gè)get(identifier)函數(shù)用于獲取metric函數(shù)。

def get(identifier):
 if isinstance(identifier, dict):
 config = {'class_name': str(identifier), 'config': {}}
 return deserialize(config)
 elif isinstance(identifier, six.string_types):
 return deserialize(str(identifier))
 elif callable(identifier):
 return identifier
 else:
 raise ValueError('Could not interpret '
    'metric function identifier:', identifier)

如果identifier是字符串或者字典,那么會(huì)根據(jù)identifier反序列化出一個(gè)metric函數(shù)。

如果identifier本身就是一個(gè)函數(shù)名,那么就直接返回這個(gè)函數(shù)名。這種方式就為自定義metric提供了巨大便利。

keras中的設(shè)計(jì)哲學(xué)堪稱完美。

以上這篇keras中的loss、optimizer、metrics用法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python-tkinter之按鈕的使用,開(kāi)關(guān)方法

    python-tkinter之按鈕的使用,開(kāi)關(guān)方法

    今天小編就為大家分享一篇python-tkinter之按鈕的使用,開(kāi)關(guān)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Python join()函數(shù)原理及使用方法

    Python join()函數(shù)原理及使用方法

    這篇文章主要介紹了Python join()函數(shù)原理及使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 詳解python3 + Scrapy爬蟲(chóng)學(xué)習(xí)之創(chuàng)建項(xiàng)目

    詳解python3 + Scrapy爬蟲(chóng)學(xué)習(xí)之創(chuàng)建項(xiàng)目

    這篇文章主要介紹了python3 Scrapy爬蟲(chóng)創(chuàng)建項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Scrapy中詭異xpath的匹配內(nèi)容失效問(wèn)題及解決

    Scrapy中詭異xpath的匹配內(nèi)容失效問(wèn)題及解決

    這篇文章主要介紹了Scrapy中詭異xpath的匹配內(nèi)容失效問(wèn)題及解決方案,具有很好的價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • python處理中文編碼和判斷編碼示例

    python處理中文編碼和判斷編碼示例

    在開(kāi)發(fā)自用爬蟲(chóng)過(guò)程中,有的網(wǎng)頁(yè)是utf-8,有的是gb2312,有的是gbk,如果不加處理,采集到的都是亂碼,解決的方法是將html處理成統(tǒng)一的utf-8編碼
    2014-02-02
  • 使用Python創(chuàng)建多功能文件管理器的代碼示例

    使用Python創(chuàng)建多功能文件管理器的代碼示例

    在本文中,我們將探索一個(gè)使用Python的wxPython庫(kù)開(kāi)發(fā)的文件管理器應(yīng)用程序,這個(gè)應(yīng)用程序不僅能夠?yàn)g覽和選擇文件,還支持文件預(yù)覽、壓縮、圖片轉(zhuǎn)換以及生成PPT演示文稿的功能,需要的朋友可以參考下
    2024-08-08
  • Python多線程編程(六):可重入鎖RLock

    Python多線程編程(六):可重入鎖RLock

    這篇文章主要介紹了Python多線程編程(六):可重入鎖RLock,本文直接給出使用實(shí)例,然后講解如何使用RLock避免死鎖,需要的朋友可以參考下
    2015-04-04
  • 實(shí)現(xiàn)ECharts雙Y軸左右刻度線一致的例子

    實(shí)現(xiàn)ECharts雙Y軸左右刻度線一致的例子

    這篇文章主要介紹了實(shí)現(xiàn)ECharts雙Y軸左右刻度線一致的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • python 插入Null值數(shù)據(jù)到Postgresql的操作

    python 插入Null值數(shù)據(jù)到Postgresql的操作

    這篇文章主要介紹了python 插入Null值數(shù)據(jù)到Postgresql的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Django中template for如何使用方法

    Django中template for如何使用方法

    這篇文章主要介紹了Django中template for如何使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評(píng)論