সংক্ষিপ্ত সংস্করণ:
ধরুন আপনার দুটি টেনার y_hat
রয়েছে , যেখানে প্রতিটি শ্রেণির জন্য গণনা করা স্কোর রয়েছে (উদাহরণস্বরূপ, y = W * x + b থেকে) এবং y_true
এতে এক-হট এনকোড হওয়া সত্য লেবেল রয়েছে।
y_hat = ... # Predicted label, e.g. y = tf.matmul(X, W) + b
y_true = ... # True label, one-hot encoded
আপনি যদি স্কোরটিকেy_hat
অস্বাভাবিক লগ সম্ভাব্যতা হিসাবে ব্যাখ্যা করেন তবে সেগুলি লগইট হয় ।
অতিরিক্তভাবে, মোট ক্রস-এনট্রপি লোকসান এই পদ্ধতিতে গণনা:
y_hat_softmax = tf.nn.softmax(y_hat)
total_loss = tf.reduce_mean(-tf.reduce_sum(y_true * tf.log(y_hat_softmax), [1]))
মূলত ফাংশনটির সাথে গণনা করা মোট ক্রস-এনট্রপি লোকসানের সমতুল্য softmax_cross_entropy_with_logits()
:
total_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true))
দীর্ঘ সংস্করণ:
আপনার নিউরাল নেটওয়ার্কের আউটপুট স্তরে, আপনি সম্ভবত এমন একটি অ্যারে গণনা করবেন যা আপনার প্রতিটি প্রশিক্ষণের জন্য ক্লাস স্কোর রয়েছে, যেমন কোনও গণনা থেকে y_hat = W*x + b
। একটি উদাহরণ হিসাবে পরিবেশন করতে, নীচে আমি y_hat
একটি 2 x 3 অ্যারে তৈরি করেছি , যেখানে সারিগুলি প্রশিক্ষণের উদাহরণগুলির সাথে সামঞ্জস্য করে এবং কলামগুলি ক্লাসগুলির সাথে মিলে যায়। সুতরাং এখানে 2 টি প্রশিক্ষণ উদাহরণ এবং 3 ক্লাস রয়েছে।
import tensorflow as tf
import numpy as np
sess = tf.Session()
# Create example y_hat.
y_hat = tf.convert_to_tensor(np.array([[0.5, 1.5, 0.1],[2.2, 1.3, 1.7]]))
sess.run(y_hat)
# array([[ 0.5, 1.5, 0.1],
# [ 2.2, 1.3, 1.7]])
মনে রাখবেন মানগুলি স্বাভাবিক হয় না (উদাহরণস্বরূপ সারিগুলি 1 পর্যন্ত যোগ করে না)। এগুলি স্বাভাবিক করার জন্য, আমরা সফটম্যাক্স ফাংশনটি প্রয়োগ করতে পারি, যা ইনপুটটিকে অস্বাভাবিক লগ সম্ভাব্যতা (ওরফে লগইটস ) হিসাবে ব্যাখ্যা করে এবং লাইনারি সম্ভাব্যতাগুলিকে সাধিত করে তোলে ।
y_hat_softmax = tf.nn.softmax(y_hat)
sess.run(y_hat_softmax)
# array([[ 0.227863 , 0.61939586, 0.15274114],
# [ 0.49674623, 0.20196195, 0.30129182]])
সফটম্যাক্স আউটপুট কী বলছে তা পুরোপুরি বুঝতে গুরুত্বপূর্ণ। নীচে আমি একটি টেবিল দেখিয়েছি যা উপরের আউটপুটটিকে আরও স্পষ্টভাবে প্রতিনিধিত্ব করে। এটি দেখা যায়, উদাহরণস্বরূপ, প্রশিক্ষণের উদাহরণ 1 "ক্লাস 2" হওয়ার সম্ভাবনা 0.619। প্রতিটি প্রশিক্ষণের জন্য শ্রেণীর সম্ভাবনাগুলি স্বাভাবিক করা হয়, তাই প্রতিটি সারির যোগফল 1.0 হয়।
Pr(Class 1) Pr(Class 2) Pr(Class 3)
,--------------------------------------
Training instance 1 | 0.227863 | 0.61939586 | 0.15274114
Training instance 2 | 0.49674623 | 0.20196195 | 0.30129182
সুতরাং এখন আমাদের প্রতিটি প্রশিক্ষণের উদাহরণের ক্লাসের সম্ভাবনা রয়েছে, যেখানে আমরা চূড়ান্ত শ্রেণিবিন্যাস তৈরি করতে প্রতিটি সারির আরগম্যাক্স () নিতে পারি। উপরের দিক থেকে, আমরা জেনারেশন করতে পারি যে প্রশিক্ষণ উদাহরণ 1 "ক্লাস 2" এর সাথে সম্পর্কিত এবং প্রশিক্ষণ উদাহরণ 2 "ক্লাস 1" এর অন্তর্গত।
এই শ্রেণিবিন্যাসগুলি কি সঠিক? আমাদের প্রশিক্ষণের সেট থেকে সত্য লেবেলের বিরুদ্ধে পরিমাপ করা দরকার। আপনার একটি এক-হট এনকোডেড y_true
অ্যারে লাগবে , যেখানে আবার সারিগুলির প্রশিক্ষণের উদাহরণ এবং কলামগুলি ক্লাস। নীচে আমি একটি y_true
উষ্ণ অ্যারে তৈরি করেছি যেখানে প্রশিক্ষণের উদাহরণ 1 এর জন্য সত্য লেবেল "ক্লাস 2" এবং প্রশিক্ষণের উদাহরণ 2 এর জন্য সত্য লেবেল "ক্লাস 3"।
y_true = tf.convert_to_tensor(np.array([[0.0, 1.0, 0.0],[0.0, 0.0, 1.0]]))
sess.run(y_true)
# array([[ 0., 1., 0.],
# [ 0., 0., 1.]])
সম্ভাবনা বন্টন সম্ভাব্যতা বিতরণ y_hat_softmax
কাছাকাছি হয় y_true
? ত্রুটিটি পরিমাপ করতে আমরা ক্রস-এন্ট্রপি ক্ষতি ব্যবহার করতে পারি ।
আমরা ক্রস-এনট্রপি ক্ষয়টি সারিবদ্ধ ভিত্তিতে গণনা করতে পারি এবং ফলাফলগুলি দেখতে পারি। নীচে আমরা দেখতে পারি যে প্রশিক্ষণের উদাহরণ 1 টির ক্ষতি 0.479 রয়েছে, তবে প্রশিক্ষণের উদাহরণ 2 এর বেশি ক্ষতি হয়েছে 1.200। এই ফলাফলটি বোধগম্য হয় কারণ উপরোক্ত আমাদের উদাহরণে y_hat_softmax
দেখা গেছে যে প্রশিক্ষণের উদাহরণ 1 এর সর্বোচ্চ সম্ভাবনা ছিল "ক্লাস 2" এর জন্য, যা প্রশিক্ষণ উদাহরণ 1-এর সাথে মেলে y_true
; তবে, প্রশিক্ষণের উদাহরণ 2 এর পূর্বাভাসটি "ক্লাস 1" এর জন্য সর্বোচ্চ সম্ভাবনা দেখিয়েছে, যা সত্য শ্রেণীর "ক্লাস 3" এর সাথে মেলে না।
loss_per_instance_1 = -tf.reduce_sum(y_true * tf.log(y_hat_softmax), reduction_indices=[1])
sess.run(loss_per_instance_1)
# array([ 0.4790107 , 1.19967598])
আমরা সত্যিই যা চাই তা হ'ল সমস্ত প্রশিক্ষণের ক্ষেত্রে সম্পূর্ণ ক্ষতি। সুতরাং আমরা গণনা করতে পারি:
total_loss_1 = tf.reduce_mean(-tf.reduce_sum(y_true * tf.log(y_hat_softmax), reduction_indices=[1]))
sess.run(total_loss_1)
# 0.83934333897877944
সফটম্যাক্স_ক্রস_এন্ট্রপি_সহ_লগিটগুলি ()
tf.nn.softmax_cross_entropy_with_logits()
নীচে দেখানো হিসাবে আমরা ফাংশনটি ব্যবহার করে মোট ক্রস এনট্রপি ক্ষতি গণনা করতে পারি ।
loss_per_instance_2 = tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true)
sess.run(loss_per_instance_2)
# array([ 0.4790107 , 1.19967598])
total_loss_2 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true))
sess.run(total_loss_2)
# 0.83934333897877922
নোট করুন total_loss_1
এবং total_loss_2
খুব চূড়ান্ত অঙ্কের মধ্যে কিছু ছোট পার্থক্য সহ মূলত সমতুল্য ফলাফল উত্পাদন করুন। তবে আপনি দ্বিতীয় পদ্ধতিটিও ব্যবহার করতে পারেন: এটি কোডের একটি কম লাইন নেয় এবং কম সংখ্যক ত্রুটি জমে কারণ আপনার ভিতরে সফটম্যাক্সটি করা হয়ে থাকে softmax_cross_entropy_with_logits()
।
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(tf.nn.softmax(tf.add(tf.matmul(x,W),b)),y) cost=tf.reduce_mean(cross_entropy)
। তবে আমি যখন অন্য কোনও উপায়ে ব্যবহার করি,pred=tf.nn.softmax(tf.add(tf.matmul(x,W),b)) cost =tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1))
ফলাফল স্থিতিশীল এবং ভাল।