Написание ANN в Excel: ошибка несоответствия типов VBA - PullRequest
0 голосов
/ 27 ноября 2018

Итак, я пытаюсь запрограммировать базовую искусственную нейронную сеть, используя Excel VBA.В частности, я следовал одному примеру:

https://www.analyticsvidhya.com/blog/2017/05/neural-network-from-scratch-in-python-and-r/

Я основывал код на примере Python в статье (пример кода приведен в конце статьи).К сожалению, у меня нет доступа к Python, поэтому я пытаюсь сделать это с VBA.Я сделал все возможное, чтобы преобразовать код в пригодный для использования формат для Excel, однако есть проблема, с которой я сталкиваюсь, и я не уверен, как ее решить:

Вот мой код VBA:

Sub ANN()
 Dim X(1010, 1011, 101) As Integer 'Input
 Dim Y(1, 1, 0) As Double 'output for comparison
 Dim E(0, 0, 0) As Double 'Error

'Variable Initialization
 Dim Epoch As Long
 Dim LearnRate As Double
 Dim InputLayer_Neurons() As Integer 'Number of Features in data set
 ReDim InputLayer_Neurons(ArrayLen(X))
 Dim HiddenLayer_Neurons As Integer
 Dim Output_Neurons As Integer
 Dim hidden_layer_input1 As Variant
 Dim hidden_layer_input As Variant
 Dim hiddenlayer_activations As Variant
 Dim output_layer_input1 As Variant
 Dim output_layer_input As Variant
 Dim slope_output_layer As Variant
 Dim slope_hidden_layer As Variant
 Dim d_output As Variant
 Dim Output As Variant
 Dim Wh As Double 'Weight Hidden Layer
 Dim Bh As Double 'Bias Hidden Layer
 Dim Wout As Double 'Weight output Layer
 Dim Bout As Double 'Bias Ouput layer
 Dim i As Long
 Epoch = 5000 'Training Iterations
 LearnRate = 0.1 'Learning Rate
 HiddeLayer_Neurons = 3 'Number of Neurons in Hidden Layer
 Output_Neurons = 1 'Number of Neurons at output layer

'Weight & Bias Initialization
 Wh = Application.WorksheetFunction.RandBetween(InputLayer_Neurons, HiddenLayer_Neurons)
 Bh = Application.WorksheetFunction.RandBetween(1, HiddenLayer_Neurons)
 Wout = Application.WorksheetFunction.RandBetween(HiddenLayer_Neurons, Output_Neurons)
 Bout = Application.WorksheetFunction.RandBetween(1, Output_Neurons)

For i = 0 To Epoch

'Forward Propagation
 hidden_layer_input1 = WorksheetFunction.MMult(X, Wh)
 hidden_layer_input = hidden_layer_input1 + Bh
 hiddenlayer_activations = Sigmoid_Activation(hidden_layer_input)
 output_layer_input1 = WorksheetFunction.MMult(hiddenlayer_activations, Wout)
 output_layer_input = output_layer_input1 + Bout
 Output = Derivatives_Sigmoid(output_layer_input)

'Backpropagation
 E = Y - Output
 slope_output_layer = Derivatives_Sigmoid(Output)
 slope_hidden_layer = Derivatives_Sigmoid(hiddenlayer_activations)
 d_output = E * slope_output_layer
 Error_at_hidden_layer = WorksheetFunction.MMult(d_output, Transpose(Wout))
 d_hiddenlayer = Error_at_hidden_layer * slope_hidden_layer
 Wout = Wout + WorksheetFunction.MMult(Transpose(hiddenlayer_activations), d_output) * LearnRate
 Bout = Bout + WorksheetFunction.Sum(d_ouput) * LearnRate
 Wh = Wh + WorksheetFunction.MMult(Transpose(X), d_hiddenlayer) * LearnRate
 Bh = Bh + WorksheetFunction.Sum(d_hiddenlayer) * LearnRate

Next

Debug.Print Output

End Sub

Function Sigmoid_Activation(X) As Variant
 Sigmoid_Activation = 1 / (1 + Application.WorksheetFunction.Power(-X))
 End Function

Function Derivatives_Sigmoid(X) As Double
 Derivatives_Sigmoid = X * (1 - X)
 End Function

Public Function ArrayLen(arr As Variant) As Integer
 ArrayLen = UBound(arr) - LBound(arr) + 1
 End Function

Мой вопрос:

В разделе «Обратное распространение».Я получаю ошибку несоответствия типов в строке:

E = Y – Output

Я полагаю, это потому, что в VBA нет встроенной функции для вычитания значения типа Double (Output) из массива (Y).Несмотря на то, что Output объявлен как вариант, я считаю, что значение, которое он будет содержать, будет содержать значение с плавающей запятой.Я не уверен, является ли это причиной конфликта.Похоже, что вы можете сделать это в Python, однако, вероятно, именно поэтому он используется для научных расчетов.

В любом случае, какой будет лучший способ решить эту проблему?

1 Ответ

0 голосов
/ 27 ноября 2018

К сожалению, VBA не поддерживает прямые операции над массивами.Вместо этого вы должны зациклить :(

Если вы действительно хотите сделать это с VBA, вы можете взглянуть на это CodeReview сообщение .

Если вы хотите это сделатьиспользуя Excel, но не может принять ограничения VBA, есть несколько инструментов Python, позволяющих программировать Excel с использованием Python. Быстрый поиск поможет вам, включая https://www.xlwings.org/, который был в моем списке вещейслишком долго пытаться .

...