簡體   English   中英

從以前保存的hdf5文件加載模型權重的一部分

[英]Load parts of models weights from previously saved hdf5 file

嗨,我有一個模型,我想使用轉移學習。 我有另一個模型,我已經對其進行了訓練並節省了權重。 我想做的是將以前訓練過的模型的前幾個權重加載到這個具有相同圖層的新模型中,但是最后我增加了更多的圖層。 如何將前幾層的權重加載到新模型中?

這是我嘗試過的:

def load_custom_weights(model, data, layer_indices):
  weights = [data[p] for p in layer_indices]
  print(model.weights)
  model.set_weights(weights)
  print(model.get_weights())
  return model

filename = 'unimodal_weights/best_weight_image_only_k-fold_1.hdf5'
f = h5py.File(filename, 'r')
img_data = f['model_weights']['Image_Branch']['Image_Branch_2']

img = get_img_branch()
img = load_custom_weights(img, img_data, list(img_data))

該模型似乎加載了權重,但是即使我們從得分中獲得的權重很好,我的准確性也很低。

有什么方法可以檢查我的模型是否實際加載了權重?

編輯 :它們都是多GPU模型

編輯2:

所以我的模型有些棘手,我在模型中嵌入了一個順序模型。 我想將權重加載到分支之一,特別是圖像分支

這是我的模型的樣子:

Image_Branch:

def get_img_branch():
    Image_Branch = Sequential(name='Image_Branch')
    #block 1
    Image_Branch.add(Conv2D(64, kernel_size=(3,3), activation='relu', padding='valid', kernel_initializer='he_normal', name='block1_conv1'))
    Image_Branch.add(BatchNormalization())
    Image_Branch.add(Conv2D(64, kernel_size=(3,3), activation='relu', padding='valid', kernel_initializer='he_normal', name='block1_conv2'))
    Image_Branch.add(BatchNormalization())
    Image_Branch.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), name='block1_pool'))
...SNIP...
    #Flatten
    Image_Branch.add(Flatten())
    return Image_Branch

封裝模型

image_input = Input(shape, name='image_input')
#get branches
img = get_img_branch()
#set up our image branch
image_branch = (img)(image_input)
...SNIP

我們可以看到我們采用了圖像分支(它是一個順序模型),並將其插入到新模型中。 這里的關鍵是在HDF5格式中有一個名為['model_weights']的密鑰,在此字典中還有一個名為['Image_Branch']的密鑰,它與我的模型相對應。

我們要做的只是調用:

load_weights(img_loc, by_name=True)

代替:

img = get_img_branch()
img.load_weights(img_loc, by_name=True)

因為這樣做,后者將嘗試查找圖像分支鍵['Image_Branch'],但找不到它,因為在后一個示例中加載圖像分支時,它就是圖像分支。 稱為“ Image_Branch”的層僅存在於對其進行封裝的模型中。

另外,如果您要加載多GPU模型並插入權重,則可以執行以下操作:

model.layers[-2].load_weights(img_loc, by_name=True)

您可以通過從文檔中仔細命名圖層並使用現有的model.load_weights(filename, by_name=True)來實現此目的:

model.load_weights(filepath, by_name=False)從HDF5文件(由save_weights創建model.load_weights(filepath, by_name=False)加載模型的權重。 默認情況下,該架構應保持不變。 要將權重加載到不同的體系結構中(共有一些層),請使用by_name=True僅加載具有相同名稱的那些層。

名稱所指的是例如Dense(21, ..., name='dense_layer_1')或您的Image_Branch子模型。 因此,請檢查圖層的原始名稱,然后使用匹配的名稱重新創建新模型,同時新圖層具有不同的新名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM