思路:输入样本X与随机初始权重W相乘,利用sigmoid激活函数输出值,对于二分类问题,用交叉熵损失函数来计算损失值,通过交叉熵损失函数利用链式法则求出W和b的偏导,梯度下降更新W和b即可,(梯度下降又有很多,Momentum,Adam等后面在详细介绍)剩下的就是迭代次数和学习率的问题。

第一课作业直接给了数据集,无须对数据集操作,下面是读取数据集的代码,数据集链接https://download.csdn.net/download/fanzonghao/10539175

命名为:lr_utils.py

 
import numpy as np
import h5pydef load_dataset():train_dataset = h5py.File('datasets/train_catvnoncat.h5', "r")train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set featurestrain_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labelstest_dataset = h5py.File('datasets/test_catvnoncat.h5', "r")test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set featurestest_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labelsclasses = np.array(test_dataset["list_classes"][:]) # the list of classestrain_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes
if __name__ == '__main__':train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes=load_dataset()print('训练样本数={}'.format(train_set_x_orig.shape))print('训练样本对应的标签={}'.format(train_set_y_orig.shape))print('前10张训练样本标签={}'.format(train_set_y_orig[:,:10]))print('测试样本数={}'.format(test_set_x_orig.shape))print('测试样本对应的标签={}'.format(test_set_y_orig.shape))print('{}'.format(classes))

可看见打印结果:209个样本,64x64x3。

 

下面通过测试代码看看标签0 1 代表的是什么

import cv2
from lr_utils import load_dataset
train_set_x_orig,train_set_y,test_set_x_orig,test_set_y,classes=load_dataset()
cv2.imshow('img0',train_set_x_orig[0])
cv2.waitKey()
cv2.imshow('img2',train_set_x_orig[2])
cv2.waitKey()

可知0代表不是猫,1代表是猫。

由于训练的标签结果是Y=(1,209),X将其拉成一个样本一行向量,X=(209,64*64*3)又W*X=Y,故权重W为(64*64*3,1),最终采用的是样本X=(64*64*3,209),W=(64*64*3,1),计算过程中W要采用转置。

先初始化权重W,激活函数采用sigmoid,输出值A;损失函数采用交叉熵,通过链式法则反向求W和b的导数,在更新W和b即可。计算过程中,注意维度的统一,可用assert 判断。

