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

解決Keras的自定義lambda層去reshape張量時model保存出錯問題

 更新時間:2020年07月01日 14:53:57   作者:馮爽朗  
這篇文章主要介紹了解決Keras的自定義lambda層去reshape張量時model保存出錯問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

前幾天忙著參加一個AI Challenger比賽,一直沒有更新博客,忙了將近一個月的時間,也沒有取得很好的成績,不過這這段時間內(nèi)的確學(xué)到了很多,就在決賽結(jié)束的前一天晚上,準備復(fù)現(xiàn)使用一個新的網(wǎng)絡(luò)UPerNet的時候出現(xiàn)了一個很匪夷所思,莫名其妙的一個問題。谷歌很久都沒有解決,最后在一個日語網(wǎng)站上看到了解決方法。

事后想想,這個問題在后面搭建網(wǎng)絡(luò)的時候會很常見,但是網(wǎng)上卻沒有人提出解決辦法,So, I think that's very necessary for me to note this.

背景

分割網(wǎng)絡(luò)在進行上采樣的時候我用的是雙線性插值上采樣的,而Keras里面并沒有實現(xiàn)雙線性插值的函數(shù),所以要自己調(diào)用tensorflow里面的tf.image.resize_bilinear()函數(shù)來進行resize,如果直接用tf.image.resize_bilinear()函數(shù)對Keras張量進行resize的話,會報出異常,大概意思是tenorflow張量不能轉(zhuǎn)換為Keras張量,要想將Kears Tensor轉(zhuǎn)換為 Tensorflow Tensor需要進行自定義層,Keras自定義層的時候需要用到Lambda層來包裝。

大概源碼(只是大概意思)如下:

from keras.layers import Lambda
import tensorflow as tf
 
first_layer=Input(batch_shape=(None, 64, 32, 3))
f=Conv2D(filters, 3, activation = None, padding = 'same', kernel_initializer = 'glorot_normal',name='last_conv_3')(x)
upsample_bilinear = Lambda(lambda x: tf.image.resize_bilinear(x,size=first_layer.get_shape().as_list()[1:3]))
f=upsample_bilinear(f)

然后編譯 這個源碼:

optimizer = SGD(lr=0.01, momentum=0.9)
model.compile(optimizer = optimizer, loss = model_dice, metrics = ['accuracy'])
model.save('model.hdf5')

其中要注意到這個tf.image.resize_bilinear()里面的size,我用的是根據(jù)張量(first_layer)的形狀來做為reshape后的形狀,保存模型用的是model.save().然后就會出現(xiàn)以下錯誤!

異常描述:

在一個epoch完成后保存model時出現(xiàn)下面錯誤,五個錯誤提示隨機出現(xiàn):

TypeError: cannot serialize ‘_io.TextIOWrapper' object

TypeError: object.new(PyCapsule) is not safe, use PyCapsule.new()

AttributeError: ‘NoneType' object has no attribute ‘update'

TypeError: cannot deepcopy this pattern object

TypeError: can't pickle module objects

問題分析:

這個有兩方面原因:

tf.image.resize_bilinear()中的size不應(yīng)該用另一個張量的size去指定。

如果用了另一個張量去指定size,用model.save()來保存model是不能序列化的。那么保存model的時候只能保存權(quán)重——model.save_weights('mode_weights.hdf5')

解決辦法(兩種):

1.tf.image.resize_bilinear()的size用常數(shù)去指定

upsample_bilinear = Lambda(lambda x: tf.image.resize_bilinear(x,size=[64,32]))

2.如果用了另一個張量去指定size,那么就修改保存模型的函數(shù),變成只保存權(quán)重

model.save_weights('model_weights.hdf5')

總結(jié):

​​​​我想使用keras的Lambda層去reshape一個張量

如果為重塑形狀指定了張量,則保存模型(保存)將失敗

您可以使用save_weights而不是save進行保存

補充知識:Keras 添加一個自定義的loss層(output及compile中,輸出及l(fā)oss的表示方法)

例如:

計算兩個層之間的距離,作為一個loss

distance=keras.layers.Lambda(lambda x: tf.norm(x, axis=0))(keras.layers.Subtract(Dense1-Dense2))

