在TF1中以图形模式运行时,我相信当我使用函数式API时,需要通过feeddict连接training=True
和training=False
。在TF2中执行此操作的正确方法是什么?
我相信使用tf.keras.Sequential
时会自动处理。例如,在以下示例中,我不需要从docs指定training
:
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32,3,activation='relu',kernel_regularizer=tf.keras.regularizers.l2(0.02),input_shape=(28,28,1)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.flatten(),tf.keras.layers.Dropout(0.1),tf.keras.layers.Dense(64,activation='relu'),tf.keras.layers.BatchNormalization(),tf.keras.layers.Dense(10,activation='softmax')
])
# Model is the full model w/o custom layers
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.fit(train_data,epochs=NUM_EPOCHS)
loss,acc = model.evaluate(test_data)
print("Loss {:0.4f},accuracy {:0.4f}".format(loss,acc))
在使用功能性API进行训练时,我还可以假设keras会自动处理吗?这是使用函数api重写的相同模型:
inputs = tf.keras.Input(shape=((28,name="input_image")
hid = tf.keras.layers.Conv2D(32,1))(inputs)
hid = tf.keras.layers.MaxPooling2D()(hid)
hid = tf.keras.layers.flatten()(hid)
hid = tf.keras.layers.Dropout(0.1)(hid)
hid = tf.keras.layers.Dense(64,activation='relu')(hid)
hid = tf.keras.layers.BatchNormalization()(hid)
outputs = tf.keras.layers.Dense(10,activation='softmax')(hid)
model_fn = tf.keras.Model(inputs=inputs,outputs=outputs)
# Model is the full model w/o custom layers
model_fn.compile(optimizer='adam',metrics=['accuracy'])
model_fn.fit(train_data,acc = model_fn.evaluate(test_data)
print("Loss {:0.4f},acc))
我不确定hid = tf.keras.layers.BatchNormalization()(hid)
是否需要hid = tf.keras.layers.BatchNormalization()(hid,training)
?
可以找到这些模型的合作实验室here。