吴恩达深度学习第一课--第二周神经网络基础作业下代码实现
文章目录
- 需要的库文件
- 步骤
- 取出训练集、测试集
- 了解训练集、测试集
- 查看图片
- 数据维度处理
- 标准化数据
- 定义sigmoid函数
- 初始化参数
- 定义前向传播函数、代价函数及梯度下降
- 优化部分
- 预测部分
- 模型的整合--合并 优化和预测模块
- 完整代码
需要的库文件
import numpy as np #矩阵运算
import matplotlib.pyplot as plt #绘图
import h5py #读取h5文件
步骤
按照如下步骤来实现Logistic:
1、定义模型结构
2、初始化模型参数
3、循环
3.1、前向传播
3.2、计算损失
3.3、后向传播
3.4、更新参数
4、整合成为一个完整的模型
取出训练集、测试集
train_dataset = h5py.File('D:\\20200112zhaohuan\\software\\pycharm\\code\\hello\\train_catvnoncat.h5', 'r')
test_dataset = h5py.File('D:\\20200112zhaohuan\\software\\pycharm\\code\\hello\\test_catvnoncat.h5', 'r')
了解训练集、测试集
for key in train_dataset:print(key)
print(train_dataset['train_set_x'].shape)
print(train_dataset['train_set_y'].shape)
#print(train_dataset['train_set_x'][:])print(test_dataset['test_set_x'].shape)
print(test_dataset['test_set_y'].shape)
#print(test_dataset['test_set_x'][:])
得出训练集数据维度是(209,64,64,3)、测试集数据维度是(50,64,64,3)。训练集标签维度是(209,),测试集标签维度是(50,)
查看图片
plt.imshow(train_data_org[176])
数据维度处理
m_train = train_data_org.shape[0] #得到样本m=209
m_text = text_data_org.shape[0] #得到样本m=50train_data_tran = train_data_org.reshape(m_train,-1).T
test_data_tran = text_data_org.reshape(m_text,-1).Tprint(train_data_tran.shape,test_data_tran.shape)train_lables_tran = train_lables_org[np.newaxis,:]
test_lables_tran = text_lables_org[np.newaxis,:]print(train_lables_tran.shape,test_lables_tran.shape)
得出训练集数据维度是(12288,209),测试集数据维度是(12288,50)。训练集标签维度是(1,209),测试集标签维度是(1,50)。
标准化数据
因为每个值在0~255之间,将所有值除以255,这样每个值之间的差距就非常小。
train_data_sta = train_data_tran/255
test_data_sta = test_data_tran/255
定义sigmoid函数
sigmoid函数:a=δ(z)=11+e−z\delta(z)=\frac{1}{1+e^{-z}}δ(z)=1+e−z1
def sigmoid(z):#输入z,得到经过sigmoid后的值aa = 1/(1+np.exp(-z))return a
初始化参数
n_dim = train_data_sta.shape[0] #得到特征长度n
print(n_dim) #12288
w = np.zeros((n_dim,1)) #初始化nx1维矩阵w
b = 0 #初始化实数b
定义前向传播函数、代价函数及梯度下降
前向传播函数:Z=wTX+bw^TX+bwTX+b;A=sigmoid(Z)
代价函数:J=−1m∑i=1m[Y∗logA+(1−Y)∗log(1−A)]-\frac{1}{m}\sum_{i=1}^m[Y*logA+(1-Y)*log(1-A)]−m1∑i=1m[Y∗logA+(1−Y)∗log(1−A)]
梯度下降:dw=∂L(A,Y)∂w=1mX(A−Y)T;db=∂L(A,Y)∂b=1mnp.sum(A−Y);W=W−αdw;b=b−αdbdw=\frac{\partial L(A,Y)}{\partial w}=\frac{1}{m}X(A-Y)^T;db=\frac{\partial L(A,Y)}{\partial b}=\frac{1}{m}np.sum(A-Y);W=W-\alpha dw;b=b-\alpha dbdw=∂w∂L(A,Y)=m1X(A−Y)T;db=∂b∂L(A,Y)=m1np.sum(A−Y);W=W−αdw;b=b−αdb
def propagate(w,b,X,Y):#输入:权重w,实数b,数据集x,标签y。#输出:对w的偏导dw,对b的偏导db,将其装进字典grands。#返回:grands和代价值j#1.前向传播函数z = np.dot(w.T,X)+bA = sigmoid(z)#2.代价函数m = X.shape[1] #样本数mJ = -1/m * np.sum(Y*np.log(A)+(1-Y)*np.log(1-A))#3.梯度下降dw = 1/m * np.dot(X,(A-Y).T)db = 1/m * np.sum(A-Y)grands = {'dw':dw,'db':db}return grands,J
优化部分
def optimize(w,b,X,y,alpha,n_iters):#输入:权重w,实数b,数据集x,标签集y,学习效率alpha,特征数n_iters=12288#输出:对w的偏导dw,对b的偏导db,将其装进字典grands。修正后的w和b,将其装进字典params。每隔100记录一次代价值,将其装进数组costs。#返回:grands、params、costs。costs = [] #保存代价函数值,为了后面绘出代价函数图形for i in range(n_iters):grands,J = propagate(w,b,X,y)dw = grands['dw']db = grands['db']w = w - alpha * dwb = b - alpha * dbif i % 100 == 0:costs.append(J)print('n_iters is ',i,',cost is ',J)grands = {'dw': dw, 'db': db}params = {'w': w, 'b': b}return grands,params,costs
预测部分
def predict(w,b,X_test):#输入:权重w,实数b,测试数据x_test#输出:预测矩阵y_pred(值要么为1,要么为0)z = np.dot(w.T, X_test) + bA = sigmoid(z)m = X_test.shape[1]y_pred = np.zeros((1,m)) #初始化维度为1xm的y_pred矩阵for i in range(m):if A[:,i] > 0.5: y_pred[:,i] = 1else:y_pred[:,i] = 0return y_pred
模型的整合–合并 优化和预测模块
def model(w,b,X_train,Y_train,X_test,Y_test,alpha,n_iters):#输入:权重w,实数b,训练数据集X_train,训练标签集Y_train,测试数据集X_test,测试标签集Y_test,学习效率alpha,特征值n_iters=12288。#输出:数据字典bgrands,params,costs = optimize(w, b, X_train, Y_train, alpha, n_iters)w = params['w']b = params['b']y_pred_train = predict(w,b,X_train)y_pred_test = predict(w,b,X_test)print('the train acc is ', np.mean(y_pred_train == Y_train)*100,'%')print('the test acc is ', np.mean(y_pred_test == Y_test)*100,'%')b={'w':w,'b':b,'costs':costs,'y_pred_train':y_pred_train,'y_pred_test':y_pred_test,'alpha':alpha} #用数据字典返回,格式类似jsonreturn b
完整代码
import numpy as np
import matplotlib.pyplot as plt
import h5py
from skimage import transform # 用来调整自己图片的大小# 取出训练集、测试集
train_dataset = h5py.File('D:\\20200112zhaohuan\\software\\pycharm\\code\\hello\\train_catvnoncat.h5','r')
test_dataset = h5py.File('D:\\20200112zhaohuan\\software\\pycharm\\code\\hello\\test_catvnoncat.h5','r')# 了解训练集、测试集的key
for key in train_dataset:print(key)# list_classes# train_set_x# train_set_y
for key in test_dataset:print(key)# list_classes# test_set_x# test_set_y# 取出训练数据集train_data_org、训练标签集train_labels_org、测试数据集test_data_org、测试标签集test_labels_org
train_data_org = train_dataset['train_set_x'][:]
train_labels_org = train_dataset['train_set_y'][:]test_data_org = test_dataset['test_set_x'][:]
test_labels_org = test_dataset['test_set_y'][:]print(train_data_org.shape,train_labels_org.shape,test_data_org.shape,test_labels_org.shape)# 查看图片
plt.imshow(train_data_org[150])# 数据维度处理
m_train = train_data_org.shape[0] # 209
m_test = test_data_org.shape[0] # 50
print(m_train,m_test)
train_data_tran = train_data_org.reshape(m_train,-1).T
test_data_tran = test_data_org.reshape(m_test,-1).Ttrain_lables_tran = train_labels_org[np.newaxis,:]
test_lables_tran = test_labels_org[np.newaxis,:]print(train_data_tran.shape,test_data_tran.shape,train_lables_tran.shape,test_lables_tran.shape)# 标准化数据
train_data_sta = train_data_tran/255
test_data_sta = test_data_tran/255# 定义sigmoid函数
def sigmoid(z):a = 1/(1+np.exp(-z))return a# 初始化参数w,b
n_iters = train_data_sta.shape[0] #12288
w = np.zeros((n_iters,1))
b = 0# 定义前向传播函数、代价函数及梯度下降。
def propagate(w,b,X,Y):# 输入:权重w,实数b,数据集x,标签集y。# 输出:对w的偏导dw,对b的偏导db,将其装进字典grands。# 返回:grands和代价值j# 1.前向传播函数Z = np.dot(w.T,X)+bA = sigmoid(Z)# 2.代价函数m = X.shape[1]J = -1/m * np.sum(Y * np.log(A) + (1-Y)*np.log(1-A))# 3.梯度下降dw = 1/m*np.dot(X,(A-Y).T)db = 1/m*np.sum(A-Y)grands={'dw':dw,'db':db}return grands,J# 优化部分
def optimize(w,b,X,Y,alpha,n_iters):# 输入:权重w,实数b,数据集X,标签集Y,学习效率alpha,特征数n_iters=12288# 输出:对w的偏导dw,对b的偏导db,将其装进字典grands。修正后的w和b,将其装进字典params。每隔100记录一次代价值,将其装进数组costs。# 返回:grands、params、costscosts=[]for i in range(n_iters):grands, J = propagate(w, b, X, Y)dw = grands['dw']db = grands['db']w = w - alpha*dwb = b - alpha*dbif i%100==0:costs.append(J)print('n_iters is ',i,'cost is',J)grands = {'dw':dw,'db':db}paras = {'w':w,'b':b}return grands,paras,costs# 预测部分
def predict(w,b,X):# 输入:权重w,实数b,数据集X# 输出:预测矩阵y_pred(值要么为1,要么为0)Z = np.dot(w.T, X) + bA = sigmoid(Z)m = X.shape[1]y_pred = np.zeros((1,m))for i in range(m):if A[:,i]>0.5:y_pred[:,i]=1else:y_pred[:,i]=0return y_pred# 模型的整合
def model(w,b,X_train,Y_train,X_test,Y_test,alpha,n_iters):# 输入:权重w,实数b,训练数据集X_train,训练标签集Y_train,测试数据集X_test,测试标签集Y_test,学习效率alpha,特征值n_iters=12288。# 输出:数据字典rsgrands,paras,costs = optimize(w, b, X_train, Y_train, alpha, n_iters)w = paras['w']b = paras['b']y_pred_train = predict(w,b,X_train)y_pred_test = predict(w,b,X_test)print('the train acc is ', np.mean(y_pred_train == Y_train)*100,'%')print('the test acc is ', np.mean(y_pred_test == Y_test)*100,'%')rs = {'w':w,'b':b,'costs':costs,'y_pred_train':y_pred_train,'y_pred_test':y_pred_test,'alpha':alpha}return rsrs = model(w,b,train_data_sta,train_lables_tran,test_data_sta,test_lables_tran,alpha=0.005,n_iters=2000)
plt.plot(rs['costs'])
plt.xlabel('per hundred iters')
plt.ylabel('cost')# 自我检测一下
index = 2
print('y is ',train_lables_tran[0,index])
print('y_pred is ',rs['y_pred_train'][0,index])
plt.imshow(train_data_org[index])# 用自己电脑里面的图片来检测一下
from skimage import transform
fname = 'D:\\20200112zhaohuan\\tim.jpg'
image = plt.imread(fname,'rb')
plt.imshow(image)
print(image.shape)
image_tran = transform.resize(image,(64,64,3)).reshape(64*64*3,1)
print(image_tran.shape)
y = predict(rs['w'],rs['b'],image_tran)
print(int(y))
吴恩达深度学习第一课--第二周神经网络基础作业下代码实现相关推荐
- 吴恩达深度学习第一课--第二周神经网络基础作业上正反向传播推导
文章目录 正向传播推导 第i个样本 向量化(从个别到整体) 判断向量维度 将原始数据进行整合 反向传播推导 第i个样本 损失函数 代价函数 梯度下降法(实则是多元函数求微分) 向量化(从个别到整体) ...
- 吴恩达深度学习第一课第三周编程作业(上)
作业描述: 用1层隐藏层的神经网络分类二维数据 欢迎来到第3周的编程作业. 现在是时候建立你的第一个神经网络了,它将具有一层隐藏层. 你将看到此模型与你使用逻辑回归实现的模型之间的巨大差异. 你将学到 ...
- 花书+吴恩达深度学习(一)前馈神经网络(多层感知机 MLP)
目录 0. 前言 1. 每一个神经元的组成 2. 梯度下降改善线性参数 3. 非线性激活函数 4. 输出单元 4.1. 线性单元 4.2. sigmoid 单元 4.3. softmax 单元 5. ...
- 花书+吴恩达深度学习(十三)卷积神经网络 CNN 之运算过程(前向传播、反向传播)
目录 0. 前言 1. 单层卷积网络 2. 各参数维度 3. CNN 前向传播反向传播 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十)卷积神经网络 ...
- 花书+吴恩达深度学习(十一)卷积神经网络 CNN 之池化层
目录 0. 前言 1. 最大池化(max pooling) 2. 平移不变形 3. 其他池化函数 4. 卷积和池化作为一种无限强的先验 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常 ...
- 花书+吴恩达深度学习(十)卷积神经网络 CNN 之卷积层
目录 0. 前言 1. 2D 图像卷积 2. 3D 图像卷积 3. 过滤器(核函数) 4. 过滤器应用于边缘检测 5. padding 填充 6. stride 步长 7. 使用卷积的动机 8. 1乘 ...
- 吴恩达深度学习课程笔记之卷积神经网络(2nd week)
0 参考资料 [1] 大大鹏/Bilibili资料 - Gitee.com [2] [中英字幕]吴恩达深度学习课程第四课 - 卷积神经网络_哔哩哔哩_bilibili [3] 深度学习笔记-目录 ...
- 吴恩达深度学习-Course4第三周作业 yolo.h5文件读取错误解决方法
这个yolo.h5文件走了不少弯路呐,不过最后终于搞好了,现在把最详细的脱坑过程记录下来,希望小伙伴们少走些弯路. 最初的代码是从下面这个大佬博主的百度网盘下载的,但是h5文件无法读取.(22条消息) ...
- 吴恩达深度学习网课小结
Coursera上吴恩达的深度学习网课,很适合那些想了解和学习深度学习的人来入门. 这个深度学习的专项网课共包含了五门课,包含了神经网络.卷积神经网络(CNN).循环神经网络(RNN).长短期记忆网络 ...
最新文章
- cell 滑动实现旋转动画效果
- PHP的词法解析器:re2c
- 一段挂起进程中所有线程的代码
- Dart 3-Day
- Dubbo(十五)springboot工程dubbo整合SpringCloud Hystrix
- Scala 深入浅出实战经典 第81讲:Scala中List的构造是的类型约束逆变、协变、下界详解...
- android之module删除不干净
- sublime text3神器插件
- echarts 可拖拽线条
- python爬取qq空间相册图片_如何用 Python 爬取 QQ 空间说说和相册?
- VMware虚拟机双屏显示
- 模拟电路设计(39)---一文搞懂直流电源EMI滤波器
- Keep不甘做“工具人”
- 小程序 订阅消息 原来就是如此
- 乐行天下激光雷达文件升级及wifi配置(Android系统版本)
- 2021年淘宝双11超级红包规则介绍
- java、vue实现微信网页分享
- 西安工业大学计算机学院研究生招生简章,西安工业大学计算机技术在职研究生招生简章...
- Linux实战教学笔记28:企业级LNMP环境应用实践
- Android:滤镜效果ColorMatrix用法一