在吴恩达老师DL系列课程的学习过程中,跟随做的一些小练习,在看懂别人代码基础上,整理的一些小笔记。
源代码参考:https://blog.youkuaiyun.com/u013733326/article/details/79639509
其中,有一行代码当时不明白为什么Y*np.log(A)要用点乘*而不用矩阵乘法numpy.dot()
cost = (- 1 / m) * np.sum(Y * np.log(A) + (1 - Y) * (np.log(1 - A)))
在分析Y和A的维度之后,得出的确应该用点乘 *的结论
因为Y的维度为(1,209),而A的维度也为(1,209),无法用矩阵乘法相乘,会报错。
import numpy as np
a = np.arange(1,5).reshape(1,4)
print(a)
print(a.shape)
b = np.arange(5,9).reshape(4,1)
print(b)
c = np.dot(a,b) #矩阵乘法,维度(1,4)*(4,1),返回结果维度(1,1)
print(c)
d = a*b #点乘,维度(1,4)*(4,1),返回结果维度(4,4)
print(d)
e = np.arange(1,5)
print(e)
f = np.arange(5,9)
print(f)
g = np.dot(e,f) #矩阵乘法,维度(1,)*(1,),返回结果维度( )
print(g)
h = e*f #点乘,维度(1,)*(1,),返回结果维度(1,)
print(h)
i = np.arange(1,5).reshape(1,4)
print(i)
j = np.arange(5,9).reshape(1,4)
print(j)
#矩阵乘法,维度(1,4)*(1,4),返回结果报错
k = i*j #点乘,维度(1,4)*(1,4),返回结果维度(1,4)
print(k)
[[1 2 3 4]] #a
(1, 4) #a.shape
[[5]
[6]
[7]
[8]] #b
[[70]] #c:矩阵乘法,维度(1,4)*(4,1),返回结果维度(1,1)
[[ 5 10 15 20]
[ 6 12 18 24]
[ 7 14 21 28]
[ 8 16 24 32]] #d:点乘,维度(1,4)*(4,1),返回结果维度(4,4)
[1 2 3 4] #e
[5 6 7 8] #f
70 #g:矩阵乘法,维度(1,)*(1,),返回结果维度( )
[ 5 12 21 32]#h:点乘,维度(1,)*(1,),返回结果维度(1,)
[[1 2 3 4]] #i
[[5 6 7 8]] #j
[[ 5 12 21 32]]#k:点乘,维度(1,4)*(1,4),返回结果维度(1,4)
#error:矩阵乘法,维度(1,4)*(1,4),返回结果报错
整体思路梳理
具有神经网络思维的Logistic回归
搭建一个能够**【识别猫】** 的简单的神经网络
- numpy :是用Python进行科学计算的基本软件包。
- h5py:是与H5文件中存储的数据集进行交互的常用软件包。
- matplotlib:是一个著名的库,用于在Python中绘制图表。
- lr_utils :在本文的资料包里,一个加载资料包里面的数据的简单功能的库。
步骤一:从.H5中加载图像,train_set_x_orig , train_set_y , test_set_x_orig , test_set_y
x代表图像,y代表标签;x是一个维度为(m_、、
train,num_px,num_px,3)的数组;y是一个(1,m_train)的数组。
步骤二:将图像矩阵train_set_x_orig进行flatten降维,变为(m_train,num_px*num_px*3)·T的二维矩阵。降维后将图像矩阵标准化,除以255。
步骤三:建立神经网络
构建Sigmoid()激活函数
构建initialize_with_zeros()进行初始化
构建propagate()前向传播计算costs,后向传播计算逻辑参数dw(相对于w的损失梯度),db(相对于b的损失梯度)
构建optimize()渐变下降更新参数,返回:
params - 包含权重w和偏差b的字典
grads - 包含权重和偏差相对于成本函数的梯度的字典
成本 - 优化期间计算的所有成本列表,将用于绘制学习曲线。
构建predict()使用学习逻辑回归参数logistic(w,b)预测标签是0还是1
主要是学习逻辑参数w,b