اطلاعیه

Collapse
No announcement yet.

کمک برای بهینه کردن کد

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    کمک برای بهینه کردن کد

    من یک کد رو برای آموزش شبکه عصبی - برای پیشبینی- نوشتم...این شبکه به نحو مطلوبی آموزش می بینه ولی در پیشبینی داده های جدید خوب عمل نمی کنه...خطای آموزشش زیر یک درصده ولی در مرحله پیش بینی خطاش حدود 20 درصد هست...

    هر راهی که به ذهنم اومده رو امتحان کردم ولی خطا کمتر از این نمیشه...فایل کد مطلب و همچنین فایل اکسل داده ها رو در زیر قرار دادم...اگر کسی راهی به ذهنش میاد که واقعا کارا باشه - نه در حد ایده و حدس - لطفا بهم بگه یا در کد اعمالش کنه چون خسته شدم!...هم نحوه آموزش رو تغییر دادم هم تعداد لایه ها رو وهم ... ولی فایده ای نداشته.

    بعد از اجرای شبکه یه سری نمودار ظاهر میشه که سطر اول مربوط به آموزشه و سطر دوم مربوط به تست شبکه...اینم فایل:
    http://ghlari.persiangig.com/ANN.zip


    یه سوال هم داشتم : آیا لازمه خروجی های شبکه هم نرمال بشن؟


    #2
    پاسخ : کمک برای بهینه کردن کد

    من کد شما را ندیدم ولی با فرض اینکه خطاهای دستوری ندارید آنوقت با توجه به اینکه خطای آموزش شما پایین است و خطای آزمون شما بالا است احتمالا شبکه شما "فراموخته" شده یعنی (over train ) شده است.
    با همین کلمه کلیدی اگر جستجو کنید راه حل را می یابید و الا بگویید تا بیشتر توضیح دهم.

    دیدگاه


      #3
      پاسخ : کمک برای بهینه کردن کد

      نوشته اصلی توسط HassanH
      من کد شما را ندیدم ولی با فرض اینکه خطاهای دستوری ندارید آنوقت با توجه به اینکه خطای آموزش شما پایین است و خطای آزمون شما بالا است احتمالا شبکه شما "فراموخته" شده یعنی (over train ) شده است.
      با همین کلمه کلیدی اگر جستجو کنید راه حل را می یابید و الا بگویید تا بیشتر توضیح دهم.
      می دونم فراآموخته شده منتها راه حلش رو نمیدونم...بذار بیشتر توضیح بدم...

      توی این کد من 4 تا ورودی دارم و 2 تا خروجی...اول اومدم یک شبکه رو در نظر گرفتم که بتونه واسم دو تا خروجی رو پیش بینی کنه ولی جواب خوب نبود...بعد اومدم دو تا شبکه در نطر گرفتم...جواب یکی از این شبکه ها هم در مرحله آموزش و هم در مرحله تست خوب هست ولی یکی از شبکه ها جواب مناسبی در مرحله تست نداره...یعنی performance خیلی خوبه ( حدودا order -10) و regression هم 1 میشه (که البته می دونم این حتما نشونه خوبی نیست)...خلاصه این که اومدم حد performance رو هم پایین اوردم ولی جواب مناسبی نکردم...گفتم شاید باید خروجی هام رو نرمال کنم که البته این کار هم فایده ای نداشت...ممنون میشم اگر به کد نگاه کنید و یک راه بهم پیشنهاد بدید چون خودم راه دیگه ای به ذهنم نمیاد...

      دیدگاه


        #4
        پاسخ : کمک برای بهینه کردن کد

        با سلام
        در مورد برنامه ای که گذاشتید من پیشنهادی ندارم تا به خطای کمتری دست پیدا کنید.
        ولی سئوالی داشتم.

        چرا زمان ساخت شبکه از تابع minmax استفاده کردید؟ اگر نگاهی به Help متلب برای تابع newff بفرمایید، مطلبی در مورد مینیمم و ماکزیمم ورودی گفته نشده است، شاید هم این یک روش دیگری است که من اطلاعی از آن ندارم و اگر این طور است لطفاً من رو راهنمایی کنید.

        حال اگر به روش خود Help متلب شبکه را بسازید. همانند خط زیر، ملاحظه می کنید که خطا در زمان آموزش با خطا در زمان تست تفاوت چندانی نمی کند. که این نشان می دهد شبکه خوب آموزش دیده است.
        لطفاً به جای خطوط 35 تا 40 از کدهای زیر استفاده کنید.

        net=newff(x,y,[32 64 32 16],{'logsig','logsig','logs ig','logsig','purelin'},& #039;trainscg'
        net.trainParam.mc=0.9;
        net.trainParam.max_fail=40;

        البته خطا در هر دو حالت Test و Trainبنا به ملاک برنامه ای که نوشته اید زیاد است.

        من برنامه را برای حالت دوم خروجی که گفتید خوب کار می کنه، هم امتحان کردم و اگر در انتخاب خروجی دوم( سطر ششم برای train و سطر 12 برای test) اشتباه نکرده باشم، خطا از روی نموداری که در انتها رسم می شود برای تست 17% و برای Train 0.4% بود که فکر می کنم با حالت قبلی خروجی، که خطا در تست حدود 27% می باشد خیلی تفاوت نمی کنه. منظورم این است که خطا به هر حال زیاده.

        ولی اگر از این روش که خود متلب گفته شبکه را بسازید، اولاً که خیلی سریع شبکه همگرا می شود، حدوداً بعد از 70-- 80 Epoch ، ولی همانطور که گفتم خطا در دو حالت Test و Train زیاد است.
        نکته ای که به ذهنم می رسد این است که هم برای Train و هم برای Test باید از Sample های بیشتری استفاده کرد. به عنوان مثال شما برای Test از 10 نمونه استفاده کرده اید که اگر تنها یکی از نمونه ها درست پیش بینی نشود، 10% خطا خواهیم داشت. اگر در این مورد هم اشتباه می کنم بفرمایید، چون من خودم برای یک شبکه پیش بین که در پروژه خودم استفاده کردم از حدود 180 هزار ورودی استفاده کردم. البته من بیشتر دنبال ساخت یک حافظه بودم و این می تواند با برنامه شما فرق کنید.

        و در مورد نرمال سازی: تا جایی که می دانم خود متلب این کار را انجام میدهد و نیاز به نرمال سازی نیست.
        اگر به نتیجه قابل قبولی دست یافتید ما را هم در جریان قرار دهید.
        با تشکر

        جائي در پشت ذهنت به خاطر بسپار، که اثر انگشت خداوند بر همه چيز هست.

        دیدگاه


          #5
          پاسخ : کمک برای بهینه کردن کد

          نوشته اصلی توسط mojtaba_mb

          چرا زمان ساخت شبکه از تابع minmax استفاده کردید؟ اگر نگاهی به Help متلب برای تابع newff بفرمایید، مطلبی در مورد مینیمم و ماکزیمم ورودی گفته نشده است، شاید هم این یک روش دیگری است که من اطلاعی از آن ندارم و اگر این طور است لطفاً من رو راهنمایی کنید.
          از مین ماکس واسه نرمالیزه کردن داده ها استفاده می کنن که باید کل داده ها،بین -1 و 1 باید قرار بگیرن داده ها واسه آموزش.
          انجمن طراحی مدارهای مایکرویو(فرکانس بالا)(http://www.eca.ir/forum2/index.php?board=283.0)
          انجمن شبکه های عصبی(http://www.eca.ir/forum2/index.php?board=207.0)
          *****

          دیدگاه


            #6
            پاسخ : کمک برای بهینه کردن کد

            نوشته اصلی توسط mojtaba_mb
            با سلام
            در مورد برنامه ای که گذاشتید من پیشنهادی ندارم تا به خطای کمتری دست پیدا کنید.
            ولی سئوالی داشتم.

            چرا زمان ساخت شبکه از تابع minmax استفاده کردید؟ اگر نگاهی به Help متلب برای تابع newff بفرمایید، مطلبی در مورد مینیمم و ماکزیمم ورودی گفته نشده است، شاید هم این یک روش دیگری است که من اطلاعی از آن ندارم و اگر این طور است لطفاً من رو راهنمایی کنید.

            حال اگر به روش خود Help متلب شبکه را بسازید. همانند خط زیر، ملاحظه می کنید که خطا در زمان آموزش با خطا در زمان تست تفاوت چندانی نمی کند. که این نشان می دهد شبکه خوب آموزش دیده است.
            لطفاً به جای خطوط 35 تا 40 از کدهای زیر استفاده کنید.

            net=newff(x,y,[32 64 32 16],{'logsig','logsig','logs ig','logsig','purelin'},& #039;trainscg'
            net.trainParam.mc=0.9;
            net.trainParam.max_fail=40;

            البته خطا در هر دو حالت Test و Trainبنا به ملاک برنامه ای که نوشته اید زیاد است.

            من برنامه را برای حالت دوم خروجی که گفتید خوب کار می کنه، هم امتحان کردم و اگر در انتخاب خروجی دوم( سطر ششم برای train و سطر 12 برای test) اشتباه نکرده باشم، خطا از روی نموداری که در انتها رسم می شود برای تست 17% و برای Train 0.4% بود که فکر می کنم با حالت قبلی خروجی، که خطا در تست حدود 27% می باشد خیلی تفاوت نمی کنه. منظورم این است که خطا به هر حال زیاده.

            ولی اگر از این روش که خود متلب گفته شبکه را بسازید، اولاً که خیلی سریع شبکه همگرا می شود، حدوداً بعد از 70-- 80 Epoch ، ولی همانطور که گفتم خطا در دو حالت Test و Train زیاد است.
            نکته ای که به ذهنم می رسد این است که هم برای Train و هم برای Test باید از Sample های بیشتری استفاده کرد. به عنوان مثال شما برای Test از 10 نمونه استفاده کرده اید که اگر تنها یکی از نمونه ها درست پیش بینی نشود، 10% خطا خواهیم داشت. اگر در این مورد هم اشتباه می کنم بفرمایید، چون من خودم برای یک شبکه پیش بین که در پروژه خودم استفاده کردم از حدود 180 هزار ورودی استفاده کردم. البته من بیشتر دنبال ساخت یک حافظه بودم و این می تواند با برنامه شما فرق کنید.

            و در مورد نرمال سازی: تا جایی که می دانم خود متلب این کار را انجام میدهد و نیاز به نرمال سازی نیست.
            اگر به نتیجه قابل قبولی دست یافتید ما را هم در جریان قرار دهید.
            با تشکر
            برای من مهم نیست که خطاهای test و train فقط به هم نزدیک بشن...من می خوام حداکثر خطا در مرحله test ده درصد باشه...

            این کدی رو که اینجا گذاشتم فقط برای سطر 5 آموزش و سطر 11 تست نوشته شده...برای سطر 6 و 12 یه برنامه دیگه نوشتم که اون خوب جواب میده...

            در مورد تعداد داده های تست حق با شماست ولی من یک بار با 50 تا داده, یک بار با 100 تا و یک بار هم با 150 تا این کار رو انجام دادم و جواب خیلی فرق نکرد...به نظرم تعداد داده ها کافیه و مشکل از جای دیگه ای هست که فعلا نمی دونم!

            کسی توی همچین شرایطی قرار نگرفته؟...آقای وزیری شما چطور؟

            دیدگاه


              #7
              پاسخ : کمک برای بهینه کردن کد

              پاسخ کلی شما بر مبنای روش سعی و خطا است ،
              ولی به یه نکته دقت کنید ، آیا از شبکه عصبی مناسبی (از لحاظ نوع) برای تخمین سیستم استفاده می کنید ؟

              ببینید نمی دونم تا چه حدی از مفاهیم برق می دونید

              فرض کنید یه سیتمی رو می خواهیم با شبکه عصبی مدل کنید ، آیا این سیتم دینامیک هست یا استاتیک مهمه.

              سیستم دینامیک معمولا تاخیر دارند یا از فیدبک توشون استفاده شده ، شما اگه از شبکه عصبی استاتیک برای مدل کردن سیستم دینامیک استفاده کنید ، جواب مناسبی نمی گیرید.

              حالا اینکه چه جوری شبکه عصبی چند لایه استاتیک و دینامیک میشه ، شما میری راهنمای تولباکس شبکه عصبی متلب رو می خونین تا منظور منو بفهمین.

              انجمن طراحی مدارهای مایکرویو(فرکانس بالا)(http://www.eca.ir/forum2/index.php?board=283.0)
              انجمن شبکه های عصبی(http://www.eca.ir/forum2/index.php?board=207.0)
              *****

              دیدگاه


                #8
                پاسخ : کمک برای بهینه کردن کد

                حدسم درست بود. شبکه ات به شدت فراموخته شده است.
                تعداد داده های آموزش شما برابر است با : 4*120 = 560 یعنی به طور سرانگشتی این داده های آموزش از پس آموزش دادن یک شبکه با 56 وزن برمی آید.
                حال آنکه به حساب من، شبکه ( 2-20-40-4) به طور تقریبی دارای 1000 وزن است. باید یا شبکه ات را حسابی کوچک کنی یا تعداد داده هایت را حسابی افزایش دهی.

                دیدگاه


                  #9
                  پاسخ : کمک برای بهینه کردن کد

                  نوشته اصلی توسط HassanH
                  حدسم درست بود. شبکه ات به شدت فراموخته شده است.
                  تعداد داده های آموزش شما برابر است با : 4*120 = 560 یعنی به طور سرانگشتی این داده های آموزش از پس آموزش دادن یک شبکه با 56 وزن برمی آید.
                  حال آنکه به حساب من، شبکه ( 2-20-40-4) به طور تقریبی دارای 1000 وزن است. باید یا شبکه ات را حسابی کوچک کنی یا تعداد داده هایت را حسابی افزایش دهی.
                  من 140*4 تا داده دارم...شبکه هم 1-20-40 هست...(این دو تا رو اصلاح کن )

                  اینجوری که من متوجه شدم بنابر گفته شما باید تعداد 40 تا یا 20 تا رو کم کنم...آره؟

                  ضمنا من با همین داده ها و یک خروجی دیگه (سطر ششم به جای سطر پنجم) منتها با شبکه 1-20-4 جواب های خوبی گرفتم...(اون خروجی بین 0.88 تا 1.5 بود ولی اینجا بین 10 تا 30 هست...آیا این می تونه تاثیر گذار باشه؟)

                  مقدار پروفرمانس چقدر تاثیر گذاره؟...باید از این کمترش کنم یا نه همین خوبه؟!

                  دیدگاه


                    #10
                    پاسخ : کمک برای بهینه کردن کد

                    اگر لایه خروجی شما نرون های خطی دارد( یادم نیست چی بود) آنگاه لازم نیست خروجیهایت را نرمال کنی ولی اگر نرون هایت سیگمویید است قطعا باید خروجی ها نرمال شوند.
                    خودت گفتی شبکه ات دوتا خروجی داره و تازه 4*40=560. اذیت میکنیها.
                    کارایی را مطلوب مسئله تحمیل میکند. هر چه کوچکتر باشه اپوک های بیشتری احتمالا طول میکشه تا آموخته بشه.

                    دیدگاه


                      #11
                      پاسخ : کمک برای بهینه کردن کد

                      نوشته اصلی توسط HassanH
                      خودت گفتی شبکه ات دوتا خروجی داره و تازه 4*40=560. اذیت میکنیها.
                      آره...ولی کدی که اینجا گذاشتم یک خروجی داره...دو خروجی رو بی خیال شدم...یعنی اومدم واسه هر خروجی یه شبکه در نظر گرفتم...

                      پس راه حل شما اینه که شبکه رو کوچیک کنم؟

                      دیدگاه


                        #12
                        پاسخ : کمک برای بهینه کردن کد

                        یا شبکه را کوچک کن یا داده هایت را زیاد کن.

                        دیدگاه


                          #13
                          پاسخ : کمک برای بهینه کردن کد

                          نوشته اصلی توسط HassanH
                          یا شبکه را کوچک کن یا داده هایت را زیاد کن.
                          هم شبکه رو کوچیک کردم و هم داده ها رو زیاد کردم ( 256 ورودی به جای 140 تا) ولی هیچ تغییری ایجاد نشد!

                          تعجب می کنم که با فراگیر شدن شبکه عصبی و این همه ادعا یک نفر پیدا نمیشه که یه پیشنهاد به درد بخور برای بهبود این شبکه به من بده...توی دو تا فروم داخلی و دو تا فروم خارجی این سوال رو پرسیدم ولی دریغ از یک جواب به درد بخور!...بابا اگر راهنمایی کردن پولیه بگید تا پولش رو بدم!...قول میدم که زیر قولم نزنم!

                          لااقل یکی بگه چطور می تونم داده هام رو بین 0.8 تا 1.5 نرمال کنم شاید بشه یه خاکی به سر این شبکه کرد!

                          دیدگاه


                            #14
                            پاسخ : کمک برای بهینه کردن کد

                            نوشته اصلی توسط mr_ghl
                            تعجب می کنم که با فراگیر شدن شبکه عصبی و این همه ادعا یک نفر پیدا نمیشه که یه پیشنهاد به درد بخور برای بهبود این شبکه به من بده...توی دو تا فروم داخلی و دو تا فروم خارجی این سوال رو پرسیدم ولی دریغ از یک جواب به درد بخور!...بابا اگر راهنمایی کردن پولیه بگید تا پولش رو بدم!...قول میدم که زیر قولم نزنم!
                            سلام دوست گرامی
                            مواظب باشید تا حرف هاتون جنبه بی احترامی به دیگران نداشته باشه.

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

                            اینجانب به عنوان مدیر اجمن شبکه عصبی ، هیچ گونه ادعایی در پاسخ دادن به تمامی پست ها نداشته و ندارم
                            تمام وقتی هم که اینجا صرف شده ، صرفا به خاطر خدمت به بقیه دوستان هست.
                            این همه زمان و انرژی این جا گذاشته شده ، اونقت این جوابشه؟
                            واقعا متاسفم
                            انجمن طراحی مدارهای مایکرویو(فرکانس بالا)(http://www.eca.ir/forum2/index.php?board=283.0)
                            انجمن شبکه های عصبی(http://www.eca.ir/forum2/index.php?board=207.0)
                            *****

                            دیدگاه


                              #15
                              پاسخ : کمک برای بهینه کردن کد

                              نوشته اصلی توسط امیر حسین وزیری
                              سلام دوست گرامی
                              مواظب باشید تا حرف هاتون جنبه بی احترامی به دیگران نداشته باشه.

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

                              اینجانب به عنوان مدیر اجمن شبکه عصبی ، هیچ گونه ادعایی در پاسخ دادن به تمامی پست ها نداشته و ندارم
                              تمام وقتی هم که اینجا صرف شده ، صرفا به خاطر خدمت به بقیه دوستان هست.
                              این همه زمان و انرژی این جا گذاشته شده ، اونقت این جوابشه؟
                              واقعا متاسفم
                              1-چند ماه پیش اطلاعاتی در مورد شبکه عصبی می خواستم که تا پول ندادن گیرم نیومد! گفتم شاید اینجا هم داستان همونه...

                              2-فرمودید این همه وقت گذاشته شده...حق دارید...ولی چه نتیجه ای؟...واقعا جای تعجب نداره که من توی چهار تا فروم این سوال رو مطرح کردن و یک جواب به درد بخور نگرفتم؟!...در حالی که به نظر می رسه سوالم واقعا پیش پا افتاده باشه...این آفت علمه!...ما اصلا حاضر نیستیم برای هم وقت بذاریم...فقط می خوایم با چندتا جواب سروته یه قضیه رو هم بیاریم...واقعا ما برای هم وقت نمی ذاریم...می تونید باور نکنید ولی غیر از این نیست...من کدم رو اینجا گذاشتم ولی الان که رفتم نگاه کردم می بینم نوشته تعداد دانلود : صفر!...یعنی اون سایت مشکل داره؟!

                              3-از قدیم گفتن " کس نخارد پشت من جز ناخن انگشت من"

                              ----

                              نگفتید چجور میشه داده ها رو بین 0.8 و 1.5 نرمال کرد؟

                              دیدگاه

                              لطفا صبر کنید...
                              X