代码如下:

 
import numpy as np
from lr_utils import load_dataset
from matplotlib import pyplot as plt
"""
函数功能:逻辑回归实现小猫分类
"""
import cv2
#sigmoid激活函数
def sigmoid(z):s=1.0/(1+np.exp(-z))return s
#初始化权值
def initialize_zeros(dim):w=np.zeros(dim).reshape(dim,1)b=0return w,b
######w(64*64*3,1)#传播过程
def propagate(w,b,X,Y):m=X.shape[1]A=sigmoid(np.dot(w.T,X)+b)assert np.dot(w.T,X).shape==Y.shapecost=-1/m*(np.dot(Y,np.log(A).T)+np.dot((1-Y),np.log(1-A).T))dw=1/m*(np.dot(X,(A-Y).T))db= 1 / m * (np.sum(A-Y))grads={'dw':dw,'db': db}cost=np.squeeze(cost)return cost,grads
'''
函数功能:更新权重 +迭代次数+学习率 返回最终更新的权重和损失值
'''
def optimize(w,b,X,Y,num_iterations,learning_rate,print_cost=False):costs=[]for i in range(num_iterations):cost, grads = propagate(w, b, X, Y)dw=grads['dw']db=grads['db']w = w - learning_rate * dwb = b - learning_rate * dbif i%100==0:costs.append(cost)if print_cost and i%100==0:print('after iteration %i:%f'%(i,cost))params={'w':w,'b':b}grads = {'dw': dw,'db': db}return params,grads,costs
"""
函数功能:实现利用更新好的权重预测小猫
"""
def predict(w,b,X):m = X.shape[1]Y_prediction=np.zeros((1,m))w=w.reshape(X.shape[0],1)A=sigmoid(np.dot(w.T,X)+b)for i in range(A.shape[1]):if A[0,i]>0.5:Y_prediction[0,i]=1else:Y_prediction[0,i]=0return Y_prediction
"""
函数功能:测试函数,在编写过程中,检查W和b的更新,最终注销掉,不调用
"""
def test():dim = 2w, b = initialize_zeros(dim)print('initialize w,b=', w, b)w, b, X, Y = np.array([[1], [2]]), 2, np.array([[1, 2], [3, 4]]), np.array([[1, 0]])cost, grads = propagate(w, b, X, Y)print('cost=', cost)print('dw=', grads['dw'])print('db=', grads['db'])params, grads, costs = optimize(w, b, X, Y, num_iterations=100, learning_rate=0.009, print_cost=False)print('w', params['w'])print('b', params['b'])print('iterations dw=', grads['dw'])print('iterations db=', grads['db'])print('costs=', costs)Y_prediction = predict(w, b, X)print('Y_prediction=', Y_prediction)def model(X_train,Y_train,X_test,Y_test,num_iterations,learning_rate,print_cost):w,b=initialize_zeros(X_train.shape[0])params, grads,costs=optimize(w,b,X_train,Y_train,num_iterations,learning_rate,print_cost=True)Y_prediction_train=predict(params['w'],params['b'],X_train)Y_prediction_test = predict(params['w'], params['b'], X_test)print('train accuracy is {}'.format(np.mean(Y_prediction_train==Y_train)))print('test accuracy is {}'.format(np.mean(Y_prediction_test==Y_test)))d = {"costs":costs,'w':w,'b':b,'Y_prediction_train':Y_prediction_train,'Y_prediction_test':Y_prediction_test,'learning_rate':learning_rate,'num_iterations':num_iterations}return d
if __name__=='__main__':#test()train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset()##traintrain_set_x_flatten = train_set_x_orig.reshape(train_set_x_orig.shape[0],train_set_x_orig.shape[1] *train_set_x_orig.shape[2] * 3).Ttrain_set_x = train_set_x_flatten / 255.train_set_y_flatten = train_set_y.reshape(train_set_y.shape[0], -1)###testtest_set_x_flatten = test_set_x_orig.reshape(test_set_x_orig.shape[0],test_set_x_orig.shape[1]* test_set_x_orig.shape[2] * 3).Ttest_set_x = test_set_x_flatten / 255.test_set_y_flatten = test_set_y.reshape(test_set_y.shape[0], -1)d=model(train_set_x,train_set_y_flatten,test_set_x,test_set_y_flatten,num_iterations=2000,learning_rate=0.002,print_cost=False)#paint costs lineplt.plot(d['costs'])#print(d['costs'])plt.xlabel('iteration')plt.ylabel('cost')plt.show()#用自带的小猫检测img=cv2.imread('images/my_image2.jpg')imgsize = cv2.resize(img, (64, 64), interpolation=cv2.INTER_CUBIC)cv2.imshow('imgsize', imgsize)cv2.waitKey(0)my_cat=np.array(imgsize.reshape(-1,1))#print(my_cat.shape)My_cat_prediction=predict(d['w'], d['b'], my_cat)print('My_cat_prediction',My_cat_prediction)

打印如下:

测试精度还行,由于样本量少,小猫还是预测错了。

