在Excel中编写ANN:VBA类型不匹配错误

时间:2018-11-27 12:16:19

标签: excel vba machine-learning neural-network backpropagation

因此,我正在尝试使用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中没有内置函数可以从数组(Y)中减去Double类型值(Output)。即使Output被声明为变量,我相信它将持有的值将包含一个浮点值。我不确定这是否是冲突的原因。但是,您似乎可以在Python中执行此操作,这可能就是为什么将其用于科学计算的原因。

无论如何,解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

不幸的是,VBA不支持对阵列的直接操作。相反,您必须循环:(

如果您真的想使用VBA进行操作,则可以查看此CodeReview post

如果您想使用Excel来执行此操作,但是不能满足VBA的限制,则可以使用一些Python工具来使用Python编写Excel。快速搜索将为您带来很多收益,其中包括https://www.xlwings.org/,这在我的可以尝试的东西列表中列出的时间过长。