山东大学人工智能导论实验三 Logistic回归分类器识别猫

慈云数据 2024-05-28 技术支持 47 0

img

img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

目录

【实验目标】

【实验内容】

数据集介绍】

1.datasets/train_catvnoncat.h5

2.datasets/ test_catvnoncat.h5

3.lr_utils.py中有加载数据集的函数

【代码要求】

定义模型结构

初始化模型的参数

循环

计算当前损失(前向传播)

计算当前梯度(反向传播)

更新参数(梯度下降)

【文档要求】

1.尝试不同的学习率(至少三种),观察不同学习率下随着迭代次数的增加损失值的变化

2.分析不同的学习率对模型准确率的影响及原因,如何选择合适的学习率。


【实验目标】

  1. 基于作业二的拓展,进一步理解神经网络的思想
  2. 理解逻辑回归实际上是一个非常简单的神经网络

【实验内容】

建立Logistic回归分类器用来识别猫。参考1 和 参考2

【数据集介绍】

1.datasets/train_catvnoncat.h5

保存的是训练集里面的图像数据(本训练集有209张64x64的图像)及对应的分类值(0或1,0表示不是猫,1表示是猫)

2.datasets/ test_catvnoncat.h5

保存的是测试集里面的图像数据(本训练集有50张64x64的图像)及保存的是以bytes类型保存的两个字符串数据,数据为:[b’non-cat’ b’cat’]。

3.lr_utils.py中有加载数据集的函数

【代码要求】

  1. 定义模型结构

  2. 初始化模型的参数

  3. 循环

  • 计算当前损失(前向传播)
  • 计算当前梯度(反向传播)
  • 更新参数(梯度下降)
    import numpy as np  
    import matplotlib.pyplot as plt  
    import h5py  
    from lr_utils import load_dataset  
      
    train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset()  
      
    m_train = train_set_y.shape[1]    
    m_test = test_set_y.shape[1]    
    num_px = train_set_x_orig.shape[1]  
      
    print("训练集的数量: m_train = " + str(m_train))  
    print("测试集的数量 : m_test = " + str(m_test))  
    print("每张图片的宽/高 : num_px = " + str(num_px))  
    print("每张图片的大小 : (" + str(num_px) + ", " + str(num_px) + ", 3)")  
    print("训练集_图片的维数 : " + str(train_set_x_orig.shape))  
    print("训练集_标签的维数 : " + str(train_set_y.shape))  
    print("测试集_图片的维数: " + str(test_set_x_orig.shape))  
    print("测试集_标签的维数: " + str(test_set_y.shape))  
      
    # 将训练集的维度降低并转置。  
    train_set_x_flatten = train_set_x_orig.reshape(train_set_x_orig.shape[0], -1).T  
    # 将测试集的维度降低并转置。  
    test_set_x_flatten = test_set_x_orig.reshape(test_set_x_orig.shape[0], -1).T  
      
    print("训练集降维最后的维度: " + str(train_set_x_flatten.shape))  
    print("训练集_标签的维数 : " + str(train_set_y.shape))  
    print("测试集降维之后的维度: " + str(test_set_x_flatten.shape))  
    print("测试集_标签的维数 : " + str(test_set_y.shape))  
      
    index = 11  
    plt.imshow(train_set_x_orig[index])  
    print("y = " + str(train_set_y[:, index]) + ", it's a '" + classes[np.squeeze(train_set_y[:, index])].decode(  
        "utf-8") + "' picture.")  
      
    train_set_x = train_set_x_flatten / 255  
    test_set_x = test_set_x_flatten / 255  
      
      
    def sigmoid(z):  
        s = 1 / (1 + np.exp(-z))  
        return s  
      
      
    def initialize_with_zeros(dim):  
        w = np.zeros(shape=(dim, 1))  
        b = 0  
        # 使用断言来确保我要的数据是正确的  
        assert (w.shape == (dim, 1))  # w的维度是(dim,1)  
        assert (isinstance(b, float) or isinstance(b, int))  # b的类型是float或者是int  
      
        return (w, b)  
      
      
    def propagate(w, b, X, Y):  
        m = X.shape[1]  
      
        # 正向传播  
        A = sigmoid(np.dot(w.T, X) + b)  
        cost = (- 1 / m) * np.sum(Y * np.log(A) + (1 - Y) * (np.log(1 - A)))  
      
        # 反向传播  
        dw = (1 / m) * np.dot(X, (A - Y).T)  
        db = (1 / m) * np.sum(A - Y)  
      
        # 使用断言确保我的数据是正确的  
        assert (dw.shape == w.shape)  
        assert (db.dtype == float)  
        cost = np.squeeze(cost)  
        assert (cost.shape == ())  
      
        # 创建一个字典,把dw和db保存起来。  
        grads = {  
            "dw": dw,  
            "db": db  
        }  
        return (grads, cost)  
      
      
    def optimize(w, b, X, Y, num_iterations, learning_rate, print_cost=False):  
        costs = []  
      
        for i in range(num_iterations):  
      
            grads, cost = propagate(w, b, X, Y)  
      
            dw = grads["dw"]  
            db = grads["db"]  
      
            w = w - learning_rate * dw  
            b = b - learning_rate * db  
      
            # 记录成本  
            if i % 100 == 0:  
                costs.append(cost)  
    ![img](https://img-blog.csdnimg.cn/img_convert/251748b243e2e9d6479c04d7e0215970.png)
    ![img](https://img-blog.csdnimg.cn/img_convert/e41dec73570fa4435d59dc2802e3a8e6.png)
    ![img](https://img-blog.csdnimg.cn/img_convert/43a63537b736fcc31c2b5a2b6224f4b6.png)
    **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
    **由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
    **[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**
    33982)]
    **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
    **由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
    **[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**
    
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon