Python初学者,了解一些代码

时间:2016-03-04 22:24:30

标签: python numpy

以下是我正在尝试理解的神经网络神经元的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中使用,这样我可以通过单独调用每一行来获得更好的理解吗?

5 个答案:

答案 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),其中yx为每个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函数构成。