美文网首页deeplearning.ai
吴恩达deeplearning.ai_课程学习

吴恩达deeplearning.ai_课程学习

作者: 2e07917c964c | 来源:发表于2018-12-25 10:01 被阅读0次

    一、笔记及作业:主要自己跑了下下面的代码

    运行环境: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)

    参考:Python range() 函数用法

    7、[X,Y] = np.meshgrid(x,y)

    作用:生成网格数据。即:以x中的数据为横坐标,y中的数据为纵坐标,进行描点画线,所得到的所有点(以从左到右从下到上的顺序)的横坐标为X,纵坐标为Y。

    • [X,Y,Z]=meshgrid(x,y,z)同[X,Y] = np.meshgrid(x,y)一样,只是从二维数组变为了三维数组。

    参考 :Numpy中Meshgrid函数介绍及2种应用场景

    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)也可以“拉平”多维数组

    参考:

    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。
    • 速度区别:在数组长度达到 10^9级别以前,两者速度几乎没有差别,但是在 达到 10^9以后两者速度差距明显拉大,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 的值,直观上相当于消除了很多神经元的影响,那么大的神经网络就会变成一个较小的网络。当然,实际上隐藏层的神经元依然存在,但是其影响减弱了,便不会导致过拟合。
    • 其他解释:在权值w^{[L]}变小之下,输入样本 X 随机的变化不会对神经网络模造成过大的影响,神经网络受局部噪音的影响的可能性变小。这就是正则化能够降低模型方差的原因。

    8、反向随机失活(Inverted dropout)是实现 dropout 的方法。对第l层进行 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是因为 a^{[l]}中的一部分元素失活(相当于被归零),为了在下一层计算时不影响 Z^{[l+1]}=W^{[l+1]}a^{[l]}+b^{[l+1]}的期望值,因此除以一个keep_prob。因为这里的前向传播中A^{[L]}除以了keep_prob,所以为了保持一致在反向传播中计算它的梯度dA^{[L]}时也需要相应的除以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、理解『指数加权平均』

    相关文章

      网友评论

        本文标题:吴恩达deeplearning.ai_课程学习

        本文链接:https://www.haomeiwen.com/subject/azctlqtx.html