在keras中冻结卷积层的正确方法是什么
What is the right way to freeze a convoloutional layer in keras
我想冻结模型中的单个卷积层,我通过在类似于密集层 Dense(32, trainable=False)
的卷积层中传递 traninable=False
参数来实现
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.models import Sequential
from keras.layers.normalization import BatchNormalization
from keras.layers import Conv2D,MaxPooling2D,ZeroPadding2D,GlobalAveragePooling2D
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(28,28,1)))
model.add(BatchNormalization(axis=-1))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(BatchNormalization(axis=-1))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64,(3, 3),trainable=False)) #freezed layer
model.add(BatchNormalization(axis=-1))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(BatchNormalization(axis=-1))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
# Fully connected layer
model.add(Dense(512))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(10))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
模型似乎编译没有任何错误,但是当我检查 keras docs 时,Conv2D
似乎没有名为 trainable
的参数。我冻结卷积层的方法有效吗?这里发生了什么?
是的,它有效且正确。
可训练参数由所有层(称为层)的父级class使用,并确保该层的参数不作为可训练参数包含在梯度中。
我想冻结模型中的单个卷积层,我通过在类似于密集层 Dense(32, trainable=False)
traninable=False
参数来实现
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.models import Sequential
from keras.layers.normalization import BatchNormalization
from keras.layers import Conv2D,MaxPooling2D,ZeroPadding2D,GlobalAveragePooling2D
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(28,28,1)))
model.add(BatchNormalization(axis=-1))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(BatchNormalization(axis=-1))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64,(3, 3),trainable=False)) #freezed layer
model.add(BatchNormalization(axis=-1))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(BatchNormalization(axis=-1))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
# Fully connected layer
model.add(Dense(512))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(10))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
模型似乎编译没有任何错误,但是当我检查 keras docs 时,Conv2D
似乎没有名为 trainable
的参数。我冻结卷积层的方法有效吗?这里发生了什么?
是的,它有效且正确。
可训练参数由所有层(称为层)的父级class使用,并确保该层的参数不作为可训练参数包含在梯度中。