Nöral ağlar. Uzmanlar için sorular. - sayfa 21

 
alsu :

4) ağırlık başlatma parametreleri - değerlerin dağılım şekli ve dağılımları.

Bulundu. Terazilerin başlatma parametrelerini ayarlamak mümkündür.

Varsayılanları kullandım gibi görünüyor.


 
LeoV :
Kısa süreli ileri eğitim kursları "Yapay sinir ağları
ve genetik algoritmalar"

Kısa süreli kurslar için başvurular kapandı
"Yapay sinir ağları ve genetik algoritmalar" yeterliliği,
Moskova Ek Eğitim Fakültesi tarafından yürütülen
Devlet Üniversitesi. Nükleer Araştırma Enstitüsü temelinde M.V. Lomonosov
Moskova Devlet Üniversitesi fiziği. Moskova Devlet Üniversitesi derslerinden mezun olanlara devlet sertifikası verilir.
ileri eğitim için örnek.
Dersler haftada iki kez akşam 19-00 arasında yapılacaktır.
25 Şubat 2011 Derslerin Başlangıcı

Daha fazla bilgi için kurs programını görüntüleyin ve
Kurslara şu adresten başvurabilirsiniz:
http://www.neuroproject.ru/kpk.php
Affedersiniz, bu bir reklam mı yoksa orada kendi başınıza mı çalışacaksınız?
 
lasso :

Bulundu. Terazilerin başlatma parametrelerini ayarlamak mümkündür.

Varsayılanları kullandım gibi görünüyor.


Pekala, burada neler olduğu açık görünüyor.

Görevinize dayanarak (anladığım kadarıyla, iki sınıfa ayırmak istediğiniz tek boyutlu verileriniz var), o zaman özü, girdi değerleri kümesinde (sadece bir tane!), En uygun şekilde bir nokta bulmaktır. belirtilen bölümü üretir. Diyelim ki bunun için ağı 1-7-1 aldınız. Bu ağda, ağırlık sayısı 21'dir (gizli katman için yedi giriş, onun için yedi önyargı ve çıkış nöronu için yedi giriş). 21 değişken seçerken bir nokta bulmaya çalıştığımız ortaya çıktı. Yirmi bire bir gibi bir fazlalık ile, ağ okumalarının böyle dans etmesi şaşırtıcı değildir - ilk ağırlıklardaki en küçük bir fark, eğitimden sonra çıktıların önemli bir şekilde yayılmasına yol açar. Kabaca, görevin ağ için çok basit olduğu ortaya çıkıyor, ancak bunu bilmediği için orada olmayan bir şeyi arıyor. Resmi olarak, bu belki de yeniden eğitim olarak adlandırılabilir, ancak aslında - serçelere bir top ateşlemek.

Açıkça söylemek gerekirse, tek boyutlu verileri iki sınıfa ayırma görevi, bir girdi ağırlığı ve bir önyargı ile tek bir nöron tarafından başarıyla gerçekleştirilir.

 
lasso :

Ve ilerisi. Gerçek ağ çıktılarının aralığının "darlığı" beni endişelendiriyor. Açıklamama izin ver:

-- MLP ağı 1-7-1

-- sinir ağının girişlerine verilen değerler [0;1] aralığında düzgün bir şekilde dağıtılır, eğitim örneklerinde çıktılar 1 ve -1 değerleri ile temsil edilir.

Eğitimden sonra, tüm giriş değerleri aralığı ağ üzerinden çalıştırılırsa, ağ çıkışlarının çok dar bir aralıkta olduğunu göreceğiz. Örneğin:

opt_max_act= -0.50401336 opt_min_act= -0.50973881 adım=0.0000286272901034

ya da öyle

opt_max_real= -0.99997914 opt_min_real= -0.99999908 adım=0.00000010

................................................

Bu doğru mu, değil mi?


Doğruluğunu söylemek zor ... duruma göre değişir

Örneğinize göre:

