Keras模型拼裝
阿新 • • 發佈:2018-11-04
在訓練較大網路時, 往往想載入預訓練的模型, 但若想在網路結構上做些添補, 可能出現問題一二...
一下是添補的幾種情形, 此處以單輸出迴歸任務為例:
# 添在末尾: base_model = InceptionV3(weights='imagenet', include_top=False) x = base_model.output x = GlobalAveragePooling2D()(x) x = Dense(1, activation='relu')(x) model = Model(inputs=base_model.input, outputs=x) model.summary()
# 添在開頭和末尾: # 在開頭加1x1卷積層, 使4通道降為3通道, 再傳入InceptionV3 def head_model(input_shape=(150, 150, 4)): input_tensor = Input(input_shape) x = Conv2D(128, (1, 1), activation='relu')(input_tensor) x = Conv2D(3, (1, 1), activation='relu')(x) model = Model(inputs=input_tensor, outputs=x, name='head') return model head_model = head_model() body_model = InceptionV3(weights='imagenet', include_top=False) base_model = Model(head_model.input, body_model(head_model.output)) x = base_model.output x = GlobalAveragePooling2D()(x) x = Dense(1, activation='relu')(x) model = Model(inputs=body_model.inputs, outputs=x) model.summary()
# 兩資料輸入流合併於末尾: base_model = InceptionV3(weights='imagenet', include_top=False, input_shape=(150, 150, 3)) flat = Flatten()(base_model.output) input_K = Input((100, )) # another_input K_flow = Activation(activation='linear')(input_K) x = concatenate([flat, K_flow]) # 合流 x = Dense(1024, activation='relu')(x) x = Dense(512, activation='relu')(x) x = Dense(1, activation='relu')(x) model = Model(inputs=[*base_model.inputs, input_K], outputs=x) # 資料生成器那裡也以這種形式生成([x_0, x_1], y)即可. model.summary()