>>Напиши нейронную сеть со скрытым слоем и возможностью обучения на языке программирования PureBasic
>>PureBasic — это язык программирования высокого уровня, который позволяет создавать программы для различных операционных систем, включая Windows, Linux и macOS. Он поддерживает работу с числами с плавающей точкой, массивами и другими структурами данных, но для создания нейронных сетей обычно используются специализированные библиотеки и фреймворки, такие как TensorFlow, PyTorch или Keras.
Тем не менее, мы можем создать простую нейронную сеть с одним скрытым слоем на чистом PureBasic без использования сторонних библиотек. Это будет пример для демонстрации концепции работы нейронной сети, хотя производительность такой реализации может быть ниже, чем у специализированных решений.
EnableExplicit
Structure Neuron
Weights.f()
Bias.f
EndStructure
Structure Layer
Neurons.Neuron()
EndStructure
Structure NeuralNetwork
Layers.Layer()
EndStructure
Procedure InitializeNeuron(NeuronCount)
NewNeuron.Neuron
Dim NewNeuron\Weights.f(NeuronCount - 1)
For i = 0 To NeuronCount - 1
NewNeuron\Weights(i) = Random(f) * 2 - 1 ; инициализация весов случайными значениями от -1 до 1
Next
NewNeuron\Bias = Random(f) * 2 - 1 ; инициализация смещения случайным значением от -1 до 1
ProcedureReturn @NewNeuron
EndProcedure
Procedure InitializeLayer(NeuronCount, InputSize)
NewLayer.Layer
Dim NewLayer\Neurons.Neuron(NeuronCount - 1)
For i = 0 To NeuronCount - 1
NewLayer\Neurons(i) = InitializeNeuron(InputSize)
Next
ProcedureReturn @NewLayer
EndProcedure
Procedure InitializeNetwork(LayerSizes())
NewNetwork.NeuralNetwork
Dim NewNetwork\Layers.Layer(ArraySize(LayerSizes()))
For i = 0 To ArraySize(LayerSizes()) - 1
If i > 0
NewNetwork\Layers(i) = InitializeLayer(LayerSizes(i), LayerSizes(i - 1))
Else
NewNetwork\Layers(i) = InitializeLayer(LayerSizes(i), 1)
EndIf
Next
ProcedureReturn @NewNetwork
EndProcedure
Procedure Sigmoid(x.f)
ProcedureReturn 1 / (1 + Exp(-x))
EndProcedure
Procedure FeedForward(Network.NeuralNetwork, Inputs.f())
Dim Outputs.f(ArraySize(Inputs()))
For i = 0 To ArraySize(Inputs()) - 1
Outputs(i) = Inputs(i)
Next
ForEach Network\Layers()
Dim NewOutputs.f(ArraySize(Network\Layers()\Neurons()))
For j = 0 To ArraySize(NewOutputs())
Sum.f = 0
For k = 0 To ArraySize(Outputs())
Sum + Outputs(k) * Network\Layers()\Neurons(j)\Weights(k)
Next
Sum + Network\Layers()\Neurons(j)\Bias
NewOutputs(j) = Sigmoid(Sum)
Next
Outputs() = NewOutputs()
Next
ProcedureReturn Outputs()
EndProcedure
Procedure MeanSquaredError(Targets.f(), Outputs.f())
Error.f = 0
For i = 0 To ArraySize(Targets()) - 1
Error + Pow(Targets(i) - Outputs(i), 2)
Next
ProcedureReturn Error / ArraySize(Targets())
EndProcedure
Procedure Train(Network.NeuralNetwork, TrainingData.f(,,), Epochs, LearningRate.f)
For e = 1 To Epochs
For i = 0 To ArraySize(TrainingData(), 1) - 1
Outputs.f() = FeedForward(Network, TrainingData(i, 0, #PB_Any))
Errors.f() = TrainingData(i, 1, #PB_Any)()
MSE.f = MeanSquaredError(Errors(), Outputs())
For l = ArraySize(Network\Layers()) - 1 To 0 Step -1
For n = 0 To ArraySize(Network\Layers(l)\Neurons()) - 1
For w = 0 To ArraySize(Network\Layers(l)\Neurons(n)\Weights()) - 1
If l = ArraySize(Network\Layers()) - 1
Gradient.f = (Outputs(n) - Errors(w)) * Outputs(n) * (1 - Outputs(n))
Else
Gradient.f = 0
For m = 0 To ArraySize(Network\Layers(l + 1)\Neurons()) - 1
Gradient + (Network\Layers(l + 1)\Neurons(m)\Weights(n) *
Network\Layers(l + 1)\Neurons(m)\Delta) *
Outputs(n) * (1 - Outputs(n))
Next
EndIf
Network\Layers(l)\Neurons(n)\Weights(w) -= LearningRate * Gradient * Outputs(w)
Next
Network\Layers(l)\Neurons(n)\Bias -= LearningRate * Gradient
Network\Layers(l)\Neurons(n)\Delta = Gradient
Next
Next
Next
Debug "Epoch " + Str(e) + ": MSE = " + StrF(MSE, 6)
Next
EndProcedure
Procedure Main()
Define LayerSizes.i() = {2, 4, 1}
Define Network.NeuralNetwork = InitializeNetwork(LayerSizes())
DataXOR.f(0, 0, #PB_Any) = 0
DataXOR.f(0, 1, #PB_Any) = 0
DataXOR.f(0, 2, #PB_Any) = 0
DataXOR.f(1, 0, #PB_Any) = 1
DataXOR.f(1, 1, #PB_Any) = 0
DataXOR.f(1, 2, #PB_Any) = 1
DataXOR.f(2, 0, #PB_Any) = 0
DataXOR.f(2, 1, #PB_Any) = 1
DataXOR.f(2, 2, #PB_Any) = 1
DataXOR.f(3, 0, #PB_Any) = 1
DataXOR.f(3, 1, #PB_Any) = 1
DataXOR.f(3, 2, #PB_Any) = 0
Train(Network, DataXOR(), 10000, 0.1)
Debug "Testing network:"
Debug "Input: [0, 0], Output: " + StrF(FeedForward(Network, #PB_Arry([0, 0]))(0), 6)
Debug "Input: [1, 0], Output: " + StrF(FeedForward(Network, #PB_Arry([1, 0]))(0), 6)
Debug "Input: [0, 1], Output: " + StrF(FeedForward(Network, #PB_Arry([0, 1]))(0), 6)
Debug "Input: [1, 1], Output: " + StrF(FeedForward(Network, #PB_Arry([1, 1]))(0), 6)
EndProcedure
Main()Объяснение кода:
Структуры:
Neuron: содержит веса и смещение для одного нейрона.
Layer: содержит массив нейронов.
NeuralNetwork: содержит массив слоев.
Инициализация:
InitializeNeuron создает новый нейрон с заданным количеством входов.
InitializeLayer создает слой с заданным количеством нейронов и входов.
InitializeNetwork создает полную нейронную сеть с заданной архитектурой.
Функция активации:
Sigmoid используется в качестве функции активации.
Прямой проход:
FeedForward выполняет прямой проход через сеть, вычисляя выходные значения каждого слоя.
Ошибка:
MeanSquaredError вычисляет среднюю квадратичную ошибку между целевыми и предсказанными значениями.
Обучение:
Train обучает сеть на основе предоставленных данных, используя градиентный спуск.
Тестирование:
В конце программа тестирует обученную сеть на известных данных.
Этот код демонстрирует базовую реализацию нейронной сети на PureBasic. Для реальных задач рекомендуется использовать специализированные библиотеки, так как они обеспечивают лучшую производительность и функциональность.
Я заметил то, что нейросети пишут код на PureBasic ваще от балды забивая на правильную инициализацию переменных и работу с памятью если она используется. Поэтому всё что я получал в нейросетях - неработоспособно без редактирования, если конечно там совсем не околесица