在多输入模型中继续训练ANN零件时,如何停止训练CNN零件?

时间:2020-10-02 13:04:00

标签: tensorflow keras

我在Keras中建立了一个 multi-input 模型,该模型可以获取图像shape=[N, 640, 480, 3]和数值数据shape=[N, 19],并可以对12个类别进行预测。 以下是定义代码部分的模型:

# # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# #                       MODEL === CNN
# # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#
base_model = keras.applications.ResNet50(
    weights='imagenet',  # Load weights pre-trained on ImageNet.
    input_shape=(640, 480, 3),
    include_top=False)  # Do not include the ImageNet classifier at the top.

base_model.trainable = False
input_Cnn = keras.Input(shape=(640, 480, 3))

x = base_model(input_Cnn, training=False)
# Convert features of shape `base_model.output_shape[1:]` to vectors
x = keras.layers.GlobalAveragePooling2D()(x)
# A Dense classifier with a single unit (binary classification)
x1 = keras.layers.Dense(1024, activation="relu")(x)
out_Cnn = keras.layers.Dense(12, activation="relu")(x1)

# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#                       MODEL === NN
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
inp_num = keras.layers.Input(shape=(19,))  # no. of columns of the numerical data
fc1 = keras.layers.Dense(units=2 ** 6, activation="relu")(inp_num)
fc2 = keras.layers.Dense(units=2 ** 8, activation="relu")(fc1)
fc3 = keras.layers.Dense(units=2 ** 10, activation="relu")(fc2)
fc4 = keras.layers.Dense(units=2 ** 8, activation="relu")(fc3)
fc5 = keras.layers.Dense(units=2 ** 6, activation="relu")(fc4)
out_NN = keras.layers.Dense(12, activation="relu")(fc5)

# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#                       CONCATENATION
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
result = keras.layers.concatenate((out_Cnn, out_NN), axis=-1)  # [N, 12] --- concatenate [N, 12] ==> [N, 24]
result = keras.layers.Dense(1024, activation='relu')(result)
result = keras.layers.Dense(units=12, activation="softmax")(result)

model = keras.Model([input_Cnn, inp_num], result)

print(model.summary())

问题在于CNN部分(如果独立训练)以较少的时期训练,而ANN部分(如果独立训练)花费较长的时间(更多时期)。但是在这段代码中,当两者结合时,准确性不会超过10%。有一定的次数后,有什么方法可以阻止渐变流入CNN部分,以便在该模型之后仅训练ANN部分吗?

1 个答案:

答案 0 :(得分:0)

我没有使用keras,但经过Google的快速搜索后,这应该是答案: 您可以冻结图层,以使某些参数不再可学习:

# this freezes the first N layers
for layer in model.layers[:N]:
    layer.trainable = False

N是您拥有的卷积层数。

相关问题