在Neurolab(神经网络)上实现Matlab的权重和偏差

时间:2015-03-09 19:14:59

标签: python matlab neural-network

我将Matlab中的权重和偏差导出到python中以与neurolab一起使用。我的网络有8个输入,3个输入权重数组,4个分层权重数组和4个输出神经元。这是我第一次这样做,我真的需要帮助来完成它。下面是我的实现和我得到的错误。

import numpy as np
import neurolab as nl

net = nl.net.newff([[0, 1]], [3, 4])
input_w=[[-24.1874,24.1622,0.0755,-0.2521,4.4625,-10.7961,6.2183,0.2680],...]
input_w = np.array(input_w)
input_w = np.reshape(input_w, (8,3))

layer_w=[[-3.7940,-0.0336,-14.9024],......]
layer_w = [np.array(x) for x in (layer_w)]
layer_w = np.reshape(layer_w, (3,4))

input_bias =[0.4747,-1.2475,-1.2470]
bias_2=np.array([-10.9982,1.9692,5.0705,-0.1236])
bias_2 = np.reshape(bias_2, (4))

net.layers[0].np['w'][:] = input_w.
net.layers[1].np['w'][:] = layer_w.
net.layers[1].np['b'][:] = np.array([input_bias])
net.layers[0].np['b'][:] = bias_2

print net.sim([[0.015,0.022,0.0,0.0,0.432,0.647,0.831]])

Traceback (most recent call last):
  File "C:\Python27\neural13.py", line 206, in <module>
    net.layers[0].np['w'][:] = input_w
ValueError: could not broadcast input array from shape (8,3) into shape (3,1)

感谢您的建议,请随时询问您是否需要更多信息。

1 个答案:

答案 0 :(得分:1)

这里有几个问题。

第一个问题是你需要8个输入神经元。为此,您需要newff中的第一个列表长度为8(8个输入中的每个输入的最小值为1分钟和最大值)。所以你最终只有一个输入,而不是8(因此是3x1阵列而不是3x8阵列)。这可以通过改变:

来解决
net = nl.net.newff([[0, 1]], [3, 4])

为:

net = nl.net.newff([[0, 1]]*8, [3, 4])

这是一种较短的写作方式:

net = nl.net.newff([[0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1]], [3, 4])

下一个问题是python使用与matlab不同的维度排序(默认情况下)。因此,具有形状(8,3)的2D阵列将具有numpy的(3,8)形状。所以你所有的重塑都是不必要的。

第三个问题是你将input_bias和bias_2的维度混淆了。我不太了解neurlab,想知道您是想在开始时将[3, 4]更改为[4, 3],还是想要切换偏差。我将假设后者。

最后一个问题是你在net.sim的输入中需要8个元素,但你只有7个元素。

以下是代码的固定版本,假设您将偏差混淆并使用一些虚拟值来填写您遗漏的内容:

import numpy as np
import neurolab as nl

net = nl.net.newff([[0, 1]]*8, [3, 4])

input_w = np.array([[-24.1874,24.1622,0.0755,-0.2521,4.4625,-10.7961,6.2183,0.2680],
                    [-24.1874,24.1622,0.0755,-0.2521,4.4625,-10.7961,6.2183,0.2680],
                    [-24.1874,24.1622,0.0755,-0.2521,4.4625,-10.7961,6.2183,0.2680]])

layer_w = np.array([[-3.7940,-0.0336,-14.9024],
                    [-3.7940,-0.0336,-14.9024],
                    [-3.7940,-0.0336,-14.9024],
                    [-3.7940,-0.0336,-14.9024]])

input_bias = np.array([0.4747,-1.2475,-1.2470])
bias_2 = np.array([-10.9982,1.9692,5.0705,-0.1236])

net.layers[0].np['w'][:] = input_w
net.layers[1].np['w'][:] = layer_w
net.layers[0].np['b'][:] = input_bias
net.layers[1].np['b'][:] = bias_2

print net.sim([[0.015,0.022,0.0,0.0,0.432,0.647,0.831]])