在KerasLayer中是否有办法冻结特定层?

我目前正在构建一个使用迁移学习来分类图像的CNN。在我的模型中,有一个使用EfficientNet的tensorflow-hub KerasLayer来创建特征向量。

我的代码如下:

model = models.Sequential([hub.KerasLayer("https://tfhub.dev/google/efficientnet/b7/feature-vector/1", trainable=True), # Trainablelayers.Dropout(DROPOUT),layers.Dense(NEURONS_PER_LAYER, kernel_regularizer=tf.keras.regularizers.l2(REG_LAMBDA), activation=ACTIVATION),layers.Dropout(DROPOUT),layers.Dense(NEURONS_PER_LAYER, kernel_regularizer=tf.keras.regularizers.l2(REG_LAMBDA), activation=ACTIVATION),layers.Dropout(DROPOUT),layers.Dense(NEURONS_PER_LAYER, kernel_regularizer=tf.keras.regularizers.l2(REG_LAMBDA), activation=ACTIVATION),layers.Dropout(DROPOUT),layers.Dense(NEURONS_PER_LAYER, kernel_regularizer=tf.keras.regularizers.l2(REG_LAMBDA), activation=ACTIVATION),layers.Dropout(DROPOUT),layers.Dense(1, activation="sigmoid")])

我可以冻结或解冻整个KerasLayer,但似乎找不到办法只冻结早期层并微调更高级的部分。谁能帮帮我?


回答:

你可以通过使用layer.trainable = False来冻结整个层。如果你碰巧加载整个模型或从头开始创建模型,你可以使用这个循环来找到特定的层进行冻结。

# 加载模型或创建模型model = Model(...)# 首先你打印出模型概要model.summary()# 你会得到类似这样的结果''' Model: "sequential_2"_________________________________________________________________Layer (type)                 Output Shape              Param #   =================================================================inception_resnet_v2 (Model)  (None, 2, 2, 1536)        54336736  _________________________________________________________________flatten_2 (Flatten)          (None, 6144)              0         _________________________________________________________________dropout_2 (Dropout)          (None, 6144)              0         _________________________________________________________________dense_8 (Dense)              (None, 2048)              12584960  _________________________________________________________________dense_9 (Dense)              (None, 1024)              2098176   _________________________________________________________________dense_10 (Dense)             (None, 512)               524800    _________________________________________________________________dense_11 (Dense)             (None, 17)                8721      ================================================================='''# 这是用于冻结特定层(本例中是dense_10)的循环for layer in model.layers:    # 通过名称选择层    if layer.name == 'dense_10':        layer.trainable = False# 对于那个hub层,你需要在模型之外创建hub层,以便更容易访问# 我的Inception层inception_layer = keras.applications.InceptionResNetV2(weights='imagenet', include_top=False, input_shape=(128, 128, 3))# 创建模型model.add(inception_layer)# 同样的技巧inception_layer.summary()# 这是上面示例中的相同循环for layer in inception_layer.layers:    # 通过名称选择层    if layer.name == 'block8_10_conv':        layer.trainable = False

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注