前言

网易云课堂(双语字幕,不卡):https://mooc.study.163.com/smartSpec/detail/1001319001.htmcourseId=1004570029、
Coursera(贵):https://www.coursera.org/specializations/deep-learning
本人初学者,先在网易云课堂上看网课,再去Coursera上做作业,开博客以记录,文章中引用图片皆为课程中所截。
题目转载至:http://www.cnblogs.com/hezhiyao/p/7810725.html

 为了人工智能!
 为了人工智能!为了人工智能!
 为了人工智能!为了人工智能!为了人工智能!

机器学习基础

1.训练集/开发集/测试集

Andrew Ng Deep Learning 第二课 第一周
Tips:从不同方式得到的数据分两组或者一组数据按照3:1:1方式分三组

2.偏差(bias)/方差(variance)

Andrew Ng Deep Learning 第二课 第一周
Andrew Ng Deep Learning 第二课 第一周
Tips:训练集误差高,说明未拟合,为高偏差,需要更好或者更深层的网络才能训练,开发集误差高(即训练完训练集得到的参数再训练的集合)误差高,说明此时训练集高度拟合但别的集合未拟合,即参数过拟合,为高方差,需要更多数据或者使用正则化

正则化

logistic 回归

Andrew Ng Deep Learning 第二课 第一周
Andrew Ng Deep Learning 第二课 第一周
Tips:范数即为w矩阵中每个数的平方的和

神经网络

Andrew Ng Deep Learning 第二课 第一周
Tips:范数即为先计算每层w矩阵的各个元素平方的和,再对所有层进行总和
Andrew Ng Deep Learning 第二课 第一周
Andrew Ng Deep Learning 第二课 第一周
Tips:db算法不变。

dropout正则化

Andrew Ng Deep Learning 第二课 第一周
Tips:简单来说就是从原网络中随机性删除几个节点后再进行训练。
Andrew Ng Deep Learning 第二课 第一周
Tips:首先先定义一个超参数keep-prob,即对某个单位元来说它保留的概率,然后进行筛选,之后再对整个神经网络的每个值处以keep-prob使a3期望值不变
Andrew Ng Deep Learning 第二课 第一周
Tips:对每层设定的keep-prob可以不同
Tips:dropout正则化一般是在确定过拟合的情况下载才使用

其他正则化方法

Andrew Ng Deep Learning 第二课 第一周
Andrew Ng Deep Learning 第二课 第一周

正则化输入

Andrew Ng Deep Learning 第二课 第一周

梯度检验

Andrew Ng Deep Learning 第二课 第一周

编程作业

import numpy as np
import matplotlib.pyplot as plt
import sklearn
import sklearn.datasets
import init_utils

%matplotlib inline
plt.rcParams['figure.figsize'] = (7.0, 4.0) # set default size of plots
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'

# load image dataset: blue/red dots in circles

def model(X,Y,learning_rate=0.01,num_iterations=15000,print_cost=True,initialization="he",is_polt=True):
    """
    实现一个三层的神经网络:LINEAR ->RELU -> LINEAR -> RELU -> LINEAR -> SIGMOID

    参数:
        X - 输入的数据,维度为(2, 要训练/测试的数量)
        Y - 标签,【0 | 1】,维度为(1,对应的是输入的数据的标签)
        learning_rate - 学习速率
        num_iterations - 迭代的次数
        print_cost - 是否打印成本值,每迭代1000次打印一次
        initialization - 字符串类型,初始化的类型【"zeros" | "random" | "he"】
        is_polt - 是否绘制梯度下降的曲线图
    返回
        parameters - 学习后的参数
    """
    grads = {}
    costs = []
    m = X.shape[1]
    layers_dims = [X.shape[0],10,5,1]

    #选择初始化参数的类型
    if initialization == "zeros":
        parameters = initialize_parameters_zeros(layers_dims)
    elif initialization == "random":
        parameters = initialize_parameters_random(layers_dims)
    elif initialization == "he":
        parameters = initialize_parameters_he(layers_dims)
    else : 
        print("错误的初始化参数!程序退出")
        exit

    #开始学习
    for i in range(0,num_iterations):
        #前向传播
        a3 , cache = init_utils.forward_propagation(X,parameters)

        #计算成本        
        cost = init_utils.compute_loss(a3,Y)

        #反向传播
        grads = init_utils.backward_propagation(X,Y,cache)

        #更新参数
        parameters = init_utils.update_parameters(parameters,grads,learning_rate)

        #记录成本
        if i % 1000 == 0:
            costs.append(cost)
            #打印成本
            if print_cost:
                print("第" + str(i) + "次迭代,成本值为:" + str(cost))


    #学习完毕,绘制成本曲线
    if is_polt:
        plt.plot(costs)
        plt.ylabel('cost')
        plt.xlabel('iterations (per hundreds)')
        plt.title("Learning rate =" + str(learning_rate))
        plt.show()

    #返回学习完毕后的参数
    return parameters
