簡體   English   中英

Keras - 使用 tf.keras.layers.Dense(1,activation='sigmoid')(x) 時指定 from_logits=False

[英]Keras - Specifying from_logits=False when using tf.keras.layers.Dense(1,activation='sigmoid')(x)

我正在研究二進制分類問題,使用遷移學習和圖像輸入,並且對

我一直在使用正確的激活層(例如 Softmax 或 Sigmoid - sigmoid 用於多類的二進制 softmax),並注意到當我將 'sigmoid' 指定為Dense() output 層的一部分時,我不再需要指定from_logits=Truemodel.compile()期間。

這意味着當我獲得預測時,我不使用tf.nn.sigmoid() function 而是簡單地檢查該值是否大於 0.5,然后是 1,否則為 0。這是正確的嗎? 這是我的代碼:

 i = keras.Input(shape=(150, 150, 3)) scale_layer = keras.layers.Rescaling(scale=1 / 127.5, offset=-1) mt = scale_layer(i) mt = base_model(model_top, training=False) mt = keras.layers.GlobalAveragePooling2D()(mt) mt = keras.layers.Dropout(dropout)(mt) # Regularize with dropout o = keras.layers.Dense(1,activation='sigmoid')(mt) model = keras.Model(i, o).... model.compile(optimizer=keras.optimizers.Adam(lr),loss=keras.losses.BinaryCrossentropy(from_logits=False) )

然后當我獲得預測時,我有以下內容:

 pred = model.predict(test) pred = tf.where(pred < 0.5, 0, 1) pred = pred.numpy()

我的直覺是,當我在密集層構建期間指定 sigmoid 激活 function 時,我不再使用“logits”,因此以后不需要應用 sigmoid function。 在文檔中,我已經看到了使用的兩個示例,但是在使用model.predict()時信息非常稀少,希望得到任何指導。

這意味着當我獲得預測時,我不使用 tf.nn.sigmoid() function 而是簡單地檢查該值是否大於 0.5,然后是 1,否則為 0。這是正確的嗎?

是的,您甚至不需要from_logits參數,因為您使用的是sigmoid function。 我相信默認情況下它是 False 。

然后當我獲得預測時,我有以下內容:

取決於您的訓練數據的(不)平衡程度。 理想情況下,如果它是平衡的,那么您是正確的, pred > 0.5 意味着 model 認為圖像更接近 class 1 如果您有不成比例的大量1 ,則 model 可能更傾向於將圖像分類為1 相反,如果您選擇使用softmax function,您將得到一個長度= num_of_classes 的數組,每個預測數組加起來為1.0,數組中的每個元素代表模型對圖像屬於每個class 的置信度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM