1 激活函数:
a.阶跃函数 当输入超过 0 时,输出 1, 否则输出 0
b.sigmoid 函数
这个函数在后面的代码中使用很频繁,用代码输出图形:
c.ReLU(Rectified Linear Unit)函数 max(0,input)
这些函数的实现都非常简单,直接ruturn公式;
2 多维数组的运算
矩阵乘法:.dot(a,b) 对应维度的元素个数要保持一致,同数学里矩阵乘法
神经网络内积:Y=WX+B
3 3层神经网络实现
输出层函数:
恒等函数:将输入按原样输出,对于输入的信息,不加以任何改动地直接输出,加是为了和前面保持结构一致性;
softmax 函数:分子是输入信号的指数函数,分母为所有输入信号的指数函数的和;
softmax 函数的输出是 0.0 到 1.0 之间的实数。并且,softmax 函数的输出值的总和是 1。输出总和为 1 是 softmax 函数的一个重要性质。正因为有了这个性质,我们才可以把 softmax 函数的输出解释为“概率”。即该函数具有概率的性质,可以表示概率,一般而言,神经网络只把输出值最大的神经元所对应的类别作为识别结果。
代码实现
import numpy as np
def sigmoid(x):#激活函数
return 1/(1+np.exp(-x))
def identity_function(x):#输出函数
return x
def init_network():
network = {}
network['W1'] = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])#0-1层权重
network['b1'] = np.array([0.1,0.2,0.3])#偏置
network['W2'] = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])#1-2层权重
network['b2'] = np.array([0.1,0.2])
network['W3'] = np.array([[0.1,0.3], [0.2,0.4]])#2-3层权重
network['b3'] = np.array([0.1,0.2])
return network
def forward(network,x):
W1,W2,W3 = network['W1'],network['W2'],network['W3']
b1,b2,b3 = network['b1'],network['b2'],network['b3']
#a=wx+b 矩阵乘法
a1 = np.dot(x,W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1,W2) + b2
z2 = sigmoid(a2)
a3 = np.dot(z2,W3) + b3
y = identity_function(a3)
return y
network = init_network()
x=np.array([1.0,0.5])
y=forward(network,x)
print(y)
D:\software\Anaconda\python.exe D:\workspace_p\study\ch03\test.py
[0.31682708 0.69627909]
Process finished with exit code 0
遇到了几个问题:1.conda装过Numpy后pycharm一直显示无法导入,搜索了一下突然想到或许是每次新建工程时pycharm都需要重新配置解释器导致的,果然如此,配置方法:file-settings-project:network-python interpreter -修改为conda内置的python 就可以了,idea也是这样,每次都需要重新配置;
2.报错:Field elements must be 2- or 3-tuples, got '0.2' 是因为多维数组的写法不正确,需要在外层在加一个中括号:network['W2'] = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
手写数字识别
从书籍官网下载的代码在run的时候,发现导入dataset不成功,解决方法见ModuleNotFoundError: No module named ‘dataset‘--《深度学习入门》3.6.1节错误的解决方案_modulenotfounderror: no module named 'datasets_alltimehigh的博客-CSDN博客
运行截图:
keywords:
load_mnist函数return的是"(训练图像,训练标签),(测试图像,测试标签)"
有三个参数(均为布尔型):
normalize:是否正规化,即是否输出为0-1(浮点型)的值;False 不正规;
flatten:是否展开为一维数组;False 不做改变;
one_hot_label:是否将标签表示成正确解为1 ,其余为0 的形式; False不改变;
reshape() 可以改变图像形状(以像素的形式)
3.6.2 神经网络的推理处理
run示例代码neuraint_mnist的时候from common.functions import sigmoid, softmax报错:解决方法同上,因为我的环境其实是用的conda的,所以需要把依赖的数据和function都放入conda包下;
代码及结果:
感觉for循环里的代码有点难以理解,逐一输出就比较清晰了:
预处理:方法有正规化,使用均值或者方差再处理数据,和将数据整体分布均匀化的白化方法;
3.6.3 批处理
通过range()的第三个参数实现,会自动实现分批处理,sql中这种通常要自己实现;
书中解释说批处理可以减轻数据总线的负荷,或许是因为一次读入减少了IO次数?
从结果可以看出,这是多个一维数组:
python语法:使用print()的时候发现只能打印同一类型的数据,所以输出拼接类型的时候,要把数字强制转换成字符串类型:str(2)
第三章 end