吴恩达作业1:逻辑回归实现猫的分类相关推荐

  1. 吴恩达机器学习之逻辑回归(二分类)

    吴恩达机器学习之逻辑回归 逻辑回归 二分类逻辑回归 二分类逻辑回归案例 python代码实现(含详细代码注释): 案例中几个问题的解析 不同于线性回归,逻辑回归的hθ(x)还需要用sigmoid函数处 ...

  2. 吴恩达机器学习ex2:逻辑回归

    吴恩达机器学习练习二:逻辑回归 1. 逻辑回归(logistic regression) 构建一个可以基于两次测试评分来评估录取可能性的分类模型. 知识点回顾: 1.1 数据可视化 #coding=u ...

  3. 吴恩达机器学习之逻辑回归:逻辑回归的假说表示、判定边界、代价函数、简化的成本函数和梯度下降、高级悠哈、多类别分类之一对多(详细笔记,建议收藏,已有专栏)

    吴恩达机器学习栏目清单 专栏直达:https://blog.csdn.net/qq_35456045/category_9762715.html 文章目录 6.逻辑回归(Logistic Regres ...

  4. 吴恩达机器学习3——逻辑回归、正则化

    机器学习第三周 一.逻辑回归 1. 分类问题 1.1 分类的概念 1.2 使用线性回归来解决分类模型 1.3 逻辑回归模型 1.4 分类边界 2. 逻辑回归模型 logistic regression ...

  5. 吴恩达机器学习:逻辑回归

    在 上一周的课程 里,Andrew Ng 为我们介绍了什么是机器学习以及监督学习中的线性回归.对于一个监督学习,我们要确定我们的 预测函数,代价函数,然后利用梯度下降算法找到 代价函数 最小时,预测函 ...

  6. 吴恩达机器学习 4.逻辑回归(Logistic Regression)

    1.分类问题 在分类问题中,你要预测的变量yyy是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法.在分类问题中,我们尝 ...

  7. 吴恩达机器学习之逻辑回归理论部分

    一.特征函数 对应分类问题,我们先针对二分类问题进行讨论,对应计算机而言,分类即将数据按其特征值不同分为不同的集合,仅对应二分类问题,我们只需考虑分为:正类和负类,为此我们引入特征函数. y=1 - ...

  8. 吴恩达机器学习CS229A_EX2_逻辑回归与正则化_Python3

    逻辑回归 问题描述:特征集为学生的两门课的成绩,标签集为是否被大学录取. 说明: 这里调用 scipy 库函数执行梯度下降的具体迭代,不用手动设置步长和迭代次数,但 cost 如何计算.梯度如何求取需 ...

  9. 吴恩达机器学习(五)逻辑回归练习-二分类练习

    1.基础内容 (1)公式总结: (2)内容回归: 逻辑回归主要是进行二分类和多分类. 二分类中,分为线性可分和线性不可分. 对于线性回归模型,我们定义的代价函数是所有模型误差的平方和.理论上来说,我们 ...

  10. 机器学习-吴恩达-笔记-2-逻辑回归

    目录 分类问题 假说(或模型)表示 判定边界 代价函数 简化代价函数和梯度下降 高级优化 多类别分类:一对多 [此为本人学习吴恩达的机器学习课程的笔记记录,有错误请指出!] 分类问题 在分类问题中,你 ...

最新文章

  1. C++ STL:stack和queue
  2. CentOS 终端显示中文异常解决办法
  3. 解决java.sql.SQLException: Parameter number X is not an OUT parameter--转
  4. ajax传递excel后台接收,前端上传EXCEL文件,后台servlet怎么获取EXCEL中的数据
  5. 速成pytorch学习——9天构建模型的3种方法
  6. spss下载以及安装详细教程
  7. weblogic下载及安装
  8. Emoji表情代码大全
  9. 网络知识:光猫光纤宽带故障排查笔记!
  10. Apache ShenYu源码阅读系列-Divide插件
  11. Java中的其他常用类(Math类,Scanner类、正则表达式)
  12. AUI tab实现页签滑动切换且下拉刷新(下拉固定title栏及tab栏)
  13. adb 安装apk报错Failure [INSTALL_FAILED_TEST_ONLY:]
  14. JAVA pdf中插入自定义图片
  15. C语言课程设计 管理系统
  16. matplotlib报Unknown symbol: \rule, found ‘\‘ (at char 42), (line:1, col:43)
  17. 计算机系统(八):网络层(上篇)
  18. WIN10 + Tensorflow1.12 + Cmake编译 + Bazel编译
  19. 泰迪杯-数据挖掘挑战赛
  20. 用c#编写一个vb 工程源码分析工具(带源码工程下载)

热门文章

  1. python读单行文本求平均值_如何从文本文件python中的数字列表中找到平均值
  2. 组队瓜分百万奖金池,资深算法工程师带你挑战飞桨论文复现赛!
  3. Spring Boot中使用Redis数据库
  4. 智能投放系统之场景分析最佳实践
  5. 论文浅尝 - ACL2020 | 用于实体对齐的邻居匹配网络
  6. Android官方开发文档Training系列课程中文版:分享文件之请求一个共享文件
  7. abp radio表单元素 消失了
  8. Unity5和WebGL移植指南的一些总结
  9. 《人月神话》阅读笔记(三)
  10. AspNetPager 修改 然后返回当前页