PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » OpenSource » Нейронная сеть написала нейронную сеть


Нейронная сеть написала нейронную сеть

Сообщений 1 страница 2 из 2

1

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

0

2

Код:
Structure Neuron
  weights.f[2]
  bias.f
EndStructure

Structure Layer
  neurons.Neuron[2]
EndStructure

Global inputLayer.Layer
Global hiddenLayer.Layer
Global outputLayer.Neuron

; Инициализация весов и смещений случайными значениями
Procedure InitializeNetwork()
  For i = 0 To 1
    For j = 0 To 1
      inputLayer\neurons[i]\weights[j] = Random(100) / 100.0
    Next
    inputLayer\neurons[i]\bias = Random(100) / 100.0
  Next

  For i = 0 To 1
    For j = 0 To 1
      hiddenLayer\neurons[i]\weights[j] = Random(100) / 100.0
    Next
    hiddenLayer\neurons[i]\bias = Random(100) / 100.0
  Next

  For i = 0 To 1
    outputLayer\weights[i] = Random(100) / 100.0
  Next
  outputLayer\bias = Random(100) / 100.0
EndProcedure

; Функция активации (сигмоида)
Procedure.f Sigmoid(x.f)
  ProcedureReturn 1.0 / (1.0 + Pow(2.71828, -x))
EndProcedure

; Прямое распространение (forward propagation)
Procedure.f ForwardPropagation(input1.f, input2.f)
  Dim hiddenOutput.f(1)

  ; Вычисление выхода скрытого слоя
  For i = 0 To 1
    sum.f = inputLayer\neurons[i]\weights[0] * input1 + inputLayer\neurons[i]\weights[1] * input2 + inputLayer\neurons[i]\bias
    hiddenOutput(i) = Sigmoid(sum)
  Next

  ; Вычисление выхода выходного слоя
  sum.f = outputLayer\weights[0] * hiddenOutput(0) + outputLayer\weights[1] * hiddenOutput(1) + outputLayer\bias
  ProcedureReturn Sigmoid(sum)
EndProcedure

; Обратное распространение (backpropagation)
Procedure BackPropagation(input1.f, input2.f, target.f, learningRate.f = 0.1)
  Dim hiddenOutput.f(1)
  Dim hiddenError.f(1)

  ; Прямое распространение
  For i = 0 To 1
    sum.f = inputLayer\neurons[i]\weights[0] * input1 + inputLayer\neurons[i]\weights[1] * input2 + inputLayer\neurons[i]\bias
    hiddenOutput(i) = Sigmoid(sum)
  Next

  output.f = outputLayer\weights[0] * hiddenOutput(0) + outputLayer\weights[1] * hiddenOutput(1) + outputLayer\bias
  output = Sigmoid(output)

  ; Ошибка выходного слоя
  outputError.f = (target - output) * output * (1 - output)

  ; Ошибка скрытого слоя
  For i = 0 To 1
    hiddenError(i) = outputError * outputLayer\weights[i] * hiddenOutput(i) * (1 - hiddenOutput(i))
  Next

  ; Обновление весов выходного слоя
  For i = 0 To 1
    outputLayer\weights[i] + learningRate * outputError * hiddenOutput(i)
  Next
  outputLayer\bias + learningRate * outputError

  ; Обновление весов скрытого слоя
  For i = 0 To 1
    For j = 0 To 1
      If j=0
        in.f  = input1
      Else
        in  = input2
        EndIf
      inputLayer\neurons[i]\weights[j] + learningRate * hiddenError(i) * in
    Next
    inputLayer\neurons[i]\bias + learningRate * hiddenError(i)
  Next
EndProcedure

; Обучение нейронной сети
Procedure TrainNetwork(epochs, learningRate.f)
  ; Пример данных для обучения (XOR)
  Dim inputs.f(3, 1)
  inputs(0, 0) = 0 : inputs(0, 1) = 0
  inputs(1, 0) = 0 : inputs(1, 1) = 1
  inputs(2, 0) = 1 : inputs(2, 1) = 0
  inputs(3, 0) = 1 : inputs(3, 1) = 1

  Dim targets.f(3)
  targets(0) = 0
  targets(1) = 1
  targets(2) = 1
  targets(3) = 0

  For epoch = 1 To epochs
    For i = 0 To 3
      BackPropagation(inputs(i, 0), inputs(i, 1), targets(i), learningRate)
    Next
  Next
EndProcedure

; Инициализация и обучение сети
InitializeNetwork()
TrainNetwork(10000, 0.1)

; Тестирование сети
Debug "0 XOR 0 = " + StrF(ForwardPropagation(0, 0))
Debug "0 XOR 1 = " + StrF(ForwardPropagation(0, 1))
Debug "1 XOR 0 = " + StrF(ForwardPropagation(1, 0))
Debug "1 XOR 1 = " + StrF(ForwardPropagation(1, 1))

ещё одна написала - я отредактировал и получилось наконец-то

0


Вы здесь » PureBasic - форум » OpenSource » Нейронная сеть написала нейронную сеть