Bu durum, ilk ağın tüm girdilerde "bilmiyorum" dediği ve ikincisinin aynı girdilerde "sınıf -1" dediği anlamına gelir. Veriler aynıysa ve farklılıklar yalnızca ağırlıkların başlatılmasındaysa, büyük olasılıkla sorun sınıfların güçlü bir şekilde karıştırılmasındadır, bu nedenle ızgaralar öğrenme modelini mantıklı bir şekilde ayrıştıramaz ve sonuç olarak, "rastgele" hareket et. Bunun nasıl olabileceğinden bahsetmişken, ağda önyargılı nöronlar kullanılıyorsa (muhtemelen durum budur), o zaman ızgaranın tüm bilgi girişlerinin ağırlıklarını sıfırladığını ve analiz için yalnızca önyargı bıraktığını varsayıyorum. "Analiz", elbette, sadece nominal olduğu ortaya çıkıyor, ağ bir devekuşu prensibi üzerinde çalışıyor - sadece girdileri görmüyor. Bunu doğrulamak veya çürütmek için eğitilmiş ağın matrislerini görmeniz gerekir.

 

"İstatistikler" tarafından oluşturulan MLP NS kodu:

 /* ------------------------------------------------------------------------- */


#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

#ifndef FALSE
#define FALSE 0
#define TRUE 1
#endif

#define MENUCODE - 999


static double NNCode38Thresholds[] =
{

/* layer 1 */
- 0.78576109762088242 , - 0.23216582173469763 , - 1.6708808507320108 , - 1.525614113040888 ,
1.4153558659332133 , - 0.77276960668316319 , 2.3600992937381298 , 2.473963708568014 ,
- 0.43422405325901231 , 0.68546943611132893 , 0.19836417975077064 , 0.26461366779934564 ,
- 0.19131682804149783 , 0.24687125804149584 , - 0.95588612620053504 , 0.25329560565058901 ,
- 1.0054817062488075 , 1.3224622867600988 , 0.88115523574528376 , 0.32309684489223067 ,
0.52538428519764313 ,

/* layer 2 */
- 1.8292886608617505

};

static double NNCode38Weights[] =
{

/* layer 1 */
1.8660729426318707 ,
1.3727568288578245 ,
3.1175074758006374 ,
3.356836518157698 ,
3.2574311486418068 ,
3.2774957848884769 ,
1.4284147042568165 ,
3.534875314491805 ,
2.4874577673065557 ,
2.1516346524000403 ,
1.9692127720516106 ,
4.3440737376517129 ,
2.7850179803408932 ,
- 12.654434243399631 ,
2.4850018642785399 ,
2.1683631515554227 ,
1.77850226182071 ,
2.1342779960924272 ,
2.8753050022428206 ,
3.9464397902669828 ,
2.5227540467556553 ,

/* layer 2 */
- 0.041641949353302246 , - 0.099151657230575702 , 0.19915689162090328 , - 0.48586373846026099 ,
- 0.091916813099494746 , - 0.16863091580772138 , - 0.11592356639654273 , - 0.55874391921850786 ,
0.12335845466035589 , - 0.022300206392803789 , - 0.083342117374385544 , 1.550222748978116 ,
0.10305706982775611 , 3.9280003726494575 , 0.12771097131123971 , - 0.12144621860368633 ,
- 0.40427171889553365 , - 0.072652508364580259 , 0.20641498115269669 , 0.1519896468808962 ,
0.69632055946019444

};

static double NNCode38Acts[ 46 ];

/* ---------------------------------------------------------- */
/*
  NNCode38Run - run neural network NNCode38

  Input and Output variables.
  Variable names are listed below in order, together with each
  variable's offset in the data set at the time code was
  generated (if the variable is then available).
  For nominal variables, the numeric code - class name
  conversion is shown indented below the variable name.
  To provide nominal inputs, use the corresponding numeric code.
  Input variables (Offset):
  stoch

  Выход:
  res
    1=1
    2=-1

*/
/* ---------------------------------------------------------- */

