DeepLearning:Linear Class解释

class Linear(Node):
    """
    Represents a node that performs a linear transform.
    """
    def __init__(self, X, W, b):
        # The base class (Node) constructor. Weights and bias
        # are treated like inbound nodes.
        Node.__init__(self, [X, W, b])

    def forward(self):
        """
        Performs the math behind a linear transform.
        """
        X = self.inbound_nodes[0].value
        W = self.inbound_nodes[1].value
        b = self.inbound_nodes[2].value
        self.value = np.dot(X, W) + b

    def backward(self):
        """
        Calculates the gradient based on the output values.
        """
        # Initialize a partial for each of the inbound_nodes.
        self.gradients = {n: np.zeros_like(n.value) for n in self.inbound_nodes}
        # Cycle through the outputs. The gradient will change depending
        # on each output, so the gradients are summed over all outputs.
        for n in self.outbound_nodes:
            # Get the partial of the cost with respect to this node.
            grad_cost = n.gradients[self]
            # Set the partial of the loss with respect to this node's inputs.
            self.gradients[self.inbound_nodes[0]] += np.dot(grad_cost, self.inbound_nodes[1].value.T)
            # Set the partial of the loss with respect to this node's weights.
            self.gradients[self.inbound_nodes[1]] += np.dot(self.inbound_nodes[0].value.T, grad_cost)
            # Set the partial of the loss with respect to this node's bias.
            self.gradients[self.inbound_nodes[2]] += np.sum(grad_cost, axis=0, keepdims=False)

1. the loss with respect to inputs
self.gradients[self.inbound_nodes[0]] += np.dot(grad_cost, self.inbound_nodes[1].value.T)
Cost对某个Node的导数(gradient)等于Cost对前面节点导数的乘积。

解释一:

np.dot(grad_cost, self.inbound_nodes[1].value.T)

对于Linear节点来说,有三个输入参数,即inputs, weights, bias分别对应着

self.inbound_nodes[0],self.inbound_nodes[1],self.inbound_nodes[2]

So, each node will pass on the cost gradient to its inbound nodes and each node will get the cost gradient from it’s outbound nodes. Then, for each node we’ll need to calculate a gradient that’s the cost gradient times the gradient of that node with respect to its inputs.

于是Linear对inputs的求导就是weights。所以是grad_cost*weights.grad_cost是Linear输出节点传递进来的变化率。

np.dot(self.inbound_nodes[0].value.T, grad_cost)

同理可推对weights的求导为inputs,于是gradient=grad_cost*inputs

np.sum(grad_cost, axis=0, keepdims=False)

而对于bias,Linear对bias求导恒为1.所以gradient=1*grad_cost

解释二:为何是+=

因为每一个节点将误差传递给每一个输出节点。于是在Backpropagation时,要求出每一个节点的误差,就要将每一份传递出去给输出节点的误差加起来。于是用+=。
于是可以理解为什么要for n in self.outbound_nodes: 目的是为了在每一个节点的输出节点里遍历。
If a node has multiple outgoing nodes, you just sum up the gradients from each node.

注意点一:
要区分Backpropagation 和Gradient Descent是两个步骤,我通过Backpropagation找到gradient,于是找到了变化方向。再通过Gradient Descent来最小化误差。

To find the gradient, you just multiply the gradients for all nodes in front of it going backwards from the cost. This is the idea behind backpropagation. The gradients are passed backwards through the network and used with gradient descent to update the weights and biases.

最终目的是:

Backpropagation只求了导数部分。Gradient Descent则是整个过程。

 

解决defaults::qt-5.6.2-vc14_3

使用conda 安装tensorflow的时候,出现了这个问题,这不是第一次的出现了。上一次出现,我选择重新安装miniconda,问题解决了。这次我决定去解决他!

ERROR conda.core.link:_execute_actions(330): An error occurred while installing package ‘defaults::qt-5.6.2-vc14_3’. UnicodeDecodeError(‘utf-8′, b’\xd2\xd1\xb8\xb4\xd6\xc6 1 \xb8\xf6\xce\xc4\xbc\xfe\xa1\xa3\r\n‘, 0, 1, ‘invalid continuation byte’) Attempting to roll back. UnicodeDecodeError(‘utf-8′, b’\xd2\xd1\xb8\xb4\xd6\xc6 1 \xb8\xf6\xce\xc4\xbc\xfe\xa1\xa3\r\n‘, 0, 1, ‘invalid continuation byte’)

ERROR conda.core.link:_execute_actions(319): An error occurred while installing package ‘defaults::qt-5.6.2-vc9_3’

python | 解决defaults::qt-5.6.2-vc14_3

