В основном я знаю понятие нейронной сети и каково это, но я не могу выяснить, как это смотрит при кодировании его или как делают Вы храните данные, я прошел много учебных руководств, которые я нашел на Google, но не мог найти часть кода, просто понятия и алгоритмы.
Может любой давать мне часть кода простой нейронной сети что-то как "Привет Мир!"?
У AI-Junkie есть отличный учебник по (A) NN , и у них есть код, размещенный там .
Вот нейрон (от ai-junkie):
struct SNeuron
{
//the number of inputs into the neuron
int m_NumInputs;
//the weights for each input
vector<double> m_vecWeight;
//ctor
SNeuron(int NumInputs);
};
Вот нейронный слой (ai-junkie):
struct SNeuronLayer
{
//the number of neurons in this layer
int m_NumNeurons;
//the layer of neurons
vector<SNeuron> m_vecNeurons;
SNeuronLayer(int NumNeurons, int NumInputsPerNeuron);
};
Как я уже упоминал ранее ... вы можете найти весь код с ai-junkie (A) NN учебник.
Это руководство программиста NUPIC .NuPIC - это структура для реализации их теории (HTM), основанная на структуре и работе неокортекса
. Так они определяют HTM
Технология HTM имеет потенциал для решения многих сложных проблем в машинном обучении, логических выводах и прогнозировании. . Некоторые из областей применения, которые мы изучаем вместе с нашими клиентами, включают в себя распознавание объектов на изображениях, распознавание поведения в видео, определение пола говорящего, прогнозирование моделей трафика, выполнение оптического распознавания символов в беспорядочном тексте, оценка медицинских изображений и прогнозирование шаблонов щелчков мышью. В интернете.
это простая сеть с номером 1.5
from nupic.network import *
from nupic.network.simpledatainterface import WideDataInterface
def TheNet():
net=SimpleHTM(
levelParams=[
{ # Level 0
},
{ # Level 1
'levelSize': 8, 'bottomUpOut': 8,
'spatialPoolerAlgorithm': 'gaussian',
'sigma': 0.4, 'maxDistance': 0.05,
'symmetricTime': True, 'transitionMemory': 1,
'topNeighbors': 2, 'maxGroupSize': 1024,
'temporalPoolerAlgorithm': 'sumProp'
},
{ # Level 2
'levelSize': 4, 'bottomUpOut': 4,
'spatialPoolerAlgorithm': 'product',
'symmetricTime': True, 'transitionMemory': 1,
'topNeighbors': 2, 'maxGroupSize': 1024,
'temporalPoolerAlgorithm': 'sumProp'
},
{ # Level 3
'levelSize': 1,
'spatialPoolerAlgorithm': 'product',
'mapperAlgorithm': 'sumProp'
},],)
Data=WideDataInterface('Datos/__Categorias__.txt', 'Datos/Datos_Entrenamiento%d.txt', numDataFiles = 8)#
net.createNetwork(Data)
net.train(Datos)
if __name__ == '__main__':
print "Creating HTM Net..."
TheNet()
Вы сказали, что уже знакомы с нейронными сетями, но поскольку существует много разных типов нейронных сетей разной сложности (сверточные, хеббианские, карты Кохонена и т. Д.), Я пойду снова через простую нейронную сеть с прямой связью, просто чтобы убедиться, что мы находимся на одной странице.
Базовая нейронная сеть состоит из следующих элементов
Нейроны имеют значение активации . Когда вы оцениваете сеть, активация входных узлов устанавливается на фактический вход. Ссылки от входных узлов ведут к узлам, более близким к выходным, обычно к одному или нескольким слоям скрытых узлов. В каждом нейроне активация входа обрабатывается с помощью функции активации .Могут использоваться разные функции активации, а иногда они даже различаются в нейронах одной сети.
Функция активации обрабатывает активацию нейрона в свой выходной сигнал. В ранних экспериментах обычно использовалась простая пороговая функция (т.е. активация> 0,5? 1: 0), в настоящее время часто используется сигмовидная функция .
Выходные данные функции активации затем распространяются по ссылкам на следующие узлы. Каждая ссылка имеет соответствующий вес, который она применяет к входным данным.
Наконец, выходной сигнал сети извлекается из активации выходного нейрона (ов).
Я собрал очень простой (и очень многословный ...) пример здесь . Он написан на Ruby и вычисляет AND, что очень просто.
Более сложный вопрос - как на самом деле создать сеть, которая будет делать что-то полезное. Тривиальная сеть из примера была создана вручную, но это невозможно с более сложными задачами. Я знаю два подхода, наиболее распространенным из которых является обратное распространение ошибки . Реже используется нейроэволюция , где веса связей определяются с использованием генетического алгоритма.
В основном нужен объект, представляющий один нейрон с корриспективными ассоциациями с другими нейронами (представляющими синапсы) и их весами.
Один нейрон в типичном языке ООП будет чем-то вроде
class Synapse
{
Neuron sending;
Neuron receiving;
float weight;
}
class Neuron
{
ArrayList<Synapse> toSynapses;
ArrayList<Synapse> fromSynapses;
Function threshold;
}
, где threshold
представляет собой функцию, которая применяется к взвешенной сумме входов, чтобы увидеть, активирует ли нейрон себя и распространяет ли сигнал.
Конечно, тогда вам понадобится конкретный алгоритм для прямой сети или обратного распространения обучения, которое будет работать с этой структурой данных.
Самая простая вещь, которую вы могли бы начать реализовывать, это простой персептрон, вы можете найти некоторую информацию здесь.