我有一个训练好的模型,我已经导出了权重,并希望部分加载到另一个模型中。我的模型是使用TensorFlow作为后端在Keras中构建的。
目前我正在这样做:
model = Sequential()model.add(Conv2D(32, (3, 3), input_shape=input_shape, trainable=False))model.add(Activation('relu', trainable=False))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Conv2D(32, (3, 3), trainable=False))model.add(Activation('relu', trainable=False))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Conv2D(64, (3, 3), trainable=True))model.add(Activation('relu', trainable=True))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Flatten())model.add(Dense(64))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(1))model.add(Activation('sigmoid'))model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])model.load_weights("image_500.h5")model.pop()model.pop()model.pop()model.pop()model.pop()model.pop()model.add(Conv2D(1, (6, 6),strides=(1, 1), trainable=True))model.add(Activation('relu', trainable=True))model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
虽然这种方法有效,但我确定这不是一个好的做法。
如何仅加载前9层的权重?
回答:
如果你的前9层在原始训练模型和新模型之间名称一致,那么你可以使用model.load_weights()
并设置by_name=True
。这样只会更新新模型中与原始训练模型中同名层的权重。
层的名称可以通过name
关键字来指定,例如:
model.add(Dense(8, activation='relu',name='dens_1'))