一、笔记及作业:主要自己跑了下下面的代码
运行环境:mac os 10.13.6 + python3.7.1
1、作业及代码:见我的github主页
参考 :【目录】【中文】【deplearning.ai】【吴恩达课后作业目录】,这个作业目录中的内容主要是参考的Deep Learning Specialization on Coursera
2、学习笔记:吴恩达《深度学习》系列课程笔记,也可以注意看他的参考资料。
二、函数
1、np.squeeze()
作用:从数组的形状中删除单维度条目,即把shape中为1的维度去掉
参考:
numpy的squeeze函数 - tracy_leaf的博客 - CSDN博客、
numpy.squeeze()的用法 - hezhiyao - 博客园
2、plt.scatter():
plt.scatter()、PYthon——plt.scatter各参数详解
3、db1 = (1 / m) * np.sum(dZ1, axis=1, keepdims=True) 中 keepdims=True 的作用是:
保持矩阵维数不变。对axis进行指定轴操作会使矩阵降维,使用 keepdims=True 会使消失的轴保留,并保持维度为1。
参考:numpy中keepdims的理解、numpy中维度的正确理解姿势
4、python中np.multiply()、np.dot()和星号(*)三种乘法运算的区别
-
np.dot() :
对于秩为1的数组,计算两者内积;
对于秩不为1的二维数组,执行矩阵乘法运算;超过二维的可以参考numpy库介绍。 -
np.multiply() :
数组和矩阵对应元素相乘,输出与相乘数组/矩阵的大小一致 -
(*) :
对数组执行对应元素相乘;对矩阵执行矩阵乘法运算 -
综上:
1、对于数组(因为多数都是数组),要实现矩阵乘法一般用np.dot();要实现对应元素相乘都是用np.multiply()和(*)。
2、np.dot()和(*)都有特殊情况,即np.dot()对于秩为1的数组是计算两者内积,(*)对矩阵是执行矩阵乘法运算;但是np.multiply()肯定没有特殊情况,不管是矩阵还是数组它一定都是执行对应元素相乘。
3、所以,如果是要实现对应元素相乘就用np.multiply(),因为它没有特殊情况。
参考:
python中np.multiply()、np.dot()和星号(*)三种乘法运算的区别
5、python中的列表:
它的索引是从0开始的,比如list = ["a", "b", "c", "d”]时,list[3]=“d”。
参考:Python3 列表
6、range() :
作用:可创建一个整数列表
语法:range(start, stop,[step])
参数说明:
start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
7、[X,Y] = np.meshgrid(x,y)
作用:生成网格数据。即:以x中的数据为横坐标,y中的数据为纵坐标,进行描点画线,所得到的所有点(以从左到右从下到上的顺序)的横坐标为X,纵坐标为Y。
- [X,Y,Z]=meshgrid(x,y,z)同[X,Y] = np.meshgrid(x,y)一样,只是从二维数组变为了三维数组。
8、plt.contour()或plt.contour()
作用:绘制等高线图
- 会用到函数np.meshgrid(x,y)
- 区别:plt.contour()仅绘制等高线;而plt.contour()不仅绘制等高线,还要填充等高线区域的颜色。
参考:Matplotlib 中等高线图(contour)的绘制、matplotlib学习—画等高线图
9、numpy中的ravel()、flatten()、squeeze()的用法与区别
numpy中的ravel()、flatten()、squeeze()都有将多维数组转换为一维数组的功能,区别:
- ravel():如果没有必要,不会产生源数据的副本,修改它也会修改原数据,所以平时最好不用它 ;
- flatten():返回源数据的副本,所以修改它不会修改原数据,平时最好用它;
- squeeze():只能对维数为1的维度降维
- 另外,reshape(-1)也可以“拉平”多维数组
参考:
- Numpy中扁平化函数ravel()和flatten()的区别
- numpy中的ravel()、flatten()、squeeze()的用法与区别
- numpy.ravel()的区别numpy.flatten()
10、Python Numpy模块函数np.c_和np.r_的区别
- np.r_是按行连接两个矩阵,就是把两矩阵上下相加,要求行数相等,类似于pandas中的concat()
- np.c_是按列连接两个矩阵,就是把两矩阵左右相加,要求列数相等,类似于pandas中的merge()
参考:
11、理解决策边界的可视化:
在Course 2 - 改善深层神经网络 - 第一周作业中,吴恩达写的决策边界绘图函数为:
init_utils.plot_decision_boundary(lambda x: init_utils.predict_dec(parameters, x.T), train_X, np.squeeze(train_Y))
(1)其中,plot_decision_boundary()函数为:
def plot_decision_boundary(model, X, y):
# Set min and max values and give it some padding
x_min, x_max = X[0, :].min() - 1, X[0, :].max() + 1
y_min, y_max = X[1, :].min() - 1, X[1, :].max() + 1
h = 0.01
# Generate a grid of points with distance h between them 以 h 为间隔生成网格数据
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
# Predict the function value for the whole grid
Z = model(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# Plot the contour and training examples
plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral) # 画三维等高线图
plt.ylabel('x2')
plt.xlabel('x1')
plt.scatter(X[0, :], X[1, :], c=y, cmap=plt.cm.Spectral)
plt.show()
①要理解plot_decision_boundary()函数,必须要理解[X,Y] = np.meshgrid(x,y),它的理解见本节中第7个函数。
②要理解plot_decision_boundary()函数,必须要理解plt.contour()或plt.contour(),它的理解见本节中第8个函数。
③要理解plot_decision_boundary()函数,必须要理解本节中第9、10个函数。
(2)predict_dec(parameters, X)函数的作用是:对输入数据X用训练后的模型进行预测并把预测概率变为对应的标签。其具体如下:
def predict_dec(parameters, X):
"""
Used for plotting decision boundary.
Arguments:
parameters -- python dictionary containing your parameters
X -- input data of size (m, K)
Returns
predictions -- vector of predictions of our model (red: 0 / blue: 1)
"""
# Predict using forward propagation and a classification threshold of 0.5
a3, cache = forward_propagation(X, parameters)
predictions = (a3>0.5)
return predictions
12、assert,lambda,filter的用法及作用
python学习-assert,lambda,filter的用法及作用
13、np.linalg.norm()
作用:求矩阵或向量的范数
参考:np.linalg.norm(求范数)
14、np.random.permutation()和np.random.shuffle()的区别
相同:
- 都可以随机打乱数组,此时它们的参数都是『array_like』(即:数组)类型
注意:如果它们的参数是多维数组,而不是1维数组,那么就是打乱维度间的顺序,而不打乱某一维内的各个元素的顺序。比如:
>>arr = np.arange(9).reshape((3, 3))
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>np.random.permutation(arr)
array([[6, 7, 8],
[0, 1, 2],
[3, 4, 5]])
不同:
- np.random.permutation()的参数还可以是一个整数,即『 int 』类型,这时相当于
np.arange(int)
,即:得到一个数组,其元素为0到int-1的所有整数,顺序随机打乱。np.random.shuffle()不能这样。 - np.random.permutation()返回打乱后的数组,而np.random.shuffle()没有返回值或返回none。
- 速度区别:在数组长度达到 级别以前,两者速度几乎没有差别,但是在 达到 以后两者速度差距明显拉大,shuffle 的用时明显短于 permutation,因为
permutation
其实在内部实现也是调用的shuffle
,这点从 Numpy 的源码 可以看出来:
def permutation(self, object x):
'''这里都是帮助文档,我就省略了'''
if isinstance(x, (int, long, np.integer)): # 如果是整数,就返回随机序列
arr = np.arange(x)
else:
arr = np.array(x) # 如果是数组,就返回数组,再用shuffle随机打乱这个数组
self.shuffle(arr)
return arr
另外,如果要利用此函数对输入数据X、Y进行随机排序,且要求随机排序后的X Y中的值保持原来的对应关系,可以这样处理:
permutation = list(np.random.permutation(m)) #m为样本数。把随机整数数组变为一个序列
shuffled_X = X[:, permutation]
shuffled_Y = Y[:, permutation].reshape((1,m))
参考:
三、问题:
-
1、在pycharm中跑jupyter notebook还是不行,问题比较多,比如不能包含当前文件夹内的模块(关于这个问题的解决方法见第2中)等,所以还是以浏览器来运行的jupyter notebook,同时在pycharm内跑每次作业的所有代码。
-
2、pycharm中不能包含当前文件夹内的模块,导致总有红线出现,虽然运行时不会出错,但强迫症使人还是想解决这个问题。实际上方法很简单,就是把该文件夹右键设置为source类型即可。但是这种方法没能解决jupyter notebook出现这种问题。
四、课程1_知识点:
1、准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1 score、P-R曲线、ROC曲线、AUC
真正(True Positive , TP)被模型预测为正的正样本
假负(False Negative , FN)被模型预测为负的正样本
假正(False Positive , FP)被模型预测为正的负样本
真负(True Negative , TN)被模型预测为负的负样本
P : 正样本数,P = TP+FN ;
N : 负样本数,N = FP+TN
- 准确率:指分类正确的样本占总样本个数的比例。
Accuracy = (TP+TN)/(TP+FN+FP+TN) = (TP + TN)/(P+N) - 精确率:指分类正确的正样本个数占分类器判定为正样本的样本个数的比例。
Precision = (TP)/(TP+FP) - 召回率:指分类正确的正样本个数占真正的正样本个数的比例。也叫『查全率』
Recall = (TP)/(TP+FN)
精确率和召回率的关系下图更形象:
- F1 score : 是精确率和召回率的调和平均值。
F1 = (2PrecisionRecall)/(Precision+Recall) - P-R曲线:横轴是召回率,纵轴是精确率。
- ROC曲线:横轴是假正率,纵轴是召回率或真正率。
真正率(TPR):TPR = TP / (TP + FN) = TP / P = 1- FN / P,也就说:真正率 = 召回率
假正率( FPR):FPR = FP / (FP + TN) = FP / N
真正率越大越好,假正率越小越好 - AUC : Area Under roc Curve(AUC)。顾名思义,AUC的值就是处于ROC curve下方的那部分面积的大小。
通常,AUC的值介于0.5到1.0之间,较大的AUC代表了较好的Performance。
参考:
2、神经网络层数:
神经网络层数 = 隐藏层数+输出层 = 隐藏层数+1
3、logistic回归 可以把权重初始化为0,但是神经网络不能把权重全部初始化为0.
参考:Ng的deeplearning.ai课程中『神经网线与深度学习』部分中第四周的『随机初始化』一讲。
五 、课程2_知识点
1、要确保:验证集和测试集来自于同一个分布(数据来源一致)。可以使得机器学习算法变得更快并获得更好的效果。
如果不需要用无偏估计来评估模型的性能,则可以不需要测试集。
2、
- 验证集的作用:验证不同的算法哪种更加有效
- 测试集的作用:评估模型的效果,获取模型运行的无偏估计(对学习方法进行评估)。
3、数据集划分比例:
(1)在 小数据量 的时代,如 100、1000、10000 的数据量大小,可以将数据集按照以下比例进行划分(顺序是:训练集、验证集、测试集):
- 无验证集的情况:70% / 30%;
- 有验证集的情况:60% / 20% / 20%;
(2)在 大数据 的时代:
- 100 万数据量:98% / 1% / 1%;
- 超百万数据量:99.5% / 0.25% / 0.25%(或者99.5% / 0.4% / 0.1%)
4、怎么判断一个模型是否出现高偏差(high bias)和高方差(high variance)?
- 『训练误差较大』 = 高偏差
- 『验证误差>>训练误差』=高方差
其中,“ >>” 表示”远大于” 。可以看出:偏差对应训练误差;方差对应验证误差。
5、存在高偏差或高方差时应该怎么办?
(1)存在高偏差:
- 扩大网络规模,如添加隐藏层或隐藏单元数目;
- 寻找合适的网络架构,使用更大的 NN 结构;
- 花费更长时间训练。
(2)存在高方差:
- 获取更多的数据;
- 正则化(regularization);
- 寻找更合适的网络结构。
6、怎么判断一个模型是否出现欠拟合或过拟合?
- 『训练误差较大且验证误差较大』= 欠拟合,属于高偏差;
- 『训练误差较小且验证误差较大』= 过拟合,属于高方差。
7、为什么正则化可以减少过拟合?
- 直观解释:正则化因子设置的足够大的情况下,为了使成本函数最小化,权重矩阵 W 就会被设置为接近于 0 的值,直观上相当于消除了很多神经元的影响,那么大的神经网络就会变成一个较小的网络。当然,实际上隐藏层的神经元依然存在,但是其影响减弱了,便不会导致过拟合。
- 其他解释:在权值变小之下,输入样本 X 随机的变化不会对神经网络模造成过大的影响,神经网络受局部噪音的影响的可能性变小。这就是正则化能够降低模型方差的原因。
8、反向随机失活(Inverted dropout)是实现 dropout 的方法。对第层进行 dropout:
keep_prob = 0.8 # 设置神经元保留概率
dl = np.random.rand(al.shape[0], al.shape[1]) < keep_prob # dl是第l层dropout向量
al = np.multiply(al, dl)
al /= keep_prob # 因为有这一步,所以才叫反向随机失活
最后一步al /= keep_prob
是因为 中的一部分元素失活(相当于被归零),为了在下一层计算时不影响 的期望值,因此除以一个keep_prob。因为这里的前向传播中除以了keep_prob,所以为了保持一致在反向传播中计算它的梯度时也需要相应的除以keep_prob。现在实现dropout的常用方法是反向随机失活,而dropout早期版本没有除以keep_prob,所以在测试阶段平均值会变得越来越复杂。也正是因为除以keep_prob,所以在测试阶段不使用dropout时,才不用另外加尺度参数来确保激活函数的期望不变。
注意,在测试阶段不要使用 dropout,因为那样会使得预测结果变得随机。
9、dropout和正则化的相同点:
dropout随机删除网络中神经元,所以好像每次迭代后,神经网络会变得比以前小;而正则化也是使权重接近于0,从而使得一些神经元失效或影响减弱,也相当于减小了神经网络,所以dropout和正则化的效果是一样的,都相当于权重衰减。
10、dropout 的一大缺点是成本函数无法被明确定义。因为每次迭代都会随机消除一些神经元结点的影响,因此无法确保成本函数单调递减。因此,使用 dropout 时,先将keep_prob全部设置为 1.0 后运行代码,确保 J(w,b)函数单调递减,再打开 dropout。
11、理解『指数加权平均』
- 为什么在优化算法中使用指数加权平均:讲得简洁、易懂
- 优化算法之指数移动加权平均:讲得非常完整、全面
网友评论