Ошибка подтверждения при обучении данных в нейронной сети на 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
Но тестирование нейронной сети на тренировочных данных просто неправильно - вы не должны этого делать