از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
«from_logits=True» در توابع از دست دادن Keras/TensorFlow چیست؟
سرفصلهای مطلب
چارچوبهای یادگیری عمیق مانند Keras موانع ورود تودهها را کاهش میدهند و توسعه مدلهای DL را برای افراد بیتجربه دموکراتیک میکنند که میتوانند به آن اعتماد کنند. روی پیشفرضهای معقول و APIهای سادهشده برای تحمل بار سنگین سنگینکردن و تولید نتایج مناسب.
هنگام استفاده از توابع از دست دادن Keras برای طبقه بندی، یک سردرگمی رایج بین تمرین کنندگان جدیدتر یادگیری عمیق ایجاد می شود، مانند CategoricalCrossentropy
و SparseCategoricalCrossentropy
:
loss = keras.losses.SparseCategoricalCrossentropy(from_logits=True)
loss = keras.losses.SparseCategoricalCrossentropy(from_logits=False)
چه می کند
from_logits
پرچم اشاره به؟
پاسخ نسبتاً ساده است، اما نیاز به نگاهی به خروجی شبکه ای دارد که می خواهیم با استفاده از تابع ضرر درجه بندی کنیم.
Logits و SoftMax Probabilities
بطور خلاصه:
احتمالات عادی می شوند – یعنی محدوده ای بین آنها وجود دارد
(0..1)
. لاجیت ها عادی نیستند و می توانند محدوده ای بین آنها داشته باشند(-inf...+inf)
.
بسته به روی لایه خروجی شبکه شما:
output = keras.layers.Dense(n, activation='softmax')(x)
output = keras.layers.Dense(n)(x)
خروجی از Dense
لایه خواهد یا برگشت:
- احتمالات: خروجی از طریق یک تابع SoftMax ارسال می شود که خروجی را به مجموعه ای از احتمالات عادی تبدیل می کند.
n
، که همه جمع می شوند1
. - logits:
n
فعال سازی ها
این تصور اشتباه احتمالاً از نحو کوتاهی ناشی می شود که به شما امکان می دهد یک فعال سازی را به یک لایه اضافه کنید. ظاهرا به عنوان یک لایه، حتی اگر فقط مختصر باشد:
output = keras.layers.Dense(n, activation='softmax')(x)
dense = keras.layers.Dense(n)(x)
output = keras.layers.Activation('softmax')(dense)
تابع ضرر شما باید در مورد اینکه آیا باید انتظار توزیع نرمال شده (خروجی عبور از یک تابع SoftMax) را داشته باشد یا logit ها را داشته باشد. از این رو from_logits
پرچم!
وقتی باید from_logits=درست است?
اگر لایه خروجی شما دارای یک
'softmax'
فعال سازی،from_logits
باید باشدFalse
. اگر لایه خروجی شما a ندارد'softmax'
فعال سازی،from_logits
باید باشدTrue
.
اگر شبکه شما احتمالات خروجی را عادی می کند، تابع ضرر شما باید تنظیم شود from_logits
به False
، زیرا لاجیت را نمی پذیرد. این نیز مقدار پیشفرض تمام کلاسهای ضرری است که پرچم را میپذیرند، زیرا اکثر افراد یک علامت را اضافه میکنند activation='softmax'
به لایه های خروجی آنها:
model = keras.Sequential((
keras.layers.Input(shape=(10, 1)),
keras.layers.Dense(10, activation='softmax')
))
input_data = tf.random.uniform(shape=(1, 1))
output = model(input_data)
print(output)
این نتیجه در:
tf.Tensor(
(((0.12467965 0.10423233 0.10054766 0.09162105 0.09144577 0.07093797
0.12523937 0.11292477 0.06583504 0.11253635))), shape=(1, 1, 10), dtype=float32)
از آنجایی که این شبکه منجر به توزیع نرمال می شود – هنگام مقایسه خروجی ها با خروجی های هدف، و درجه بندی آنها از طریق یک تابع ضرر طبقه بندی (برای کار مناسب) – شما باید تنظیم کنید from_logits
به False
، یا اجازه دهید مقدار پیش فرض باقی بماند.
از طرف دیگر، اگر شبکه شما SoftMax را اعمال نمی کند روی خروجی:
model = keras.Sequential((
keras.layers.Input(shape=(10, 1)),
keras.layers.Dense(10)
))
input_data = tf.random.uniform(shape=(1, 1))
output = model(input_data)
print(output)
این نتیجه در:
tf.Tensor(
(((-0.06081138 0.04154852 0.00153442 0.0705068 -0.01139916
0.08506121 0.1211026 -0.10112958 -0.03410497 0.08653068))), shape=(1, 1, 10), dtype=float32)
شما باید تنظیم کنید from_logits
به True
برای اینکه عملکرد تلفات به درستی با خروجی ها رفتار کند.
زمان استفاده از SoftMax روی خروجی؟
اکثر پزشکان SoftMax را اعمال می کنند روی خروجی برای ارائه یک توزیع احتمال نرمال شده، زیرا در بسیاری از موارد این چیزی است که شما از یک شبکه برای آن استفاده خواهید کرد – به ویژه در مطالب آموزشی ساده شده. با این حال، در برخی موارد، شما نکن می خواهید تابع را در خروجی، به اعمال کنید process قبل از اعمال SoftMax یا تابع دیگری، آن را به روشی متفاوت انجام دهید.
یک مثال قابل توجه از مدلهای NLP میآید، که در آن یک احتمال واقعی بیش از یک واژگان بزرگ میتواند در تانسور خروجی وجود داشته باشد. اعمال SoftMax روی همه آنها و حریصانه گرفتن argmax
معمولاً نتایج خیلی خوبی ایجاد نمی کند.
با این حال، اگر logit ها را مشاهده کردید، Top-K را استخراج کنید (که در آن K می تواند هر عددی باشد اما معمولاً جایی بین (0...10)
، و تنها پس از اعمال SoftMax به top-k نشانه های ممکن در واژگان توزیع را به طور قابل توجهی تغییر می دهند و معمولا نتایج واقعی تری تولید می کنند.
این به عنوان نمونه برداری Top-K شناخته می شود، و اگرچه استراتژی ایده آل نیست، معمولاً به طور قابل توجهی از نمونه برداری حریصانه بهتر عمل می کند.
نتیجه
در این راهنمای کوتاه، نگاهی به آن انداختهایم from_logits
استدلال برای کلاس های ضرر Keras، که اغلب سوالاتی را با تمرین کنندگان جدیدتر ایجاد می کند.
این سردرگمی احتمالاً از نحو کوتاهی ناشی میشود که اجازه میدهد لایههای فعالسازی اضافه شود. روی بالای لایه های دیگر، در تعریف خود یک لایه. ما در نهایت نگاهی به زمان تنظیم آرگومان انداختیم True
یا False
، و زمانی که یک خروجی باید به صورت logit باقی بماند یا از طریق یک تابع فعال سازی مانند SoftMax منتقل شود.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-04 00:14:04