def initialize_parameters_zeros(layers_dims):
    """
    将模型的参数全部设置为0

    参数:
        layers_dims - 列表,模型的层数和对应每一层的节点的数量
    返回
        parameters - 包含了所有W和b的字典
            W1 - 权重矩阵,维度为(layers_dims[1], layers_dims[0])
            b1 - 偏置向量,维度为(layers_dims[1],1)
            ···
            WL - 权重矩阵,维度为(layers_dims[L], layers_dims[L -1])
            bL - 偏置向量,维度为(layers_dims[L],1)
    """
    parameters = {}
    L = len(layers_dims)            # number of layers in the network
    
    for l in range(1, L):
        ### START CODE HERE ### (≈ 2 lines of code)
        parameters['W'+str(l)]=np.zeros((layers_dims[l],layers_dims[l-1]))
        parameters['b'+str(l)]=np.zeros((layers_dims[l],1))
        ### END CODE HERE ###
    return parameters

def initialize_parameters_random(layers_dims):
    """
    参数:
        layers_dims - 列表,模型的层数和对应每一层的节点的数量
    返回
        parameters - 包含了所有W和b的字典
            W1 - 权重矩阵,维度为(layers_dims[1], layers_dims[0])
            b1 - 偏置向量,维度为(layers_dims[1],1)
            ···
            WL - 权重矩阵,维度为(layers_dims[L], layers_dims[L -1])
            b1 - 偏置向量,维度为(layers_dims[L],1)
    """
    np.random.seed(3)               # This seed makes sure your "random" numbers will be the as ours
    parameters = {}
    L = len(layers_dims)            # integer representing the number of layers
    
    for l in range(1, L):
        ### START CODE HERE ### (≈ 2 lines of code)
        parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) * 10 #使用10倍缩放
        parameters['b' + str(l)] = np.zeros((layers_dims[l], 1))

        ### END CODE HERE ###

    return parameters

def initialize_parameters_he(layers_dims):
    """
    参数:
        layers_dims - 列表,模型的层数和对应每一层的节点的数量
    返回
        parameters - 包含了所有W和b的字典
            W1 - 权重矩阵,维度为(layers_dims[1], layers_dims[0])
            b1 - 偏置向量,维度为(layers_dims[1],1)
            ···
            WL - 权重矩阵,维度为(layers_dims[L], layers_dims[L -1])
            b1 - 偏置向量,维度为(layers_dims[L],1)
    """
    np.random.seed(3)
    parameters = {}
    L = len(layers_dims) - 1 # integer representing the number of layers
     
    for l in range(1, L + 1):
        ### START CODE HERE ### (≈ 2 lines of code)
        parameters['W' + str(l)] =  np.random.randn(layers_dims[l], layers_dims[l-1]) * np.sqrt(2./layers_dims[l-1])
        parameters['b' + str(l)] = np.zeros((layers_dims[l],1))
        ### END CODE HERE ###
        
    return parameters


parameters = initialize_parameters_he([2, 4, 1])
print("W1 = " + str(parameters["W1"]))
print("b1 = " + str(parameters["b1"]))
print("W2 = " + str(parameters["W2"]))
print("b2 = " + str(parameters["b2"]))
parameters = model(train_X, train_Y, initialization = "he",is_polt=True)
print("训练集:")
predictions_train = init_utils.predict(train_X, train_Y, parameters)
print("测试集:")
init_utils.predictions_test = init_utils.predict(test_X, test_Y, parameters)

题目

Andrew Ng Deep Learning 第二课 第一周
Tips:样本总书够大的情况下,开发集只是为了用一定量的样本来检测算法是否合理,在调整较下比例的前提下保证开发集的数量就行了。
Andrew Ng Deep Learning 第二课 第一周
Andrew Ng Deep Learning 第二课 第一周
Andrew Ng Deep Learning 第二课 第一周
Andrew Ng Deep Learning 第二课 第一周
Andrew Ng Deep Learning 第二课 第一周
Andrew Ng Deep Learning 第二课 第一周
Tips:这里若有正则化,还可以增大λ
Andrew Ng Deep Learning 第二课 第一周
Andrew Ng Deep Learning 第二课 第一周
Andrew Ng Deep Learning 第二课 第一周
Andrew Ng Deep Learning 第二课 第一周
Andrew Ng Deep Learning 第二课 第一周
Andrew Ng Deep Learning 第二课 第一周

相关文章: