我有以下代碼:
def create_keras_model(num_classes):
"""
This function compiles and returns a Keras model.
Should be passed to KerasClassifier in the Keras scikit-learn API.
"""
input_shape = (28, 28, 1)
x_in = keras.Input(shape=input_shape)
x = layers.Conv2D(32, kernel_size=(3, 3), activation="relu")(x_in)
x = layers.Dropout(0.25)(x,training=True)
x = layers.MaxPool2D(pool_size=(2, 2))(x)
x = layers.Conv2D(64, kernel_size=(3, 3), activation="relu")(x)
x = layers.Dropout(0.25)(x,training=True)
x = layers.MaxPool2D(pool_size=(2, 2))(x)
x = layers.Flatten()(x)
x = layers.Dropout(0.5)(x,training=True)
x = layers.Dense(num_classes)(x)
model = Model(inputs=x_in, outputs=x)
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
return model
為了我的目的,我需要 training=True。但是,在達到此目的之后,我需要在 Dropout-Layers 中進行 training=False。有沒有辦法輕松實作這一目標?
一種方法是加載模型權重并將它們加載到第二個模型中,該模型首先沒有任何 Dropout-Layer,但這似乎過于復雜。
設定“trainable=False”,如:
model.layers[-2].training = False
model.layers[-5].training = False
model.layers[-8].training = False
不起作用。對相同的輸入資料多次呼叫 predict 仍然會產生不同的結果。
uj5u.com熱心網友回復:
DropoutIIUC,您可以嘗試通過創建新模型在推理程序中省略層:
import tensorflow as tf
def create_keras_model(num_classes):
"""
This function compiles and returns a Keras model.
Should be passed to KerasClassifier in the Keras scikit-learn API.
"""
input_shape = (28, 28, 1)
x_in = tf.keras.Input(shape=input_shape)
x = tf.keras.layers.Conv2D(32, kernel_size=(3, 3), activation="relu")(x_in)
x = tf.keras.layers.Dropout(0.25)(x,training=True)
x = tf.keras.layers.MaxPool2D(pool_size=(2, 2))(x)
x = tf.keras.layers.Conv2D(64, kernel_size=(3, 3), activation="relu")(x)
x = tf.keras.layers.Dropout(0.25)(x,training=True)
x = tf.keras.layers.MaxPool2D(pool_size=(2, 2))(x)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dropout(0.5)(x,training=True)
x = tf.keras.layers.Dense(num_classes)(x)
model = tf.keras.Model(inputs=x_in, outputs=x)
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
return model
model = create_keras_model(1)
new_model = tf.keras.Sequential()
for idx, l in enumerate(model.layers):
if not l.name.startswith('dropout'):
if idx==0:
new_model.add(tf.keras.layers.InputLayer(input_shape=(28, 28, 1)))
new_model.add(l)
您還可以嘗試在推理期間將輟學率設定為零:
for layer in model.layers:
if isinstance(layer, tf.keras.layers.Dropout) and hasattr(layer, 'rate'):
layer.rate = 0.0
還要檢查有關該層的檔案:Dropout
請注意,Dropout 層僅在訓練設定為 True 時適用,這樣在推理期間不會丟棄任何值。使用 model.fit 時,訓練會自動適當地設定為 True,在其他情況下,您可以在呼叫層時將 kwarg 顯式設定為 True。
(這與為 Dropout 層設定 trainable=False 形成對比。trainable 不會影響層的行為,因為 Dropout 沒有任何可以在訓練期間凍結的變數/權重。)
正如評論中提到的,您可以在回圈之前創建兩個模型,一個有輟學,一個沒有輟學,并使用:model2.set_weights(model.get_weights()).
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/456241.html