void NNCode38Run( double inputs[], double outputs[], int outputType )
{
   int i, j, k, u;
   double *w = NNCode38Weights, *t = NNCode38Thresholds;

   /* Process inputs - apply pre-processing to each input in turn,
   * storing results in the neuron activations array.
   */

   /* Input 0: standard numeric pre-processing: linear shift and scale. */
   if ( inputs[ 0 ] == - 9999 )
    NNCode38Acts[ 0 ] = 0.48882189239332069 ;
   else
    NNCode38Acts[ 0 ] = inputs[ 0 ] * 1.0204081632653061 + 0 ;

   /*
   * Process layer 1.
   */

   /* For each unit in turn */
   for ( u= 0 ; u < 21 ; ++u )
  {
     /*
     * First, calculate post-synaptic potentials, storing
     * these in the NNCode38Acts array.
     */

     /* Initialise hidden unit activation to zero */
    NNCode38Acts[ 1 +u] = 0.0 ;

     /* Accumulate weighted sum from inputs */
     for ( i= 0 ; i < 1 ; ++i )
      NNCode38Acts[ 1 +u] += *w++ * NNCode38Acts[ 0 +i];

     /* Subtract threshold */
    NNCode38Acts[ 1 +u] -= *t++;

     /* Now apply the logistic activation function, 1 / ( 1 + e^-x ).
     * Deal with overflow and underflow
     */
     if ( NNCode38Acts[ 1 +u] > 100.0 )
       NNCode38Acts[ 1 +u] = 1.0 ;
     else if ( NNCode38Acts[ 1 +u] < - 100.0 )
      NNCode38Acts[ 1 +u] = 0.0 ;
     else
      NNCode38Acts[ 1 +u] = 1.0 / ( 1.0 + exp ( - NNCode38Acts[ 1 +u] ) );
  }

   /*
   * Process layer 2.
   */

   /* For each unit in turn */
   for ( u= 0 ; u < 1 ; ++u )
  {
     /*
     * First, calculate post-synaptic potentials, storing
     * these in the NNCode38Acts array.
     */

     /* Initialise hidden unit activation to zero */
    NNCode38Acts[ 22 +u] = 0.0 ;

     /* Accumulate weighted sum from inputs */
     for ( i= 0 ; i < 21 ; ++i )
      NNCode38Acts[ 22 +u] += *w++ * NNCode38Acts[ 1 +i];

     /* Subtract threshold */
    NNCode38Acts[ 22 +u] -= *t++;

     /* Now calculate negative exponential of PSP
     */
     if ( NNCode38Acts[ 22 +u] > 100.0 )
       NNCode38Acts[ 22 +u] = 0.0 ;
     else
      NNCode38Acts[ 22 +u] = exp ( -NNCode38Acts[ 22 +u] );
  }

   /* Type of output required - selected by outputType parameter */
   switch ( outputType )
  {
     /* The usual type is to generate the output variables */
     case 0 :


       /* Post-process output 0, two-state nominal output */
       if ( NNCode38Acts[ 22 ] >= 0.05449452669633785 )
        outputs[ 0 ] = 2.0 ;
       else
        outputs[ 0 ] = 1.0 ;
       break ;

     /* type 1 is activation of output neurons */
     case 1 :
       for ( i= 0 ; i < 1 ; ++i )
        outputs[i] = NNCode38Acts[ 22 +i];
       break ;

     /* type 2 is codebook vector of winning node (lowest actn) 1st hidden layer */
     case 2 :
      {
         int winner= 0 ;
         for ( i= 1 ; i < 21 ; ++i )
           if ( NNCode38Acts[ 1 +i] < NNCode38Acts[ 1 +winner] )
            winner=i;

         for ( i= 0 ; i < 1 ; ++i )
          outputs[i] = NNCode38Weights[ 1 *winner+i];
      }
       break ;

     /* type 3 indicates winning node (lowest actn) in 1st hidden layer */
     case 3 :
      {
         int winner= 0 ;
         for ( i= 1 ; i < 21 ; ++i )
           if ( NNCode38Acts[ 1 +i] < NNCode38Acts[ 1 +winner] )
            winner=i;

        outputs[ 0 ] = winner;
      }
       break ;
  }
}
 
alsu :

Doğruluğunu söylemek zor ... duruma göre değişir

Örneğinize göre:

