簡體   English   中英

在Excel中編寫ANN:VBA類型不匹配錯誤

[英]Writing an ANN in Excel: VBA Type Mismatch Error

因此,我正在嘗試使用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中執行此操作,這可能就是為什么將其用於科學計算的原因。

無論如何,解決此問題的最佳方法是什么?

不幸的是,VBA不支持對陣列的直接操作。 相反,您必須循環:(

如果您真的想使用VBA進行此操作,則可以查看此CodeReview帖子

如果您想使用Excel來執行此操作,但不能滿足VBA的限制,則可以使用一些Python工具來使用Python編寫Excel。 快速搜索將為您帶來很多收益,包括https://www.xlwings.org/ ,這在我的清單上已經嘗試了太久了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM