PDA

View Full Version : مشکل در تبدیل شبکه عصبی از matlab به زبان C



ara_tz
سه شنبه 10 دی 1392, 15:45 عصر
سلام دوستان
من توی متلب یه شبکه عصبی MLP با سه لایه درست کردم که:
لایه اول 9 تا نرون داره و 9 تا ورودی میگیره
لایه دوم 5 تا نرون داره و 9 تا ورودی میگیره
لایه سوم که خروجی میشه 1 نرون با 5 تا ورودی داره
خروجی هر نرون هم تابع tansig هستش.
من اومدم این شبکه رو توی #C شبیه سازی کنم. این کلاس نرون منه:



public class Neuron
{
public Neuron(){}
public Neuron(int SumOfInputs)
{
m_SumOfInputs = SumOfInputs;
}
public double act(double [] Input, double [] weight, double bias)
{
double tmp = bias;
double t;
for (int i = 0; i < m_SumOfInputs; i++)
{
t= (Input * weight);
tmp += t;
}
m_output = 2/ (1 + Math.Exp(-2*tmp))-1 ;

return m_output;
}
public double m_output;
private int m_SumOfInputs;
};


تابع act میاد خروجی نرون رو حساب میکنه.
من وزن ها رو از متلب گرفتم، وزن لایه ورودی با IW وزن لایه های بعدی با LW و همینطور مقدار بایاس رو با b گرفتم از شبکه و توی سی شارپ سیو کردم به صورت آرایه ای از نوع دابل.
اما من هر ورودی که میدم به برنامه اون خروجی که تو متلب میده رو به من نمیده، اعدادش کاملا متفاوته.
این هم کد شبکه عصبی منه که قراره به لایه ها ورودی ها رو بده:



public double Calculate(double[] inputs)
{
double[] ILay_Outputs = new double[9];
double[] HLay_Outputs = new double[5];
//net 1 ,2
//inputLayer acting
ILay_Outputs[0] = InputLayer[0].act(inputs, IW1, Ib[0]);
ILay_Outputs[1] = InputLayer[1].act(inputs, IW2, Ib[1]);
ILay_Outputs[2] = InputLayer[2].act(inputs, IW3, Ib[2]);
ILay_Outputs[3] = InputLayer[3].act(inputs, IW4, Ib[3]);
ILay_Outputs[4] = InputLayer[4].act(inputs, IW5, Ib[4]);
ILay_Outputs[5] = InputLayer[5].act(inputs, IW6, Ib[5]);
ILay_Outputs[6] = InputLayer[6].act(inputs, IW7, Ib[6]);
ILay_Outputs[7] = InputLayer[7].act(inputs, IW8, Ib[7]);
ILay_Outputs[8] = InputLayer[8].act(inputs, IW9, Ib[8]);
//HiddenLayer acting
HLay_Outputs[0] = HiddenLayer[0].act(ILay_Outputs, HW1, Hb[0]);
HLay_Outputs[1] = HiddenLayer[1].act(ILay_Outputs, HW2, Hb[1]);
HLay_Outputs[2] = HiddenLayer[2].act(ILay_Outputs, HW3, Hb[2]);
HLay_Outputs[3] = HiddenLayer[3].act(ILay_Outputs, HW4, Hb[3]);
HLay_Outputs[4] = HiddenLayer[4].act(ILay_Outputs, HW5, Hb[4]);
//OutputLayer acting
OutputLayer.act(HLay_Outputs, OW, Ob);

return OutputLayer.m_output;
}


کسی از شما دوستان میتونه کمکم کنه بخدا دیگه دارم دیونه میشم!
مرسی از همتون

ara_tz
سه شنبه 10 دی 1392, 16:38 عصر
راستی من با یه شبکه با 2 تا لایه و یک ورودی هم تست کردم خروجیشم تابع purelin بود ولی بازم جواب نداد

rahnema1
چهارشنبه 11 دی 1392, 21:06 عصر
راستی من با یه شبکه با 2 تا لایه و یک ورودی هم تست کردم خروجیشم تابع purelin بود ولی بازم جواب نداد

سلام شما دستوری که با اون شبکه را ایجاد و ترین کردی به همراه وزن ها را بذارید اینجا ببینیم چه طوریه

ara_tz
جمعه 13 دی 1392, 10:42 صبح
سلام دوستان
مشکل رو پیدا کردم
توی متلب قبل از اینکه به ورودی ها به شبکه اعمال بشن توی یه سری ضرایبی ضرب میشن که توی فایل mapminmax.m فانکشن applyminmax این کارو میکنه.
و همینطور خروجی نهایی شبکه میره توی فانکشن reverse و بعد خروجی این فانکشن میشه به عنوان خروجی شبکه عصبی.
من اومدم همون تابع ها رو هم توی برنامه C نوشتم و جواب گرفتم.
خیلی خوشحالم که بالاخره داره تموم میشه پروژه ام... :لبخند:

