>>Напиши нейронную сеть со скрытым слоем и возможностью обучения на языке программирования 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 ваще от балды забивая на правильную инициализацию переменных и работу с памятью если она используется. Поэтому всё что я получал в нейросетях - неработоспособно без редактирования, если конечно там совсем не околесица