Bu durum, ilk ağın tüm girdilerde "bilmiyorum" dediği ve ikincisinin aynı girdilerde "sınıf -1" dediği anlamına gelir. Veriler aynıysa ve farklılıklar yalnızca ağırlıkların başlatılmasındaysa, büyük olasılıkla sorun sınıfların güçlü bir şekilde karıştırılmasındadır, bu nedenle ızgaralar öğrenme modelini mantıklı bir şekilde ayrıştıramaz ve sonuç olarak, "rastgele" hareket et. Bunun nasıl olabileceğinden bahsetmişken, ağda önyargılı nöronlar kullanılıyorsa (muhtemelen durum budur), o zaman ızgaranın tüm bilgi girişlerinin ağırlıklarını sıfırladığını ve analiz için yalnızca önyargı bıraktığını varsayıyorum. "Analiz", elbette, sadece nominal olduğu ortaya çıkıyor, ağ bir devekuşu prensibi üzerinde çalışıyor - sadece girdileri görmüyor. Bunu doğrulamak veya çürütmek için eğitilmiş ağın matrislerini görmeniz gerekir.

Ve bir şey daha: FANN'de, gelen katman hariç her katmana gerçekten bir önyargı ofseti uygulanır ...

Ancak "Statistics 6" programının NN paketinin açıklamasında önyargıya benzer bir şey bulamadım.

Ulusal Meclis'te yeni başlayanlar için, tüm bu farklılıklar gerçekten beyni alıyor ...

 

Evet, dediğime çok benziyor, tam tersi. Ağ veriler arasında kayboldu. Dikkat edin - ağın mimarisinden, ilk katmanın tüm ağırlıklarının giriş verilerine göre eşit olarak eşdeğer olduğu ve teorik olarak sıfır civarında eşit olarak dağıtılması gerektiği sonucuna varılır - ancak resimde gördüğünüz gibi, bunlar gizli katmanın nöronlarının doygunluğa girmesi nedeniyle yukarı doğru sürüldü ( lojistik bir aktivasyon fonksiyonunuz var). Aktivasyon eşikleri kaydedilmedi, çünkü. sadece sıfır bölgesinde kaldılar, tıpkı beklendiği gibi, ilkinin söylediğinden hiçbir şey anlamayan çıkış nöronu gibi - ama biz ona ne olduğunu çoktan anladık.


 

Efsanevi!!

Bir diyagram şeklinde ağırlık ve eşik değerleri.

Ve tamamen farklı bir görünüm. Teşekkür ederim.

 
lasso :

"İstatistikler" tarafından oluşturulan MLP NS kodu:

Tünaydın!

Kısaca anlatabilir misiniz , bir programcı yardımıyla Statistica tarafından oluşturulan bir sinir ağı ile bir C dosyasından bir dll dosyasının nasıl derleneceğini öğrenmek mümkün müdür? Demek istediğim, prosedürü bir kez açıklıyorlar, böylece daha sonra şemaya göre kendim yapabilirim. Bu sadece okuldaki Basic'teki programlama seviyesi ve forex için çalışmak için HC modelidir, ancak ağı düzenli olarak güncellemeniz gerekir - oluşturmak için yeni bir dll okuyun. MQL kodunda, her seferinde düzeltmek bir şekilde zordur.

 
alexeymosc :

Tünaydın!

Statistica tarafından oluşturulan bir sinir ağı ile bir C dosyasından bir dll dosyasının nasıl derleneceğini öğrenmek bir programcının yardımıyla mümkün müdür?

İyi geceler!

Bence değil, istisna sadece bu programcı "İstatistik" şirketinin kendisinde çalışmıyorsa))

alexeymosc :

MQL kodunda, her seferinde düzeltmek bir şekilde zordur.

İstatistikte ne tür NS kullanıyorsunuz?

Bir şeyi elinizle düzeltirseniz, bir algoritma vardır, bu yüzden onu otomatikleştirmeniz gerekir ....

................................................

Yukarıda, GA kullanmam önerildi ve tam bugün, joo kütüphanesinin ( UGALib ) yardımıyla, istenen ve kararlı sonucu almayı başardım.

Şimdi bu davayı 4-ku'ya sürükleyeceğim...

Andrey (yazar) alçak yay. Çok umut verici ve esnek bir yön.

...................

Belki bu yönde kazmaya değer?

Neden: