做作业的一些代码,持续更新ing~
作业是参考下面的链接的,其中的一些数据集等可以在该链接获取:GitHub - AccumulateMore/CV: ✔(已完结)最全面的 深度学习 笔记【土堆 Pytorch】【李沐 动手学深度学习】【吴恩达 深度学习】
hw1
编写sigmoid函数
这个是sigmoid函数,函数的表达式是:1/1 + e-x
在np.exp(-x)中不要使用math.exp(-x),因为math.exp(-x)当你输入的是向量的话就会报错,所以用np.exp(-x)
注意:np.array([])采用这样的方式来定义,当你有多个向量的话,就用np.array([[1,2,3],[4,5,6],[7,8,9]])这样的方式定义
import math
import numpy as np
def sigmoid(x):
result = 1 / (1 + np.exp(-x))
return result
print(sigmoid(np.array([[1,2,3],[4,5,6],[7,8,9]])))
创建sigmoid_grad函数
计算sigmoid函数相对于其输入x的梯度。表达式是:sigmoid_derivative(x) = σ'(x)= σ(x)(1 - σ(x))
import numpy as np
def sigmoid(x):
x = 1 / (1 + np.exp(-x))
return x
result = sigmoid(np.array([1,2,3]))*(1 - sigmoid(np.array([1,2,3])))
print(result)
实现image2vector()
该输入采用维度为(length, height, depth)的输入,并返回维度为(length * height * depth, 1)的向量(相当于将高维向量展开成为一个1维向量)。
shape函数返回的是你的当前向量的维度大小,例如(3,3,2)代表着有三个元素,每个元素是3*2的矩阵。
def image2vector(image):
"""
Argument:
image -- a numpy array of shape (length, height, depth)
Returns:
v -- a vector of shape (length*height*depth, 1)
"""
v = image.reshape(image.shape[0] * image.shape[1] * image.shape[2], 1)
return v
image = np.array([[[ 0.67826139, 0.29380381],
[ 0.90714982, 0.52835647],
[ 0.4215251 , 0.45017551]],
[[ 0.92814219, 0.96677647],
[ 0.85304703, 0.52351845],
[ 0.19981397, 0.27417313]],
[[ 0.60659855, 0.00533165],
[ 0.10820313, 0.49978937],
[ 0.34144279, 0.94630077]]])
执行 normalizeRows()来标准化矩阵的行
将此函数应用于输入矩阵x之后,x的每一行应为单位长度(即长度为1)向量。
import numpy as np
def normalizeRows(x):
x_norm = np.linalg.norm(x, axis = 1, keepdims = True)
return x/x_norm
x = np.array([
[0, 3, 4],
[1, 6, 4]])
print("normalizeRows(x) = " + str(normalizeRows(x)))
softmax函数:模型对于每个类别的预测概率
softmax函数会接受一个向量(或者一组原始预测值),然后输出一个同样长度的新向量,其中每个元素的值介于0到1之间,并且所有元素的和为1。这样,输出向量的每个元素可以被解释为模型对于每个类别的预测概率
softmax的函数表达式如下所示:
def softmax(x):
"""Calculates the softmax for each row of the input x.
Your code should work for a row vector and also for matrices of shape (n, m).
Argument:
x -- A numpy matrix of shape (n,m)
Returns:
s -- A numpy matrix equal to the softmax of x, of shape (n,m)
"""
x_exp = np.exp(x)
x_sum = np.sum(x_exp, axis = 1, keepdims = True)
print(x_exp.shape)
print(x_sum.shape)
s = x_exp / x_sum
return s
hw2
识别输入的图像是否是猫,步骤按照下面进行
下面的操作是在jupyter环境中使用的
导入需要使用的包
import numpy as np
import matplotlib.pyplot as plt
from lr_utils import load_dataset
%matplotlib inline
导入数据集
在下载的数据集文件目录下创建jupyter文件
-
train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset() # load_dataset在wed_dataseet/wed/lr_utils.py中,可以查看是如何加载数据的,具体的load_dataset代码如下:
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_dataset数据集中取出所有键为train_set_x的y值,并将这些值转换为numpy数值
train_set_y_orig = 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_dataset数据集中取出所有键为train_set_x的y值,并将这些值转换为numpy数值
test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # 同理
classes = np.array(test_dataset["list_classes"][:]) # 表示图片是不是猫,结果是'non-cat'或'cat'
train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0])) # 将train_set_y_orig
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
查看训练数据集以及测试集中的图片数据
index = 5
plt.imshow(train_set_x_orig[index]) # 要显示的图像数据,index=5查看的就是第五张图片
print ("y = " + str(train_set_y[:, index]) + ", it's a '" + classes[np.squeeze(train_set_y[:, index])].decode("utf-8") + "' picture.") # y = [0]表示的是不是猫,y = [1]表示的是这是猫
查看数据集中的图片的数量以及图片的长度和宽度
m_train = train_set_x_orig.shape[0]
m_test = test_set_x_orig.shape[0]
num_px = train_set_x_orig.shape[1]
num_py = train_set_x_orig.shape[2]
# shape[0]表示的是数据集中包含多少张图像
# shape[1]表示的是图像有多少行(即图像