以下是我正在尝试理解的神经网络神经元的Python表示
SparkContext.union
这是我目前的理解:
class Network(object):
def __init__(self, sizes):
self.num_layers = len(sizes)
self.sizes = sizes
self.biases = [np.random.randn(y, 1) for y in sizes[1:]]
self.weights = [np.random.randn(y, x)
for x, y in zip(sizes[:-1], sizes[1:])]
:返回尺寸self.num_layers = len(sizes)
:将自我实例大小分配给函数参数大小self.sizes = sizes
:从标准正态分布生成一系列元素(由self.biases = sizes
表示)以下线路计算是什么?
np.random.randn(y, 1)
我是Python的新手。这个代码可以在Python shell中使用,这样我可以通过单独调用每一行来获得更好的理解吗?
答案 0 :(得分:7)
zip()
function对每个可迭代的元素配对;例如,zip('foo', 'bar')
会产生[('f', 'b'), ('o', 'a'), ('o', 'r')]
;两个字符串中的每个元素已经配对成三个新元组。
zip(sizes[:-1], sizes[1:])
然后,使用 next 元素在序列sizes
中创建元素对,因为您将除最后一个元素之外的所有元素配对(sizes[:-1]
)除了第一个(sizes[1:]
)之外的所有元素。这将第一个和第二个元素组合在一起,然后是第二个和第三个元素,等等,直到最后两个元素。
对于每个这样的对,使用list comprehension生成随机样本。因此,对于每个x, y
对,生成一个新的二维numpy矩阵,其中随机值分为y
行和x
列。
请注意,biases
值仅使用sizes[1:]
,除第一个之外的所有值,为每个此类大小生成y
- 1个矩阵。
这些概念的快速演示:
>>> zip('foo', 'bar')
[('f', 'b'), ('o', 'a'), ('o', 'r')]
>>> zip('foo', 'bar', 'baz') # you can add more sequences
[('f', 'b', 'b'), ('o', 'a', 'a'), ('o', 'r', 'z')]
>>> sizes = [5, 12, 18, 23, 42]
>>> zip(sizes[:-1], sizes[1:]) # a sliding window of pairs
[(5, 12), (12, 18), (18, 23), (23, 42)]
# 0, 1 .. 1, 2 .. 2, 3 .. 3, 4 element indices into sizes
>>>
答案 1 :(得分:1)
< 0 means string is lexicographically smaller than otherString (for example: "Apple" would be smaller than "Banana")
= 0 means it's the exact same word
> 0 means string is bigger than otherString (for example: "Banana" would be bigger than "Apple")
将使用参数x,y调用randn函数,这些参数是操作的结果self.weights = [np.random.randn(y, x) for x, y in zip(sizes[:-1], sizes[1:])]
如果我们考虑一个列表zip(sizes[:-1], sizes[1:])
l=[1, 2, 3, 4]
将返回l[:-1]
并[1, 2, 3]
将l[1]
[2, 3, 4]
上的zip操作会生成对l[:-1], l[1]
。然后,这些对将被传输到randn函数
当然,你总是可以在python shell中输入代码,它会让你更好地理解;)
答案 2 :(得分:1)
这就是所谓的list comprehension。如果使用普通for
循环,则可以创建相同的效果:
self.weights = []
for x, y in zip(sizes[:-1], sizes[1:]):
self.weights.append(np.random.randn(y, x))
现在有了这个循环,您可以看到self.weights
实际上只是一堆np.random.randn(y, x)
,其中y
和x
为每个x
定义}和y
中的zip(sizes[:-1], sizes[1:])
。您可以在阅读列表理解时对自己说:self.weights = [np.random.randn(y, x)) for x, y in zip(sizes[:-1], sizes[1:])]
。字顺序终于有意义了。如果您不知道,zip是一个函数,它返回其参数中每个对应元素的元组列表。例如,zip([1, 2, 3, 4], [4, 3, 2, 1])
将返回[(1, 4), (2, 3), (3, 2), (4, 1)]
。 (在Python3中,实际上它是元组的生成器)
答案 3 :(得分:1)
如果你了解C ++,这里是我做的self.weights = [np.random.randn(y, x) for x, y in zip(sizes[:-1], sizes[1:])]
到C ++的转换。它使用Eigen C ++库而不是Numpy Python库。您可以通过在main()中键入Weights(weights, sizes);
来调用它。函数权重的参数包括矩阵的传递列表(权重)和向量(大小)。通过引用传递,标记为&#39;&amp;&#39;,基本上意味着权重值将在函数和主循环中发生变化。这与传递值不同,因为按值传递只会更改函数中权重的值。如果您要完全复制此内容,则需要输入#include <list>
,#include<Eigen/Dense>
,using namespace std;
和using namespace Eigen;
。
void Weights(list<MatrixXd> &weights, VectorXi sizes){
int x,y;
for(int i=0; i < sizes.rows()-1;i++){
y=sizes[i+1]; //sizes[1:]
x=sizes[i]; //sizes[:-1]
weights.push_back(MatrixXd::Random(y,x)); //np.random.randn(y,x)
}
}
答案 4 :(得分:0)
这实际上创建了两个随机变量x和y。一个用于从第一层到第二层神经元的连接。和其他第二层神经元输出神经元层。 sizes(-1)表示向量中除最后一个之外的所有连接,即第一层到隐藏层权重。和size(1)是向量中除第一个元素之外的所有连接。这是从隐藏到输出层的连接的权重。
注意:连接或元组由ZIP函数构成。