به بخش پرسش و پاسخ یادگیری عمیق خوش آمدید,
این نسخه آزمایشی سایت است.
لطفا به نکات زیر توجه کنید:
  • برای ارتباط با مدیران میتوانید از صفحه مدیران اقدام کنید.
  • سوال و جواب ها باید به زبان فارسی باشند. استفاده از زبان انگلیسی یا فینگلیش برای پاسخ دادن مجاز نیست.
  • لطفا بعد از پرسش سوال لینک سوال خود را در گرو تلگرام (Iran Deep Learning Group) معرفی کنید تا سریعتر به جواب برسید. برای دسترسی به آخرین لینک از منابع یادگیری استفاده کنید
  • لطفا بجای عکس از متن استفاده کنید. اگر متون طولانی هستند از سایت pastebin.com برای اپلود استفاده کرده و لینک حاصل را در سوال خود قرار دهید. برای قرار دادن تصویر ، از بخش ارسال تصویر ادیتور سایت استفاده کنید.
  • بعد از دریافت پاسخ، بهترین پاسخ را از طریق کلیک بر روی علامت تیک انتخاب کنید
  • اگر با خطا و یا مشکلی مواجه شدید از بخش تماس با ما در انتهای صفحه و یا ایمیل Coderx7@gmail.com موضوع را اطلاع دهید.

با تشکر

دسته بندی ها

0 امتیاز

سلام دوستان میشه لطفا تو کد lstm که تو خود keras هست بگید اینجا منظور k.ones_like و k.tile چي هست؟ و input_shape[-1] به چه معني هست؟ و كلا تو كدوم قسمت كد داره خطا رو تو لايه آخر محاسبه ميكنه؟
ممنون

 def get_constants(self, inputs, training=None):
    constants = []
    if self.implementation != 0 and 0 < self.dropout < 1:
        input_shape = K.int_shape(inputs)
        input_dim = input_shape[-1]
        ones = K.ones_like(K.reshape(inputs[:, 0, 0], (-1, 1)))
        ones = K.tile(ones, (1, int(input_dim)))

        def dropped_inputs():
            return K.dropout(ones, self.dropout)

        dp_mask = [K.in_train_phase(dropped_inputs,
                                    ones,
                                    training=training) for _ in range(4)]
        constants.append(dp_mask)
    else:
        constants.append([K.cast_to_floatx(1.) for _ in range(4)])
توسط (109 امتیاز)

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

سلام
جواب سوال اصلیتون که خطا کجا داره محاسبه میشه اینه که اصلا خطا اینجا محاسبه نمیشه
مثل اینه که بپرسیم کجای کد لایه کانولوشن داره خطا حساب میشه
در حقیقت تمامی لایه ها فقط یه تبدیل ورودی به خروجی و تعریف گرادیان ها محلی رو دارن و تعریف خطا مستقلا از تعریف تک تک لایه ها انجام میشه
تاثیرش هم در محاسبه گرادیانه که از لایه آخر حساب میشه و پس انتشار داده میشه توی کل شبکه و نتیجتا لایه ها نیازی ندارن که بدونن خطا چه طوری تعریف شده

اما در مورد توابعی هم که پرسیدید، اینطوری عمل می کنن:
ones_like: شبیه ones می مونه فقط به جای اینکه یه shape بهش بدین و یه tensor کامل از 1 ها بهتون بده، یه تنسور به عنوان ورودی بهش می دید و shape رو از روی tensor ورودی حساب می کنه.

tile: یه تنسور رو به تعداد مورد نظر کپی می کنه(روی axis هایی مختلف).

input_shape هم یه لیست از ابعاد تنسور ورودیه، که طبق قواعد پایتون وقتی اندیس منفی باشه، از آخر لیست یا آرایه حساب میشه، یعنی input_shape[-1] منظور آخرین عنصر لیسته که باید ببینید input_shape چه ابعادی داره تا مشخص بشه منظور کدوم بعده (احتمال زیاد channels ه)

توسط (1.6k امتیاز)
انتخاب شده توسط
خیلی ممنون. برای این پرسیدم خطا کجا محاسبه میشه چون در حقیقت میخواستم کدی که گرادیان رو محاسبه میکنه ببینم . یعنی همون کد مربوط به آموزش شبکه lstm میشه.
میشه بگید این قسمت کد منظور از اینکه واحد ها رو در 1 و 2 و3 و 4 ضرب کرده چی هست
self.kernel = self.add_weight(shape=(self.input_dim, self.units * 4)

self.kernel_i = self.kernel[:, :self.units]
        self.kernel_f = self.kernel[:, self.units: self.units * 2]
        self.kernel_c = self.kernel[:, self.units * 2: self.units * 3]
        self.kernel_o = self.kernel[:, self.units * 3:]
خواهش میکنم
چون تقریبا تمامی عملیات ها مشتق پذیر هستن، محاسبه گرادیان ها اتوماتیک انجام میشه و هم tensorflow و هم theano و تقریبا همه کتابخونه های جدید automatic differentiation دارن و کد مستقیمی برای محاسبه گرادیان در خوده لایه ها وجود نداره

در مورد کدی هم که گذاشتید و در اعداد مختلف ضرب شده، این یه جور کلک پیاده سازیه. یعنی توی LSTM، می تونید برای ورودی و همه گیت ها، ماتریس وزنهای مختلفی در نظر بگیرید. اما خیلی بهینه نیست از نظر پیاده سازی و زمان محاسباتی. در نتیجه میان همه ماتریس ها رو با هم ترکیب می کنن. اما باید بدونین که هر قسمت از این ماتریس بزرگی که به وجود اومده مربوط به کدوم قسمته شبکس. مثلا اینجا اولش ماله گیت ورودی، بعدش وزنها برای گیت فراموشی و .... قرار گرفته
اینطوری شما یه بار یه ماتریس بزرگ رو ضرب می کنید و همه اطلاعات محاسبه میشه و بعدش قسمتهای مختلف رو جدا می کنید. اما اگه جدا بودن باید هر ماتریس رو جداگانه ضرب می کردید که به خصوص توی پیاده سازی روی gpu، خیلی بهینه نیست
پس اینکه مثلا units در گیت فراموشی در 2 ضرب کرده یعنی ماتریس وزن ها رو در این گیت دو برابر گیت ورودی قرار بده؟؟؟؟
و اینکه راهی برای بهینه تر کردنش نیست؟
ممنون
نه این ضربی که انجام داده توی اندیس ها هستش نه توی مقدار وزنها
اینطوری فرض کنید که شما به جای اینکه 4 تا آرایه برای وزنها مختلف در نظر بگیرید، 1 آرایه خیلی بزرگ (4 برابر) در نظر گرفتید و همه وزنها توی این آرایه هستن.
حالا برای استفادش اومده گفته از اینجا تا اینجا ماله گیت فراموشی، از فلان جا تا فلان جا ماله گیت ورودی و ....
این اعدادی که ضرب کرده برای تعیین همین مکان وزنهای مختلف توی آرایه بزرگیه که گفتیم
...