目录
0.多维度数组运算
shape ndim 函数请运行下面代码自行体会。
import numpy as np
#please run the following codes
a = np.array([1,2,4,3])
print(a)
print(np.ndim(a)) # Number of array dimension
print(a.shape) # returns a tuple and the tuple gives the lengths of the input array dimensions
print(a.shape[0]) # 一维的长度 即 元素的数量
b = np.array([[1,2],[3,4],[5,6]])
print(np.ndim(b)) #2维
print(b.shape) # 3*2矩阵
print(b.shape[0]) #b的第一个维度长
print(b.shape[1])#b的第二个维度长
下面这段话不一定全对,但可以参考
当进行向量的内积运算时,可以通过np.dot()
当进行矩阵的乘法运算时,可以通过np.matmul()或者@
当进行标量的乘法运算时,可以通过np.multiply()或者*
(np.dot()、np.multiply()、np.matmul()方法以及*和@运算符的用法总结 - 山上有风景 - 博客园)
import numpy as np
#please run the following codes
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print(np.matmul(a,b))
print(np.dot(a,b)) #普通的矩阵乘法情况下两者都可以用
#向量点乘
a1 = np.array([1,2,3])
b1 = np.array([1,2,3])
print(np.dot(a1,b1))
print(np.matmul(a1,b1))
print(a1 @ b1)
# 1*2 与 2*2 这种是我们常理解的乘法
a3 = np.array([1,2])
b3 = np.array([[1,2],[3,4]])
print(np.dot(a3,b3))
#这样也可以算 这种超脱了我们一般理解的矩阵乘法
# 2*2矩阵 与 一维数组相乘 只要对应维度元素保持一致即可
#用记住shape查看
a2 = np.array([[1,2],[3,4]])
print(a2.shape)# (2,2)
b2 = np.array([1,2])
print(b2.shape) #(2,)
# (2,2) * (2,) 可以相乘
print(np.dot(a2,b2))
1.引入神经网络
感知机中根据计算的输入信号的总和 , ,返回的值是0和1,可以定义函数, ,可以称为阶跃函数。
阶跃函数图像
# 阶跃函数图像
import numpy as np
import matplotlib.pyplot as mp
#下面函数是对阶跃函数的实现
def step_function(x):
y = x>0
y = y.astype(np.int_)
return y #astype()对数据类型进行转换
# 书中numpy.int型已经被淘汰 最新用 np.int_ or np.int16 or np.int32
#满足 function(x<0)=0 function(x>0)=1
x = np.arange(-6,6,0.1)
y = step_function(x)
mp.plot(x,y)
mp.ylim(-0.1,1.1) #对y轴值进行限制
mp.show()
另一种写step function的方法 (较难理解)
def step_function(x):
return np.array(x>0,dtype=np.int_)#np.array(object,dtype=None(默认))
阶跃函数 是一种 激活函数activate function,我们将阶跃函数,换成sigmoid funtion 就可以变成神经网络了。
Sigmoid函数图像
# Sigmoid function 图像
import numpy as np
import matplotlib.pyplot as mp
x = np.arange(-6,6,0.1)
y = 1/(1+np.exp(-x))
mp.plot(x,y)
mp.show()
两者共同点: 都是输入重要信息时(输入大),值越靠近1,输入不重要信息时(输入小)值越靠近0,且 函数输出信号值均在 0~1之间。
同为激活函数的还有ReLU (rectified linear unit),图像如下,(后面章节会用到)
import numpy as np
import matplotlib.pyplot as plt
def relu(x):
return np.maximum(0,x) #返回0 or X 较大的数
x = np.arange(-6,6,0.1)
y = relu(x)
plt.plot(x,y)
plt.show()
我们注意到 Activate function都是 inlinear 的 ,只有非线性的函数才能发挥出神经网络中的中间层(隐藏层)的作用 (图来自鱼书)
2.神经网络的实现
三层神经网络的实现,指有3个权重向量,四层,中间两层隐藏层,首尾是输入和输出层
#三层神经网络的实现 A = XW + B
import numpy as np
def init_network(): #初始化偏置和权重
network = {}
network['w1'] = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]]) #第一层权重 第一行代表x1向下层传递的权重
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]])
network['b2'] = np.array([0.1,0.2])
network['w3'] = np.array([[0.1,0.3],[0.2,0.4]])
network['b3'] = np.array([0.1,0.2])
return network
def sigmoid(x):#隐藏层激活函数
return 1/(1+np.exp(-x))
def sigma(x): #输出层激活函数
return x
def forward(network,x):
w1 , w2 , w3 = network['w1'] , network['w2'] , network['w3']
b1 , b2 , b3 = network['b1'] , network['b2'] , network['b3']
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 = sigma(a3) #输出层激活函数
return y
network = init_network()
x = np.array([1,0.5])
y = forward(network,x)
print(y)
3.输出层函数的选择
隐藏层我们一般选择sigmoid函数,但输出层根据不同问题有不同选择,对于分类问题,如识别图像数字是0~9中哪个,我们一般用softmax函数;对于回归问题,如预测问题,选择恒等函数,如图上面代码输出层激活函数一样。
softmax函数返回的是各个输出y的百分比,百分比大的就是概率大的
def 恒等函数(x):
return x
def softmax(x):
c = np.max(x)
y = np.exp(x-c)/np.sum(np.exp(x-c))
return y