# 第六周 深度学习入门作业 **Repository Path**: Cheney320/CSDN_homework6 ## Basic Information - **Project Name**: 第六周 深度学习入门作业 - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-01-14 - **Last Updated**: 2020-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 作业说明 感知器可以用来解决比较简单的逻辑问题,如逻辑门的设计。 ### 与问题 考虑如下数据表: |编号| $$x_1$$ | $$x_2$$ | $$d$$ | |:-:| :-----: | :-----: | :---: | |1| 0 | 0 | 0 | |2| 1 | 0 | 0 | |3| 0 | 1 | 0 | |4| 1 | 1 | 1 | 可以看出,这里的运算关系是这样的: $$ y = x_1 \land x_2 $$ 那么应该如何找到一组参数使得下面的方程满足表中的数据呢? $$ y = g(w_1x_1+w_2x_2+b) $$ ### 或问题 考虑如下数据表: | 编号 | $$x_1$$ | $$x_2$$ | $$d$$ | | :--: | :-----: | :-----: | :---: | | 1 | 0 | 0 | 0 | | 2 | 1 | 0 | 1 | | 3 | 0 | 1 | 1 | | 4 | 1 | 1 | 1 | 可以看出,这里的运算关系是这样的: $$ y = x_1 \lor x_2 $$ 课程中已经介绍了感知器,本作业要求学员运行下述感知器的代码,感受感知器的运作过程。代码如下: ```python #!/usr/bin/env python3 import numpy as np # 逻辑与数据 samples_and = [ [0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 1], ] # 逻辑或数据 samples_or = [ [0, 0, 0], [1, 0, 1], [0, 1, 1], [1, 1, 1], ] #逻辑异或数据 samples_xor = [ [0, 0, 0], [1, 0, 1], [0, 1, 1], [1, 1, 0], ] def perceptron(samples): w = np.array([1, 2]) b = 0 a = 1 for i in range(10): for j in range(4): x = np.array(samples[j][:2]) y = 1 if np.dot(w, x) + b > 0 else 0 d = np.array(samples[j][2]) delta_b = a*(d-y) delta_w = a*(d-y)*x print('epoch {} sample {} [{} {} {} {} {} {} {}]'.format( i, j, w[0], w[1], b, y, delta_w[0], delta_w[1], delta_b )) w = w + delta_w b = b + delta_b if __name__ == '__main__': print('logical and') perceptron(samples_and) print('logical or') perceptron(samples_or) print('logical xor') perceptron(samples_xor) ``` 请课程学员提供代码运行截图。 代码运行截图中,对训练数据samples_and的训练结果,输出的前半部分如下: ``` logical and epoch 0 sample 0 [1 2 0 0 0 0 0] epoch 0 sample 1 [1 2 0 1 -1 0 -1] epoch 0 sample 2 [0 2 -1 1 0 -1 -1] epoch 0 sample 3 [0 1 -2 0 1 1 1] epoch 1 sample 0 [1 2 -1 0 0 0 0] epoch 1 sample 1 [1 2 -1 0 0 0 0] epoch 1 sample 2 [1 2 -1 1 0 -1 -1] epoch 1 sample 3 [1 1 -2 0 1 1 1] epoch 2 sample 0 [2 2 -1 0 0 0 0] epoch 2 sample 1 [2 2 -1 1 -1 0 -1] epoch 2 sample 2 [1 2 -2 0 0 0 0] epoch 2 sample 3 [1 2 -2 1 0 0 0] epoch 3 sample 0 [1 2 -2 0 0 0 0] epoch 3 sample 1 [1 2 -2 0 0 0 0] epoch 3 sample 2 [1 2 -2 0 0 0 0] epoch 3 sample 3 [1 2 -2 1 0 0 0] ``` 可以看到,最终在epoch2的样本2,3上,参数就已经停止更新了,接下来的epoch3中,参数完全没有更新。 最终得到的参数为$$w_1=1,w_2=2,b=-2$$ 以与问题同样的参数初始化和训练步骤,输出log前半部分应为: ``` logical or epoch 0 sample 0 [1 2 0 0 0 0 0] epoch 0 sample 1 [1 2 0 1 0 0 0] epoch 0 sample 2 [1 2 0 1 0 0 0] epoch 0 sample 3 [1 2 0 1 0 0 0] epoch 1 sample 0 [1 2 0 0 0 0 0] epoch 1 sample 1 [1 2 0 1 0 0 0] epoch 1 sample 2 [1 2 0 1 0 0 0] epoch 1 sample 3 [1 2 0 1 0 0 0] epoch 2 sample 0 [1 2 0 0 0 0 0] epoch 2 sample 1 [1 2 0 1 0 0 0] epoch 2 sample 2 [1 2 0 1 0 0 0] ``` 可以得到 $$w_1=1,w_2=2,b=0$$ 事实上,这里比较巧合,我们初始化使用的参数,正好满足这里的数据。 ### 异或问题 另外,在代码中,其实还提供了一组异或数据。但是,在这里的代码无论怎么写都无法得到满足这组数据的参数。请学员尝试一下,并解释为什么这里的代码无法完成带异或功能的感知器。 # 评判标准 - 正确的log输出 60分。 - 解释为什么这里的感知器代码无法完成异或功能 40分。