Ошибка подтверждения при обучении данных в нейронной сети на python?

У меня есть файл BCICIV1bAF3.dat, который содержит данные. Размер файла 20х1

Это мой код...

В функции newff диапазон, который я выбираю, основывается на Мин / Макс, но я не знаю, как определить другие параметры. Сколько скрытого слоя я хочу и т.д.

import numpy as np
import neurolab as nl

input_data = np.fromfile('BCICIV1bAF3.dat' ,dtype=float)

print(len(input_data))
transformed_input_data = [[x] for x in input_data] # added
print(len(transformed_input_data))
output_data = np.fromfile('test.dat',dtype=float)

transformed_output_data = [[x] for x in output_data] # added

net = nl.net.newff([[-21, -10.5]], [1020, 1])
error = net.train(transformed_input_data, transformed_output_data)
predicted_output = net.sim(input_data)

Входные данные:

-10,5 -91,7 -219,8 -227 -190,8 -218,7 -208,2 -205 -214,3 -202 -211,5 -211,1 -208,2 -212,4 -206 -206,7 -211,5 -210,7 -212 -215,1

Выходные данные:

-5,2 -45,6 -108,6 -112 -94,5 -106,7 -99,6 -98,5 -105,4 -101,2 -106,4 -106,5 -102,4 -105,7 -104 -97,9 -99,5 -101,3 -100,6 -103,7

Ошибка:

Traceback (most recent call last):
  File "NNwork2.py", line 15, in <module>

     error = net.train(transformed_input_data, transformed_output_data)
  File "C:\Python34\lib\site-packages\neurolab\core.py", line 328, in __call__
    assert target.shape[0] == input.shape[0]
AssertionError

Как я могу тренироваться? И имитировать input_data?

Если кто-нибудь мог бы вести... Я буду очень благодарен. Спасибо

1 ответ

Решение

Вы пробовали другие методы обучения? В другом ответе я видел, что это помогло, из-за бага в библиотеке. Доступные методы: train_gd, train_gdm, train_gda, train_gdx, train_rprop, train_bfgs (DEFAULT), train_cg

Вы можете изменить его, позвонив:

net.trainf = nl.train.train_gd

Если бы вы могли предоставить входные данные (даже с измененными значениями), это было бы здорово.

Я попытался вызвать метод поезда для ввода в форму: [0,1,2,3...18,19] и это не удалось - мне пришлось изменить вход (и цель) на [[0],[1],...[18],[19]]

РЕДАКТИРОВАТЬ:

Ваши данные в неправильном формате, вы должны преобразовать их в список списков. У меня нет scipy на моей машине, но попробуйте это:

import numpy as np
import neurolab as nl

input_data = np.fromfile('BCICIV1bAF3.dat' ,dtype=float)
transformed_input_data = [[x] for x in input_data] # added

print(len(transformed_input_data)) # changed
net = nl.net.newff([[-215.1, -10.5]], [20, 1])
error = net.train(transformed_input_data, transformed_input_data, epochs=500) # changed

РЕДАКТИРОВАТЬ 2:

Я не буду объяснять, что такое нейронная сеть (я давно ими не пользовался), но она должна выглядеть так, когда мы хотим преобразовать 3D-ввод в 2D-вывод с использованием 1 скрытого слоя:

INPUT [3D] | HIDDEN LAYER | OUTPUT [2D]
                ----
               | H1 |
                ----
   ----
  | X1 |
   ----
                ----         ----
               | H2 |       | Y1 |
                ----         ----


   ----               
  | X2 |                      
   ----                      

                ----         ----
               | H3 |       | Y2 |
                ----         ----
   ----
  | X3 |
   ----
                ----
               | H4 |
                ----

Каждый X умножается на каждый H, и мы вычисляем выход. Как у нас есть эти значения H? Они вычисляются алгоритмами во время training нейронной сети. Мы указываем, сколько скрытых слоев мы хотим и методом проб и ошибок получаем удовлетворительное решение. Очень важно - мы должны использовать разные данные для обучения и проверки выходов нейронной сети.

Когда мы могли бы использовать эту конкретную сеть? Например, при подсчете количества биг-маков и картофеля фри, заказываемых людьми в McDonald, исходя из возраста, зарплаты клиента и расположения конкретного ресторана. Это будет выглядеть так:

    -----
   | AGE |
    -----
                ----         ----------
               | H2 |       | BIG MACS |
                ----         ----------


   --------               
  | SALARY |                      
   --------                      

                ----         -----------
               | H3 |       |   FRIES   |
                ----         -----------
    -------
   | PLACE |
    -------
                ----
               | H4 |
                ----

Таким образом, мы могли бы сказать, что преобразование выглядит так f([Age, Salary, Place]) = [Big Macs, Fries], У нас могут быть миллионы записей входных и выходных данных, собранных сотрудниками для обучения нашей сети, поэтому перевод на python будет list входов (3D) и мы ожидаем list выходов (2D). Например f([[A_1, S_1, P_1], [A_2, S_2, P_2], ... , [A_N, S_N, P_N]]) -> [[BM_1, F_1], [BM_2, F_2], ... , [BM_N, F_N]]

Мы хотим, чтобы с вашими данными было то же самое, НО мы хотим, чтобы и вход, и выход были 1D, поэтому нам пришлось "обернуть" каждый элемент list в другой list, То же самое с выходом И вводом симуляции - вы забыли это.

predicted_output = net.sim(input_data) # this won't work! You should wrap it

Но тестирование нейронной сети на тренировочных данных просто неправильно - вы не должны этого делать

Другие вопросы по тегам