【问题标题】:Freezing keras layer doesn't change sumarry trainable params冻结 keras 层不会改变 sumarry 可训练参数
【发布时间】:2019-12-25 10:10:54
【问题描述】:

我有 2 个模型已在脚本中编译和训练。现在我正在尝试连接倒数第二层,冻结所有层,添加新的可训练层。

这里是训练好的模型:

morf_input = keras.layers.Input([np.shape(x)[1]])
morf_layer1 = keras.layers.Dense(800,activation="tanh")(morf_input)
morf_layer2 = keras.layers.Dense(800,activation="tanh" )(morf_layer1)
morf_layer3 = keras.layers.Dense(600,activation="tanh" )(morf_layer2)
morf_layer4 = keras.layers.Dense(300,activation="tanh" )(morf_layer3)
morf_layer5 = keras.layers.Dense(50,activation="tanh" )(morf_layer4)
morf_bneck6 = keras.layers.Dense(30,activation="tanh" )( morf_layer5)
morf_output = keras.layers.Dense(2,activation="sigmoid")(morf_bneck6)

morf_model = keras.models.Model(inputs=morf_input, outputs=morf_output)

color_input = keras.layers.Input([np.shape(col_x)[1]])
color_layer1 = keras.layers.Dense(800,activation="tanh")( color_input)
color_layer2 = keras.layers.Dense(800,activation="tanh" )( color_layer1)
color_layer3 = keras.layers.Dense(600,activation="tanh" )( color_layer2)
color_layer4 = keras.layers.Dense(300,activation="tanh" )( color_layer3)
color_layer5 = keras.layers.Dense(50,activation="tanh" )( color_layer4)
color_bneck6 = keras.layers.Dense(10,activation="tanh" )( color_layer5)
color_output = keras.layers.Dense(2,activation="sigmoid")( color_bneck6)

color_model = keras.models.Model(inputs= color_input, outputs= color_output)

然后我尝试使用以下命令冻结这些层:

morf_layer1.trainable = False
morf_layer2.trainable = False
morf_layer3.trainable = False
morf_layer4.trainable = False
morf_layer5.trainable = False
morf_bneck6.trainable = False

color_layer1.trainable = False
color_layer2.trainable = False
color_layer3.trainable = False
color_layer4.trainable = False
color_layer5.trainable = False
color_bneck6.trainable = False

然后用这些层创建一个新模型

concat_layer= keras.layers.Concatenate()([morf_bneck6, color_bneck6])
con_out_layer1 = keras.layers.Dense(500,activation="tanh")(concat_layer)
con_out_layer2 = keras.layers.Dense(400,activation="tanh")(con_out_layer1)
con_out_layer3 = keras.layers.Dense(300,activation="tanh")(con_out_layer2)
con_out_layer4 = keras.layers.Dense(30,activation="tanh")(con_out_layer3)
output = keras.layers.Dense(2,activation="sigmoid")(con_out_layer4)

model = keras.models.Model(inputs=[morf_input, color_input], outputs=output)

我编译了模型

model.compile(optimizer=keras.optimizers.SGD(lr=0.008, decay=1e-6, momentum=0.9, nesterov=False),
              loss='binary_crossentropy',
              metrics=['accuracy'])

model.summary() 显示

Total params: 3,035,432
Trainable params: 3,035,432
Non-trainable params: 0

冻结层不应该增加Non-trainable参数吗?

【问题讨论】:

  • 为什么要创建两个模型?只保留最后一个
  • @m33n 我正在这些模型上训练 2 个不同的数据,并尝试将这些数据组合起来以在级联模型中进行分类
  • 我用这个例子Keras: Multiple outputs and multiple losses来创建像这样的模型keras。

标签: python tensorflow keras neural-network deep-learning


【解决方案1】:

由于您想冻结除最后 6 层之外的所有图层

for layer in model.layers[:-6]:
    layer.trainable = False

工作示例

# Model 1
inputs_1 = keras.layers.Input(shape=(10,))
l_1 = keras.layers.Dense(15,activation="tanh")(inputs_1)
outputs_1 = keras.layers.Dense(2,activation="sigmoid")(l_1)
model_1 = keras.models.Model(inputs_1, outputs_1)
model_1.compile(optimizer=keras.optimizers.SGD(lr=0.008),
              loss='binary_crossentropy',
              metrics=['accuracy'])
print ("Taining Model 1")
model_1.fit(np.random.randn(100,10), np.random.randn(100,2))

# Model 2
inputs_2 = keras.layers.Input(shape=(10,))
l_2 = keras.layers.Dense(15,activation="tanh")(inputs_2)
outputs_2 = keras.layers.Dense(2,activation="sigmoid")(l_2)
model_2 = keras.models.Model(inputs_2, outputs_2)
model_2.compile(optimizer=keras.optimizers.SGD(lr=0.008),
              loss='binary_crossentropy',
              metrics=['accuracy'])
print ("Taining Model 2")
model_2.fit(np.random.randn(100,10), np.random.randn(100,2))

# Combined Model
concat_layer= keras.layers.Concatenate()([outputs_1, outputs_2])
con_out_layer1 = keras.layers.Dense(5,activation="tanh")(concat_layer)
output = keras.layers.Dense(2,activation="sigmoid")(con_out_layer1)

model = keras.models.Model(inputs=[inputs_1, inputs_2], outputs=output)

model.summary()
# Freeze all but last two layers (Concatenate is anyway not a 
# trainable layer)
for layer in model.layers[:-2]:
    layer.trainable = False
model.summary()
model.compile(optimizer=keras.optimizers.SGD(lr=0.008),
              loss='binary_crossentropy',
              metrics=['accuracy'])

print ("Taining Combined Model")
model.fit([np.random.randn(100,10),np.random.randn(100,10)],np.random.randn(100,2))

样本输出

......
Total params: 431
Trainable params: 431
Non-trainable params: 0
......
......
Total params: 431
Trainable params: 37
Non-trainable params: 394

【讨论】:

  • 我想训练模型然后冻结模型,看来问题是我已经编译并训练模型然后尝试冻结它们
  • 你的意思是你想分别训练 morf_model 和 color_model 然后组合然后冻结它们,除了组合模型的最后几层?
  • 是的,这正是我想要做的,但我希望 concat 层之后的层是可训练的
  • @theo123490 在我的回答中使用Working Example 中的模式,它应该可以工作。
【解决方案2】:

尝试以下方法:

  1. 图层定义
  2. 模式实例化
  3. 将 trainable 设置为 false
  4. 编译模型

【讨论】:

  • 您介意解释一下什么是现代实例化吗?
  • 这是你的模型的实例化```keras.models.Model(inputs=morf_input, outputs=morf_output)´´´
  • Non trainable params 仍然是 0
猜你喜欢
  • 2018-12-27
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2019-09-06
相关资源
最近更新 更多