跟我学算法-吴恩达老师的logsitic回归
logistics回归是一种二分类问题,采用的激活函数是sigmoid函数,使得输出值转换为(0,1)之间的概率
A = sigmoid(np.dot(w.T, X) + b ) 表示预测函数
dz = A - Y , A 表示的是预测结果, y 表示的是实际结果
cost = -y*logA - (1-y)*log(1-A) #表示损失函数
dw = np.dot(X, dz.T)/m
db = np.sum(dz)/m
w := w - a*dw # 更新w,a 表示学习率
b : = b - a*db #更新b
第一步: 定义lr_utils.py 导入数据
import numpy as np
import h5py def load_dataset():
train_dataset = h5py.File('datasets/train_catvnoncat.h5', 'r')
train_set_x_orig = np.array(train_dataset['train_set_x'][:])
train_set_y = np.array(train_dataset['train_set_y'][:]) test_dataset = h5py.File('datasets/test_catvnoncat.h5', 'r')
test_set_x_orig = np.array(test_dataset['test_set_x'][:])
test_set_y = np.array(test_dataset['test_set_y'][:]) # 对矩阵预测值的维度构造成(1, train_set_x_orig.shape[0]) 即一张照片一个预测值
train_set_y = train_set_y.reshape((1, train_set_x_orig.shape[0]))
test_set_y = test_set_y.reshape((1, test_set_x_orig.shape[0])) classes = np.array(test_dataset["list_classes"][:]) return train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes
第二步:调用函数,进行数据导入
import numpy as np
import matplotlib.pyplot as plt
import h5py
import scipy
from PIL import Image
from scipy import ndimage
from lr_utils import load_dataset train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset() # 查看图片
index = 7
plt.imshow(train_set_x_orig[7])
plt.show() #训练集的图片个数
m_train = train_set_x_orig.shape[0]
m_test = test_set_x_orig.shape[0]
# 图片的尺寸
num_px = train_set_x_orig.shape[1] # 对每张图片的像素点进行一个竖直排列[x1, x2, x3, x4]
train_set_x_flatten = train_set_x_orig.reshape(m_train, -1).T
test_set_x_flatten = test_set_x_orig.reshape(m_test, -1).T # 进行像素点归一化
train_set_x = train_set_x_flatten / 255
test_set_x = test_set_x_flatten / 255
第三步:定义sigmoid函数和进行参数初始化
def sigmoid(z):
return 1/(1+np.exp(-z)) s = sigmoid(np.array([[0, 2]])) def initialize_with_zeros(dim): w = np.zeros((dim, 1), dtype=float)
b = 0.0 return w, b
第四步:定义反向传播函数
def propgate(w, b, X, Y):
m = X.shape[1]
# 预测函数
A = sigmoid(np.dot(w.T, X) + b)
# 预测函数与真实值之差
dz = A - Y
# A与w的导数
dw = 1/m * np.dot(X, dz.T)
# b与w的导数
db = 1/m * np.sum(dz, axis=1)
#损失函数
cost = np.sum(-Y * np.log(A) - (1 - Y) * np.log(1 - A), axis=1) / m
#更新参数的幅度
grade = {'dw':dw, 'db':db}
#损失函数
cost = np.squeeze(cost) return cost, grade
第5步:通过反向传播函数, 训练样本
# 迭代优化 def optimize(w, b, X, Y, num_iteration, learning_rate, print_cost):
# w, b 为初始参数, X, Y为训练集的变量和标签, num_iteration为训练次数, learning_rate为学习率, print_cost为是否打印
now_num_iteration = 0
costs = []
for i in range(num_iteration): cost, grade = propgate(w, b, X, Y) dw = grade['dw']
db = grade['db'] w = w - learning_rate*dw
b = b - learning_rate*db
now_num_iteration += 1 if i%100 == 0:
costs.append(cost) if print_cost and i%100:
print(cost, i) param = {'w':w,
'b':b}
grade = {'dw':dw,
'db':db}
第6步:定义预测函数,使用的是前向传播函数
def predict(w, b, X):
# w,b表示参数,X表示的是输入的图片,y轴表示图片的数目
# m表示预测的图片的数目
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)
# 概率大于0.5,预测结果为1
for i in range(A.shape[1]):
if A[0, i] > 0.5:
Y_prediction[0, i] = 1 return Y_prediction
第7步:定义最终的训练模型, 输出训练的准确度
def model(train_set_x, train_set_y, test_set_x, test_set_y, num_iteration, learning_rate, print_cost):
m = train_set_x.shape[0]
# 创建初始值
w, b = initialize_with_zeros(m)
costs, param, grade = optimize(w, b,train_set_x, train_set_y,
num_iteration, learning_rate, print_cost)
w = param['w']
b = param['b']
Y_train_prediciton = predict(w, b, train_set_x)
Y_test_prediction = predict(w, b, test_set_x)
# 输出训练的准确度
print('train_accuracy {}'.format(100 - np.mean(np.abs(Y_train_prediciton - train_set_y))*100))
print('test_accuracy {}'.format(100 - np.mean(np.abs(Y_test_prediction - test_set_y ))*100))
d = {'costs':costs,
'Y_train_prediciton':Y_train_prediciton,
'Y_test_prediction':Y_test_prediction,
'w':w,
'b':b,
'learning_rate':learning_rate,
'num_iteration': num_iteration}
return d
第8步:我们挑选一张猫的图片进行预测
# 预测图片
my_image = "cat_1.jpg" # change this to the name of your image file
## END CODE HERE ## # We preprocess the image to fit your algorithm.
fname = "images/" + my_image
image = np.array(ndimage.imread(fname, flatten=False))
# 重构模型大小, 使得模型的shape为(:,1)
my_image = scipy.misc.imresize(image, size=(num_px,num_px)).reshape((1, num_px*num_px*3)).T
# 输出预测的结果
my_predicted_image = predict(d['w'], d['b'], my_image)
plt.imshow(image)
print("y = " + str(np.squeeze(my_predicted_image)) + ", your algorithm predicts a \"" + classes[int(np.squeeze(my_predicted_image)),].decode("utf-8") + "\" picture.")
跟我学算法-吴恩达老师的logsitic回归的更多相关文章
- 跟我学算法-吴恩达老师(超参数调试, batch归一化, softmax使用,tensorflow框架举例)
1. 在我们学习中,调试超参数是非常重要的. 超参数的调试可以是a学习率,(β1和β2,ε)在Adam梯度下降中使用, layers层数, hidden units 隐藏层的数目, learning_ ...
- 跟我学算法-吴恩达老师(mini-batchsize,指数加权平均,Momentum 梯度下降法,RMS prop, Adam 优化算法, Learning rate decay)
1.mini-batch size 表示每次都只筛选一部分作为训练的样本,进行训练,遍历一次样本的次数为(样本数/单次样本数目) 当mini-batch size 的数量通常介于1,m 之间 当 ...
- 机器学习爱好者 -- 翻译吴恩达老师的机器学习课程字幕 http://www.ai-start.com/
机器学习爱好者 -- 翻译吴恩达老师的机器学习课程字幕 GNU Octave 开源 MatLab http://www.ai-start.com/ https://zhuanlan.zhihu ...
- 吴恩达讲了干货满满的一节全新AI课,全程手写板书充满诚意非常干货
吴恩达讲了干货满满的一节全新AI课,全程手写板书充满诚意非常干货 摘要: 目前,AI技术做出的经济贡献几乎都来自监督学习,也就是学习从A到B,从输入到输出的映射.现在,监督学习.迁移学习.非监督学习. ...
- 吴恩达最新TensorFlow专项课程开放注册,你离TF Boy只差这一步
不需要 ML/DL 基础,不需要深奥数学背景,初学者和软件开发者也能快速掌握 TensorFlow.掌握人工智能应用的开发秘诀. 以前,吴恩达的机器学习课程和深度学习课程会介绍很多概念与知识,虽然也会 ...
- 吴恩达(Andrew Ng)——机器学习笔记1
之前经学长推荐,开始在B站上看Andrew Ng的机器学习课程.其实已经看了1/3了吧,今天把学习笔记补上吧. 吴恩达老师的Machine learning课程共有113节(B站上的版本https:/ ...
- 吴恩达深度学习第1课第4周-任意层人工神经网络(Artificial Neural Network,即ANN)(向量化)手写推导过程(我觉得已经很详细了)
学习了吴恩达老师深度学习工程师第一门课,受益匪浅,尤其是吴老师所用的符号系统,准确且易区分. 遵循吴老师的符号系统,我对任意层神经网络模型进行了详细的推导,形成笔记. 有人说推导任意层MLP很容易,我 ...
- 吴恩达深度学习 反向传播(Back Propagation)公式推导技巧
由于之前看的深度学习的知识都比较零散,补一下吴老师的课程希望能对这块有一个比较完整的认识.课程分为5个部分(粗体部分为已经看过的): 神经网络和深度学习 改善深层神经网络:超参数调试.正则化以及优化 ...
- Coursera课程《Machine Learning》吴恩达课堂笔记
强烈安利吴恩达老师的<Machine Learning>课程,讲得非常好懂,基本上算是无基础就可以学习的课程. 课程地址 强烈建议在线学习,而不是把视频下载下来看.视频中间可能会有一些问题 ...
随机推荐
- 牛客网——F小牛再战(博弈,不懂)
链接:https://www.nowcoder.net/acm/contest/75/F来源:牛客网 题目描述 共有N堆石子,已知每堆中石子的数量,两个人轮流取石子,每次只能选择N堆石子中的一堆取一定 ...
- 《BAT前端进阶[师徒班]》学习总结
这是一个培训课 是的,这是一个面向中级前端的培训班,但明显跟传统的填鸭式培训班不太一样.这边的老师都是大牛这是毫无疑问的,而且都是一线开发人员.而且课程一开始就说明了面向了是有1-3年有工作经验的前端 ...
- -webkit新属性 image-set和srcset
响应式图片的作用: 为使用不同分辨率的不同浏览器用户提供适合其浏览环境的图片大小的解决方案. 之前的解决方法是使用@media 但是-webkit新提出的image-set和srcset同样可以解决问 ...
- iOS使用shell脚本注入混淆内容
背景 公司需要做一系列的壳版本,壳版本如果内容雷同提交到App Store会有被拒绝的风险,其中有一种解决方案是在壳版本中注入混淆的代码,防止被苹果检测到内容太过雷同而导致审核被拒绝,本文是针对这个场 ...
- BZOJ4033: [HAOI2015]树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3461 Solved: 1473[Submit][Stat ...
- rabbitmq学习(四):利用rabbitmq实现远程rpc调用
一.rabbitmq实现rpc调用的原理 ·rabbitmq实现rpc的原理是:客户端向一个队列中发送消息,并注册一个回调的队列用于接收服务端返回的消息,该消息需要声明一个叫做correaltionI ...
- Mac下忘记mysql的root密码
cd /usr/local/mysql/bin sudo su sudo /usr/local/mysql/support-files/mysql.server stop # ./mysqld_saf ...
- soql取第一件数据
User u = [select ID,Name from User Limit 1];
- test20181025 Color
题意 分析 自己的想法 可以莫队+平衡树. 对每个颜色维护一颗平衡树,然后移动莫队端点的时候在平衡树中查询. 区间加操作容易实现. 单点修改转化为平衡树的插入删除. 感谢Z前辈的指导. 时间复杂度\( ...
- C#细说多线程(下)
本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发. 其中委托的BeginInvoke方法以及回调函数最为常用.而 I/O线程可能容易 ...