我寫了一個層,它什么都不做
class Fractal2D(tf.keras.layers.Layer):
def __init__(self, kernel_size_range):
super(Fractal2D, self).__init__()
self.kernel_size_range = kernel_size_range
def build(self, inputs):
print(f'build executes eagerly: {tf.executing_eagerly()}')
return inputs
def call(self, inputs):
print(f'call executes eagerly: {tf.executing_eagerly()}')
return inputs
并做了一個模型
model = tf.keras.Sequential([
tf.keras.layers.InputLayer(input_shape=(224, 224, 3), batch_size=32),
Fractal2D(kernel_size_range=(3, 41)),
hub.KerasLayer("https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4", output_shape=[1280],
trainable=False),
tf.keras.layers.Dense(DIAGNOSIS_NUMBER, activation='softmax')
])
單元格的輸出是
build executes eagerly: True
call executes eagerly: False
當我訓練模型時
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(training_set, validation_data=validation_set, epochs=20)
我得到
Epoch 1/20
call executes eagerly: False
call executes eagerly: False
問題:
- 為什么在實體化模型時執行 build 和 call 方法?
- 如果急切執行是默認的執行方法,為什么不急切執行 call 方法?
uj5u.com熱心網友回復:
在call定制層的方法被自動飾@tf.function,這實質上造成在第一呼叫的資料流圖,然后執行對所有后續呼叫此曲線圖。為什么這與您的問題有關?因為根據檔案上tf.executing_eagerly():
默認情況下啟用 Eager 執行,并且該 API 在大多數情況下回傳 True。但是,在以下用例中,此 API 可能會回傳 False。
- 在 tf.function 內部執行,除非在 tf.init_scope 或 tf.config.run_functions_eagerly(True) 之前被呼叫。
- 在 tf.dataset 的轉換函式中執行。
- tf.compat.v1.disable_eager_execution() 被呼叫。
因此,讓我們嘗試看看使用時會發生什么tf.init_scope:
import tensorflow_hub as hub
import tensorflow as tf
class Fractal2D(tf.keras.layers.Layer):
def __init__(self, kernel_size_range):
super(Fractal2D, self).__init__()
self.kernel_size_range = kernel_size_range
def build(self, inputs):
print(f'build executes eagerly: {tf.executing_eagerly()}')
return inputs
def call(self, inputs):
with tf.init_scope():
print(f'call executes eagerly: {tf.executing_eagerly()}')
return inputs
model = tf.keras.Sequential([
tf.keras.layers.InputLayer(input_shape=(224, 224, 3), batch_size=1),
Fractal2D(kernel_size_range=(3, 41)),
hub.KerasLayer("https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4", output_shape=[1280],
trainable=False),
tf.keras.layers.Dense(1, activation='sigmoid')
])
training_set = tf.random.normal((1, 224, 224, 3))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(training_set, tf.random.normal((1, 1)), epochs=2)
build executes eagerly: True
call executes eagerly: True
Epoch 1/2
call executes eagerly: True
call executes eagerly: True
1/1 [==============================] - 4s 4s/step - loss: 0.2856 - accuracy: 0.0000e 00
Epoch 2/2
1/1 [==============================] - 0s 36ms/step - loss: 0.1641 - accuracy: 0.0000e 00
<keras.callbacks.History at 0x7f8836515710>
似乎與檔案一致。
uj5u.com熱心網友回復:
我認為即使您使用自定義層,您也可以運行 Eager 模式。由于 'model.fit()' 方法,您的模型在圖形模式下運行,要在 Eager 模式下運行,您必須從頭開始撰寫自己的訓練回圈,您可以使用 GradientTape。 [1]:https://www.tensorflow.org/guide/keras/customizing_what_happens_in_fit
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/377466.html
上一篇:如何使用python將大型影像資料集劃分為圖片組并將它們保存在子檔案夾中?
下一篇:相同資料的不同預測