m_nejad
پنج شنبه 24 بهمن 1392, 10:33 صبح
سلام دوستان
مشکل رو پیدا کردم
توی متلب قبل از اینکه به ورودی ها به شبکه اعمال بشن توی یه سری ضرایبی ضرب میشن که توی فایل mapminmax.m فانکشن applyminmax این کارو میکنه.
و همینطور خروجی نهایی شبکه میره توی فانکشن reverse و بعد خروجی این فانکشن میشه به عنوان خروجی شبکه عصبی.
من اومدم همون تابع ها رو هم توی برنامه C نوشتم و جواب گرفتم.
خیلی خوشحالم که بالاخره داره تموم میشه پروژه ام... :لبخند:

سورس در مورد ایجاد شبکه المان با 4 ورودی سری زمانی و 2 خروجی از آنها با پیش بینی مثلا 5 روزه در متلب یا c# میخواستم ترجیحا تعداد لایه ها، نرون ها و توابع انتقال قابل تغییر باشد

بعنوان مثال ورودیها عبارتند از :
1- سری زمانی دمای مخزن1 در هر روز
2- سری زمانی فشار مخزن1 در هر روز
3- سری زمانی دبی جریان سیال در هر روز (که ممکن است در هر روز دیتا وجود نداشته باشد)
4- سری زمانی دمای سیال

خروجی ها:
1- پیش بینی چند روز مثلا 5 روزه فشاز مخزن
2- پیش بینی چند روز مثلا 5 روزه دمای سیال

aliasghar112
چهارشنبه 30 بهمن 1392, 19:09 عصر
با سلام خدمت شما دوست عزیز اگه می تونید من توی این زمینه یک مشکل دارم می تونید کمکم کنید

سلام دوستان
من توی متلب یه شبکه عصبی MLP با سه لایه درست کردم که:
لایه اول 9 تا نرون داره و 9 تا ورودی میگیره
لایه دوم 5 تا نرون داره و 9 تا ورودی میگیره
لایه سوم که خروجی میشه 1 نرون با 5 تا ورودی داره
خروجی هر نرون هم تابع tansig هستش.
من اومدم این شبکه رو توی #C شبیه سازی کنم. این کلاس نرون منه:



public class Neuron
{
public Neuron(){}
public Neuron(int SumOfInputs)
{
m_SumOfInputs = SumOfInputs;
}
public double act(double [] Input, double [] weight, double bias)
{
double tmp = bias;
double t;
for (int i = 0; i < m_SumOfInputs; i++)
{
t= (Input * weight);
tmp += t;
}
m_output = 2/ (1 + Math.Exp(-2*tmp))-1 ;

return m_output;
}
public double m_output;
private int m_SumOfInputs;
};


تابع act میاد خروجی نرون رو حساب میکنه.
من وزن ها رو از متلب گرفتم، وزن لایه ورودی با IW وزن لایه های بعدی با LW و همینطور مقدار بایاس رو با b گرفتم از شبکه و توی سی شارپ سیو کردم به صورت آرایه ای از نوع دابل.
اما من هر ورودی که میدم به برنامه اون خروجی که تو متلب میده رو به من نمیده، اعدادش کاملا متفاوته.
این هم کد شبکه عصبی منه که قراره به لایه ها ورودی ها رو بده:



public double Calculate(double[] inputs)
{
double[] ILay_Outputs = new double[9];
double[] HLay_Outputs = new double[5];
//net 1 ,2
//inputLayer acting
ILay_Outputs[0] = InputLayer[0].act(inputs, IW1, Ib[0]);
ILay_Outputs[1] = InputLayer[1].act(inputs, IW2, Ib[1]);
ILay_Outputs[2] = InputLayer[2].act(inputs, IW3, Ib[2]);
ILay_Outputs[3] = InputLayer[3].act(inputs, IW4, Ib[3]);
ILay_Outputs[4] = InputLayer[4].act(inputs, IW5, Ib[4]);
ILay_Outputs[5] = InputLayer[5].act(inputs, IW6, Ib[5]);
ILay_Outputs[6] = InputLayer[6].act(inputs, IW7, Ib[6]);
ILay_Outputs[7] = InputLayer[7].act(inputs, IW8, Ib[7]);
ILay_Outputs[8] = InputLayer[8].act(inputs, IW9, Ib[8]);
//HiddenLayer acting
HLay_Outputs[0] = HiddenLayer[0].act(ILay_Outputs, HW1, Hb[0]);
HLay_Outputs[1] = HiddenLayer[1].act(ILay_Outputs, HW2, Hb[1]);
HLay_Outputs[2] = HiddenLayer[2].act(ILay_Outputs, HW3, Hb[2]);
HLay_Outputs[3] = HiddenLayer[3].act(ILay_Outputs, HW4, Hb[3]);
HLay_Outputs[4] = HiddenLayer[4].act(ILay_Outputs, HW5, Hb[4]);
//OutputLayer acting
OutputLayer.act(HLay_Outputs, OW, Ob);

return OutputLayer.m_output;
}


کسی از شما دوستان میتونه کمکم کنه بخدا دیگه دارم دیونه میشم!
مرسی از همتون

matcode.ir
پنج شنبه 01 اسفند 1392, 20:45 عصر
دوستان عزیزی که در انجام پروژه های متلب خود دچار مشکل شده اند می توانند برای رفع مشکلات خود به سایت زیر مراجعه کنند:
http://www.matcode.ir