众所周知,硬编码是不行的,没有普适性,没有推广性。这里我们呢采用两个函数,不仅仅是输入图片,然后识别它是一只猫,一个是训练函数(用来接受图片和标签,然后输出模型)另一个是预测函数(接收一个模型,对图片种类进行预测)
CNN——convolutional neural networks
首先来熟悉基本操作:
- 列表:a=[1,2,3,4],查询区间左闭右开。-1代表最后一个元素,-2倒数第二
- 生成字典:a={‘key’:value},切记用冒号,查询用a[‘key’],添加元素用a[‘new_key’]=new_value
- 布尔型:True和False,运算有and、or、 not
- if:判断语句不需要打括号,直接if 判断:回车即可,else:回车
- 循环:for i in …:回车
- 函数:def 函数名():回车,用的时候直接函数名()即可
- 类&Numpy&画图:详见VScode 2020/6/9.py
- 感知机实现:详见VScode 2020/6/10.py
说起来,我半年钱就接触感知机了,只不过是人工智能期末考试的最后一题,没听讲的我哪里知道什么是感知机,,然后就瞎写一通,老师可怜我才给了91辛苦分,如今,恰是搞懂它的时候。
权重和偏置:
w1和w2都是权重;b是偏置
请注意—— 权重和偏置的作用不一样。具体来说,w1和w2是控制输入信号重要性的参数,而偏置则是调整神经元被激活的容易程度的参数(若b=-0.1,则只需要输入信号的加权总和超过0.1,神经元就会被激活;但是如果b=-20.0,则输入信号的加权总和必须超过0.1,神经元才会被激活)
感知机的局限:
这是作为神经网络的起源算法,称为“人工神经元”或“朴素感知机”,接受多个信号,输出一个信号(只有1/0两种取值即“流/不流”)
或门:x1=0,x2=0才输出零,其他都输出1
如果用类似高中线性规划的知识很容易划分,就是——
圈表示0,三角表示1,这条直线正确地将圈和三角分开了。
但是
异或门:仅当x1和x2中地一方为1,才输出1,来看看怎么划分圈和三角
答案是——无法用直线将圈和三角划分这就是感知机的局限所在,它只能表示由一条直线分割的空间。
那么——穷则变!用曲线呗!
但是这样的曲线无法用感知机表示,让人深表遗憾,但是也无需悲观,感知机的绝妙之处在于“叠加层”,下面我们尝试用“叠加层”表示异或门。(上面严格来讲应该是单层感知机无法实现异或门/无法分离非线性空间)
插一句——我一定是疯了,看着深度学习复习着数电,话说,异或门怎么用基本逻辑门表示来着?咦?好像忘了~怪不好意思的
尝试用感知机表示异或门
有一丝丝小激动!真值表放这里,别整错了
来吧!上代码!
import numpy as np
def AND(x1,x2):#与门
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.7
temp = np.sum(x*w)+b
if temp<=0:
return 0
elif temp>0:
return 1
def NAND(x1,x2):#与非门
x = np.array([x1,x2])
w = np.array([-0.5,-0.5])
b = 0.7
temp = np.sum(x*w)+b
if temp<=0:
return 0
elif temp>0:
return 1
def OR(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.2
temp = np.sum(x*w)+b
if temp<=0:
return 0
elif temp>0:
return 1
def XOR(x1,x2):
s1 = NAND(x1,x2)
s2 = OR(x1,x2)
y = AND(s1,s2)
return y
print(XOR(0,0),XOR(1,0),XOR(0,1),XOR(1,1))
用神经元表示,已经初现端倪了!
这里我暂时把它肤浅地理解为函数の嵌套。
前面的与门、或门、与非门都是单层感知机,异或门是我们接触的第一个多层感知机(其实也就2层啦!但是我觉得已经是迈出了不小的一步了)可以解释为“单层感知机无法表示的东西,增加一层就可以表示了。
实际上,感知机远不止步于此,它可以表示更加复杂的加法器、二转十编码器,呱呱呱呱呱呱呱呱呱,更让人惊讶的是,感知机居然能表示计算机!
正常人都会认为非常复杂,实际上,用与非门即可表示计算机,我们在前面的代码中给出了与非门的实现,所以——用组合感知机是可以表示计算机的!详见《计算机系统要素:从零开始构建现代计算机》,我觉得有空可以拜读一下,这大概就是不久之后要学的计组吧!
今天的内容是神经网络基础,加油!冲冲冲冲!明天继续!