吴恩达第二周编程作业补充
![](https://i-blog.csdnimg.cn/blog_migrate/a1312825bc143bd41b7ba461d52b6f2a.png)
209表示训练集数量,64表示长宽,3表示RGB
50表示测试集数量
shape[0],shape[1],shape[2],shape[3]
1、测试集与训练集的划分:
- 避免过拟合(在训练集表现的好,测试集表现的不好),在训练集上训练模型,在测试集上评估模型的泛化能力。
- 预测值和实际值的差别用来衡量模型的预测性能。
2、压缩像素
org代表预处理,机器学习中一个常见的预处理步骤是对数据集进行居中和标准化,这意味着可以减去每个示例中整个numpy数组的平均值,然后将每个示例除以整个numpy数组的标准偏差。对于图片数据集,更简单方便,几乎可以将数据集的每一行除以255(像素通道的最大值),得到标准化数据,位于[0,1]间。
"""
为了表示彩色图像,必须为每个像素指定红色,绿色和蓝色通道(RGB),因此像素值实际上是从0到255范围内的三个数字的向量。
机器学习中一个常见的预处理步骤是对数据集进行居中和标准化,这意味着可以减去每个示例中整个numpy数组的平均值,
然后将每个示例除以整个numpy数组的标准偏差。但对于图片数据集,
它更简单,更方便,几乎可以将数据集的每一行除以255(像素通道的最大值),因为在RGB中不存在比255大的数据,
所以我们可以放心的除以255,让标准化的数据位于[0,1]之间,现在标准化我们的数据集:
像素值位于0到1之间
"""
train_set_x = train_set_x_flatten / 255
test_set_x = test_set_x_flatten / 255
3、使用公式
前向传播:
反向传播:
4、reshape()的使用
- 注意括号
- 下面两种用法结果是不一样的:
>>> a = np.random.rand(2,3)
>>> a.T
array([[0.45372209, 0.45144343],
[0.11429983, 0.9902159 ],
[0.19452138, 0.86151426]])
>>> a.reshape(3,2)
array([[0.45372209, 0.11429983],
[0.19452138, 0.45144343],
[0.9902159 , 0.86151426]])
5、建立神经网络的主要步骤
1.定义模型结构(例如输入特征的数量)
2.初始化模型的参数
3.循环:
3.1 计算当前损失(正向传播)
3.2 计算当前梯度(反向传播)
3.3 更新参数(梯度下降)
6、numpy的一些方法
- np.dot(a,b) 求内积,这里的a和b可以是数组,列表,字典或者向量
- np.exp(-z) == e^(-z)
- np.zeros((m, 1)) 注意括号
- np.sum(w) 最后得到的结果是一个数
- np.array([[1], [2]]), np.array([[1, 2], [3, 4]]), np.array([[1, 0]])
- np.squeeze(x), [x]->x, 压缩维度
7、不同学习率
# 制作折线图对比不同学习率
learning_rates = [0.01, 0.001, 0.0001]
models = {}
for i in learning_rates:
print("learning rate is: " + str(i))
models[str(i)] = model(train_set_x, train_set_y, test_set_x, test_set_y, num_iterations = 1500, learning_rate = i, print_cost = False)
print('\n' + "-------------------------------------------------------" + '\n')
for i in learning_rates:
# 注意,这个label和legend是相连使用的
plt.plot(np.squeeze(models[str(i)]["costs"]), label=str(models[str(i)]["learning_rate"]))
plt.ylabel('cost')
plt.xlabel('iterations')
legend = plt.legend(loc='upper center', shadow=True) # shadow设置背景为灰色
frame = legend.get_frame() # 获得背景
frame.set_facecolor('0.90') # 设置背景透明度
plt.show()
运行结果:
8、其他
scipy.misc.imresize在1.3版本后已经被删除了,现在已被代替
9、补充
前提:
X.shape=(Nx,m) W.shape=(Nx,1)
Y.shape=(1,m) Z.shape=(1,m)
b是一个数
A为预测值,=Y^
流程:
加载数据
定义sigmoid函数,初始化参数w,b
前向传播求出代价函数,后向传播求出dw,db
优化 进行多次迭代,不断更新w,b,返回w,b,dw,db
预测 使用sigmoid进行预测,大于0.5,=1,小于0.5,=0,返回预测行矩阵
模型整合 ,预测值与真实值进行比对
1. 使用了h5py模块作为打开.h5文件的工具; .h5文件里一般以键值对方式进行存储
2. train_set_x_orig是图片样式,即是X矩阵
train_set_y_orig是预测标签,即是Y矩阵
train_set_x_orig :保存的是训练集里面的图像数据(本训练集有209张64x64的图像)。
train_set_y_orig :保存的是训练集的图像对应的分类值(【0 | 1】,0表示不是猫,1表示是猫)。
test_set_x_orig :保存的是测试集里面的图像数据(本训练集有50张64x64的图像)。
test_set_y_orig : 保存的是测试集的图像对应的分类值(【0 | 1】,0表示不是猫,1表示是猫)。
classes : 保存的是以bytes类型保存的两个字符串数据,数据为:[b’non-cat’ b’cat’]。
3. 因为Y预测矩阵在打开时,其shape为(209,),该种方式不规范,应调整为shape(1,209)
有两种方式解决该问题:
train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))
# 在前面增加一维,变成(1,209)
train_set_y_orig = train_set_y_orig.reshape[np.newaxis,:]
4. 若想查看.h5文件的内容可用如下方式:
for key in train_dataset.keys():
print(f’train_dataset[{key}].name=’,train_dataset[key].name)
print(f’train_dataset[{key}].shape=’,train_dataset[key].shape)
print(f’train_dataset[{key}].value=’,train_dataset[key].value)
5. plt.imshow()是用来打开图片的,后面需要跟着plt.show()
6. np.squeeze()压缩维度,[1] --> 1
7. 因为classes里保存的是bytes类型的,要想将其转成正常str,需要先对其进行解码
8. train_set_x_orig.shape=(209,64,64,3)
209为样本个数(m),后面为RGB
想要将其调整为正常X.shape=(Nx,m),使用:
train_set_x_orig.reshape(train_set_x_orig.shape[0], -1).T
9. 标准化,数据之间差距太大,影响性能,要降低差别,所以标准化到(0,1)之间,/255
10. 在逻辑回归中权重参数可以初始化为0,在神经网络中不可
11. dw和db求的是 和平均
12. 预测值与真实值进行比对
两种方法:
print(“训练集准确性:”, format(100 - np.mean(np.abs(Y_prediction_train - Y_train)) * 100), “%”)
print(“训练集准确性:”, np.mean(Y_prediction_train==Y_train)*100, “%”)
13. 学习率
当学习率过大的时候会导致模型难以收敛,过小的时候会收敛速度过慢,学习率是一个十分重要的参数,合理的学习率才能让模型收敛到最小点而非局部最优点或鞍点
学习率越低,损失函数的变化速度就越慢,容易过拟合