這是添加的一個loss層,這個distance就直接作為loss

model=Model(input=[,,,], output=[distance])

model.compile(....., loss=lambda y_true, y_pred: ypred)

以上這篇解決Keras的自定義lambda層去reshape張量時model保存出錯問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python數(shù)據(jù)清洗&預(yù)處理入門教程

    Python數(shù)據(jù)清洗&預(yù)處理入門教程

    凡事預(yù)則立,不預(yù)則廢,訓(xùn)練機器學(xué)習(xí)模型也是如此。數(shù)據(jù)清洗和預(yù)處理是模型訓(xùn)練之前的必要過程,否則模型可能就廢了。本文是一個初學(xué)者指南,將帶你領(lǐng)略如何在任意的數(shù)據(jù)集上,針對任意一個機器學(xué)習(xí)模型,完成數(shù)據(jù)預(yù)處理工作
    2022-10-10
  • tensorflow實現(xiàn)簡單的卷積網(wǎng)絡(luò)

    tensorflow實現(xiàn)簡單的卷積網(wǎng)絡(luò)

    這篇文章主要為大家詳細介紹了tensorflow實現(xiàn)簡單的卷積網(wǎng)絡(luò),使用的數(shù)據(jù)集是MNIST,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 使用Python pandas讀取CSV文件應(yīng)該注意什么?

    使用Python pandas讀取CSV文件應(yīng)該注意什么?

    本文是給使用pandas的新手而寫,主要列出一些常見的問題,根據(jù)筆者所踩過的坑,進行歸納總結(jié),希望對讀者有所幫助,需要的朋友可以參考下
    2021-06-06
  • Python實現(xiàn)亂序文件重新命名編號

    Python實現(xiàn)亂序文件重新命名編號

    這篇文章主要為大家詳細介紹一下Python的一個神操作,那就是實現(xiàn)亂序文件重新命名編號功能,文中的示例代碼講解詳細,感興趣的可以嘗試一下
    2022-08-08
  • Python Sqlalchemy如何實現(xiàn)select for update

    Python Sqlalchemy如何實現(xiàn)select for update

    這篇文章主要介紹了Python Sqlalchemy如何實現(xiàn)select for update,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • Python?生成器yield原理及用法

    Python?生成器yield原理及用法

    這篇文章主要介紹了Python?生成器yield原理及用法,yield?是實現(xiàn)生成器方法之一,當函數(shù)使用yield方法,則該函數(shù)就成為了一個生成器,更多相關(guān)資料需要的小伙伴可以參考一下下面文章內(nèi)容
    2022-06-06
  • 對python實現(xiàn)合并兩個排序鏈表的方法詳解

    對python實現(xiàn)合并兩個排序鏈表的方法詳解

    今天小編就為大家分享一篇對python實現(xiàn)合并兩個排序鏈表的方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python實現(xiàn)對特定列表進行從小到大排序操作示例

    Python實現(xiàn)對特定列表進行從小到大排序操作示例

    這篇文章主要介紹了Python實現(xiàn)對特定列表進行從小到大排序操作,涉及Python文件讀取、計算、正則匹配、排序等相關(guān)操作技巧,需要的朋友可以參考下
    2019-02-02
  • python詳解如何通過sshtunnel pymssql實現(xiàn)遠程連接數(shù)據(jù)庫

    python詳解如何通過sshtunnel pymssql實現(xiàn)遠程連接數(shù)據(jù)庫

    為了安全起見,很多公司服務(wù)器數(shù)據(jù)庫的訪問多半是要做限制的,由專門的DBA管理,而且都是做的集群,數(shù)據(jù)庫只能內(nèi)網(wǎng)訪問,所以就有一個直接的問題是,往往多數(shù)時候,在別的機器上(比如自己本地),是不能訪問數(shù)據(jù)庫的,給日常開發(fā)調(diào)試造成了很大不便
    2021-10-10
  • Django實現(xiàn)自定義404,500頁面教程

    Django實現(xiàn)自定義404,500頁面教程

    這篇文章主要介紹了Django實現(xiàn)自定義404,500頁面的詳細方法,非常簡單實用,有需要的小伙伴可以參考下
    2017-03-03

最新評論