2016-08-15 2 views
0

Я не знаю, как установить локализацию каждого нейрона на карте. Это нейрон и карта:Распознавание речи с использованием сети kohonen с функциями MFCC. Как я установил расстояние между нейронами и их весами?

typedef struct _neuron 
{ 
    mfcc_frame *frames; 
    char *name; 
    double *weights; 
    int num_weights; 
    int x; 
    int y; 
} neuron; 
typedef struct _map 
{ 
neuron *lattice; 
    int latice_size; 
    double mapRadius; 
    int sideX, sideY; 
    int scale; 
} map; 

Если у меня есть еще одно слово, равное, как вычислить расстояние между входом шаблона (слово) и мой нейрон.

Я не уверен в весе. Я определяю весы как количество функций mfcc слова, но при обучении мне нужно обновить этот вес в соответствии с расстоянием между нейронами. Я использую евклидовое расстояние между нейронами. Но сомнения в том, как обновить веса. Вот код инициализации карты и нейроны

void init_neuron(neuron *n, int x, int y, mfcc_frame *mfcc_frames, unsigned int n_frames, char *name){ 

double r; 
register int i, j; 
n->frames = mfcc_frames; 
n->num_weights = n_frames; 
n->x = x; 
n->y = y; 

n->name = malloc (strlen(name) * sizeof(char)); 
strcpy(n->name, name); 
n->weights= malloc (n_frames * sizeof (double)); 

for(i = 0; i < n_frames; i++) 
    for(j = 0; j < N_MFCC; j++) 
     n->weights[i] = mfcc_frames[i].features[j]; 

printf("%s lattice %d, %d\n", n->name, n->x, n->y); 

}

INIT карта:

map* init_map(int sideX, int sideY, int scale){ 
register int i, x, y; 
char *name = NULL; 
void **word_adresses; 
unsigned int n = 0, count = 0; 
int aux = 0; 
word *words = malloc(sizeof(word)); 

map *_map = malloc(sizeof(map)); 
_map->latice_size = sideX * sideY; 
_map->sideX  = sideX; 
_map->sideY  = sideY; 
_map->scale  = scale; 
_map->lattice  = malloc(_map->latice_size * sizeof(neuron)); 
mt_seed(); 

if ((n = get_list(words))){ 
    word_adresses = malloc(n * sizeof(void *)); 
    while (words != NULL){ 
     x = mt_rand() %sideX; 
     y = mt_rand() %sideY; 
     printf("y : %d x: %d\n", y, x); 
     init_neuron(_map->lattice + y * sideX + x, x, y, words->frames, words->n, words->name); 

     word_adresses[count++] = words;  
     words = words->next; 
    } 
    for (i = 0; i < count; i++) 
     free(word_adresses[i]); 
    free(word_adresses); 
    aux++; 
} 

return _map; 

}

+0

Прошу прощения, это не совсем понятно, о чем вы спрашиваете. Пожалуйста, объясните свой вопрос лучше. –

ответ

0

В Кохонена SOM, веса в художественном пространстве, так что означает, что каждый нейрон содержит один вектор прототипа. Если на входе 12 MFCC, каждый вход может выглядеть как вектор из 12 двойных значений, поэтому каждый нейрон имеет 12 значений, по одному для каждого из MFCC. Учитывая вход, вы найдете наилучшее совпадение, затем переместите 12 значений кодовой книги для этого нейрона в сторону вектора ввода небольшим количеством, которое основано на скорости обучения.

Смежные вопросы