这两篇都是同一种解决方法,但是当我试着他们的方法的时候,却出现了新的问题,即ModuleNotFoundError: No module named ‘chardet’

于是我直接用conda在root环境下安装chardet

conda install chardet
最后一切搞定,连上面两篇文章的添加内容都不需要~

笔记本升级SSD

电脑莫名其妙总是蓝屏!一气之下,买了固态硬盘。好在主板只有SATA2的接口,所以正好可以省点钱,买低配的SSD。但是也要500大洋,心疼。不过念在学校又发了1000大洋,想想这台12年高考毕业时买的古董,也算焕发第三春了。

大概是大二的时候,升级了内存。加了一条4G内存。这是第二春(ಡωಡ)hiahiahia

没什么事做,尝试用手机发表文章,试试效果。除了屏幕小以外,其他都可以接受。

作为小白,为了选购SSD还特意去看了知乎相关回答,涨了不少知识。

【如何选购固态硬盘?】dyoule:https://www.zhihu.com/question/20369676/answer/99405990?utm_source=com.meizu.notepaper&utm_medium=social (分享自知乎网)

Very9s第二年

很高兴坚持留下来。最近比较忙,所以写的比较少。但是素材准备了很多。等过段时间,整理整理,写出来。

最近为了自己的项目,焦头烂额的。亚历山大~~不想多说了,有机会再写吧~

射频工程师的爱情诗

射频工程师的爱情诗
佚名

我在时域
你在频域
需要经过傅立叶变换
才能发现你的美丽
我把爱的语言调制到星座
通过伪随机序列
载波到到你的频率
并波束赋形到你的接收阵列矩阵
你说我的爱噪声太大
经过层层滤波
原来发现
那是在宇宙开始的时候
我发给你的爱的微波背景辐射
两百年前粗略的论断
催生傅立叶变换不朽的缠绵

继续阅读

最近好忙

下礼拜就要开学了。就剩最后一个礼拜了。感觉这几个礼拜过得好忙啊。既要跟udacity的深度学习课程,还有自己的FPGA项目,这两天又要赶一份产赛的文档,时间不够啊。最蛋疼的是自己的项目进展无比缓慢,很焦急啊~~现在担心能不能在下学期结束前,把项目搞定。同时我也给自己这半年定个小目标,很简单,就两个目标:

  1. 把项目搞定
  2. 把Udacity的DLND拿下

不知道要写些什么了,就这样把~

今天小记:今天路过十中,发现变化好大。

 

深度学习初体会——fast-style-transfer

报了udacity的深度学习纳米学位课,虽然学费对我来说不少,但是想以后为自己就业多拓宽的路子还是咬牙分期付款。这也是第一次花这么多钱网络学习,希望能有所收获,更希望将来就业能多点机会。

这篇主要是第一次体会下深度学习。没有什么技术含量,只不过是记录一下过程罢了。

fast-style-transfer就是模仿名画的风格,把自己的照片转化成同样的风格。GitHub

1.Git clone

继续阅读

开源之前——重新拿起Git

今天终于把我的SDRAM写好了,并验证可以用了。搞定了SDRAM感觉自己的FPGA进了一个水平。于是今晚做了个决定,打算把写好的部分模块分享出来。也玩玩时尚的开源。

有好长时间没有用Git了。所以不得不再回忆下流程。刚好记下来,充充文章数量 ^_^


下载安装什么的就省略了。

首先要生成ssh-key

$ ssh-keygen -t rsa -C "your_email@youremail.com"

继续阅读

写作不易,我真的很忧郁

总是有点感想,但是写下来的时候,却只有几句话。写作真的不容易。要牺牲玩的时间,要静下浮躁的心。尤其放寒假的我,好像没有了束缚,宁愿逛几个小时的草榴,也不愿敲敲键盘写点东西。就算是现在,我也是边写边玩手机。安逸总是舒服的,而做点事总是挣扎的。漫无目的的写,就好像中学时代写800字作文一样痛苦,一点一点地挤。所以今天打算围绕着写文章(见笑,姑且称之为文章吧),来说说其实我也是懂忧郁的。哈哈~

我从初中开始,就偶尔会在深夜写写感想。随便写,想到什么写什么。但是那个晚上,我一定是忧郁的,或者至少是很平静的。最经常的就是感慨感慨时间过的好快,上一次定的目标又没有实现了。那时候我没有手机,不对有一把触屏的山寨手机。但是真的很垃圾,用没多久,写个字都难。

后来到了高中,由于一心想读好书,压力也比较大,所以到后期平均每个月都在某个深夜写感想顺带计划和反思。那个时候写作真的是一个很好的释放压力的方式。不过现在也觉得写作挺释放心灵的。

继续阅读