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

思路:输入样本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)

打印如下:

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

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双摄与双目视觉

越来越多的手机开始上双摄,首先解释一下双摄的目的,双摄可以达到什么样的效果。首先双摄可以分为两类,一类是利用双摄获得图像中物体到镜头或者焦距的距离,得到景深信息就可以进行后续的3D重建、图像分割、背景虚化等;…

“脑补”的科学依据:眼前的黑不是黑,靠得是你的大脑

一个在眨眼的婴儿 | 图片来源:Leungcho Pan/Shutterstock撰文:Mindy Weisberger来源:科研圈编译:向菲菲人们常说:“别眨眼,精彩稍纵即逝。”但其实在我们眨眼的时候,精彩仍在我们眼前上演。我们…

基于Sql Server 2008的分布式数据库的实践(三)

配置PHP 1.打开PHP配置文件,找到extensionphp_mssql.dll,将前面的注释符号去掉 2.找到mssql.secure_connection,将Off改为On 3.找到com.allow_dcom true,将前面的注释符号去掉 4.下载正确版本的 ntwdblib.dll (2000.80.194.0)&am…

ORB论文研读与代码实现

首先,ORB算法来自于OpenCV Labs,相比于SIFT和SURF,ORB在使用中不必担心专利的问题。但同时ORB在保证了一定性能的条件下做到了高效。在论文《ORB: An efficient alternative to SIFT or SURF》2011中,ORB在特征点检测和描述子生成…

腾讯发布人工智能辅助翻译,致敬人工翻译

来源:腾讯AI实验室11月13日,深圳 - 腾讯AI Lab今日发布了一款AI辅助翻译产品 - “腾讯辅助翻译”(Transmart),可满足用户快速翻译的需求,用AI辅助人工翻译提高效率和质量。该产品采用业内领先的人机交互式机…

吴恩达作业2 利用两层神经网络实现不同颜色点的分类,可更改隐藏层数量

任务:将400个两种颜色的点用背景色分为两类。 前面的还是建议重点学神经网络知识,至于数据集怎么做的后面在深究,首先先看看数据集,代码如下: def load_planar_dataset():np.random.seed(1)m 400 # number of exampl…

利用tensorflow构建AlexNet模型,实现小数量级的猫狗分类(只有train)

首先看路径: data文件夹分为,model文件夹,train文件夹和文件夹,model文件夹存放模型文件,train存放cat和dog的两个文件夹图片, validation和train一样。config.py存放配置的一些参数,util.py定…

脑网络的可塑性——随时都在发生

来源:神经科技前沿神经元的突起是神经元胞体的延伸部分,由于形态结构和功能的不同,可分为树突(dendrite)和轴突(axon);树突是从胞体发出的一至多个突起,呈放射状。轴突每个神经元只有一根胞体发出轴突的细胞 质部位多呈…

KAZE论文研读

KAZE是发表在ECCV2012的一种特征点检测算法,相比于SIFT和SURF,KAZE建立的高斯金字塔是非线性的尺度空间,采用加性算子分裂算法(Additive Operator Splitting, AOS)来进行非线性扩散滤波。一个很显著的特点是在模糊图像的同时还能保留边缘细节…

简单的线性模型实现tensorflow权重的生成和调用,并且用类的方式实现参数共享

首先看文件路径,line_regression是总文件夹,model文件夹存放权重文件, global_variable.py写了一句话. save_path./model/weight 权重要存放的路径,以weight命名. lineRegulation_model.py代码 import tensorflow as tf "…

comparing ORB and AKAZE

文章全称是《Comparing ORB and AKAZE for visual odometry of unmanned aerial vehicles》。这是一篇来自巴西的文章,没有在百度文库中找到,是在其他博客中给出的链接得到的。从链接的URL可以看出这是一篇来自会议CCIS云计算与智能系统国际会议的文章。…

利用 CRISPR 基因编辑技术,人类正在做七件“疯狂”的事

来源:36Kr编译:喜汤很少有哪种现代科学创新能像CRISPR基因编辑技术一样影响深远。有了它,科学家们可以精确地改变任何细胞的DNA。CRISPR技术成为新宠,部分原因是它比早期基因编辑技术更容易使用。尽管CRISPR还没有彻底大展身手&am…

吴恩达作业3:利用深层神经网络实现小猫的分类

利用4层神经网络实现小猫的分类,小猫训练样本是(209,64*64*312288),故输入节点是12288个,隐藏层节点依次为20,7,5,输出层为1。 首先看文件路径,dnn_utils_v2.py代码是激活…

A-KAZE论文研读

AKAZE是KAZE的加速版本。KAZE在构建非线性空间的过程中很耗时,在AKAZE中将Fast Explicit Diffusion(FED)加入到金字塔框架可以dramatically speed-up。在描述子方面,AKAZE使用了更高效的Modified Local Difference Binary(M-LDB),可以从非线性…

和你抢“饭碗”的40家服务机器人企业大盘点!

来源:物联网智库摘要:本文将对国内近40家服务机器人企业进行汇总介绍,所选企业在其相应版块活跃度较高。从三个大类进行了细分盘点。国家机器人联盟(IFR)根据应用环境将机器人分为了工业机器人和服务机器人。服务机器人…

YOLO9000

YOLO9000是YOLO的第三个版本。前两个版本是YOLO v1,YOLO v2,在CVPR2017的文章《Better,Faster,Stronger》中的前半部分都是对前两个版本的介绍,新的内容主要在Stronger部分。YOLO9000中的9000指的是YOLO可以对超过9000种图像进行分类。 Bett…

吴恩达作业4:权重初始化

权重初始化的 正确选择能够有效的避免多层神经网络传播过程中的梯度消失和梯度爆炸问题,下面通过三个初始化的方法来验证: sigmoid导数函数:最大值小于0.25,故经过多层反向传播以后,会导致最初的层,权重无…

先发制人!Waymo将首推商用载人自动驾驶服务,Uber们怕不怕?

编译:费棋来源:AI科技大本营“真的,真的很难。”11 月举办的一场会议上,Alphabet 旗下 Waymo CEO John Krafcik 对做自动驾驶汽车技术的艰难不无感慨。在他看来,未来几十年内,自动驾驶汽车将一直存在限制&a…

利用ORB/AKAZE特征点进行图像配准

Kp1,kp2都是list类型,两幅图都是500个特征点。这和ORB论文中的数据是一样的。4.4章节 Matches也是list类型,找到325个匹配对。 AKAZE文章中提到一个指标:MS(matching score)# Correct Matches/# Features, 如果overlap area error 小于40%…

吴恩达作业5:正则化和dropout

构建了三层神经网络来验证正则化和dropout对防止过拟合的作用。 首先看数据集,reg_utils.py包含产生数据集函数,前向传播,计算损失值等,代码如下: import numpy as np import matplotlib.pyplot as plt import h5py …