题目:构建一个深层神经网络来识别猫,训练集文件train_catvnoncat.h5和测试集test_catvnoncat.h5。
所需资源和包:
链接: https://pan.baidu.com/s/1pslul3qqeU2QvKptTtEOhQ 提取码: 348w
所需库:
import numpy as np
import h5py
import matplotlib.pyplot as plt
from dnn_utils import sigmoid, sigmoid_backward, relu, relu_backward
import lr_utils
一:数据准备
在lr_utils.py中读取所需训练数据和测试数据:
import numpy as np
import h5py
def load_dataset():
train_dataset = h5py.File('./train_catvnoncat.h5', "r")
train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set features
train_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labels
test_dataset = h5py.File('./test_catvnoncat.h5', "r")
test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set features
test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labels
classes = np.array(test_dataset["list_classes"][:]) # the list of classes
train_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
二:训练过程:
分为前向激活传播 计算代价函数 反向激活传播 更新参数:
初始化权重矩阵和偏置项。
解析:此处通过layers_dims设置每一隐藏的节点个数,利用 for l in range(1,L)计算每一个隐藏层的W和B
def initialize_parameters_deep(layers_dims):
"""
此函数是为了初始化多层网络参数而使用的函数。
参数:
layers_dims - 包含我们网络中每个图层的节点数量的列表
返回:
parameters - 包含参数“W1”,“b1”,...,“WL”,“bL”的字典:
W1 - 权重矩阵,维度为(layers_dims [1],layers_dims [1-1])
bl - 偏向量,维度为(layers_dims [1],1)
"""
np.random.seed(3)
parameters = {}
L = len(layers_dims)
for l in range(1,L):
parameters["W" + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) / np.sqrt(layers_dims[l - 1])
parameters["b" + str(l)] = np.zeros((layers_dims[l], 1))
#确保我要的数据的格式是正确的
assert(parameters["W" + str(l)].shape == (layers_dims[l], layers_dims[l-1]))
assert(parameters["b" + str(l)].shape == (layers_dims[l], 1))
return parameters
前向激活传播:
分为
1:def linear_forward(A,W,b) 前向传播通过A【L-1】得到Z【L】
2:def linear_activation_forward(A_prev,W,b,activation) 调用 linear_forward(A,W,b) 完成前向传播并计算激活函数得到A【L】,
3:def L_model_forward(X,parameters) 完整的过程
解析:
对于L个隐藏层,每一个隐藏层计算前向传播通过A【L-1】得到Z【L】,并利用relu得到A【L】.
对于输出层,前向传播通过A【L】得到Z【L+1】,利用sigmod得到A【L