做网站购买服务器吗,做门户网站都需要干什么,青岛栈桥门票多少钱一张,洛阳做网站找哪家思路#xff1a;输入样本X与随机初始权重W相乘#xff0c;利用sigmoid激活函数输出值#xff0c;对于二分类问题#xff0c;用交叉熵损失函数来计算损失值#xff0c;通过交叉熵损失函数利用链式法则求出W和b的偏导#xff0c;梯度下降更新W和b即可#xff0c;#xff…思路输入样本X与随机初始权重W相乘利用sigmoid激活函数输出值对于二分类问题用交叉熵损失函数来计算损失值通过交叉熵损失函数利用链式法则求出W和b的偏导梯度下降更新W和b即可梯度下降又有很多Momentum,Adam等后面在详细介绍剩下的就是迭代次数和学习率的问题。
第一课作业直接给了数据集无须对数据集操作下面是读取数据集的代码数据集链接https://download.csdn.net/download/fanzonghao/10539175
命名为lr_utils.py import numpy as np
import h5pydef load_dataset():train_dataset h5py.File(datasets/train_catvnoncat.h5, r)train_set_x_orig np.array(train_dataset[train_set_x][:]) # your train set featurestrain_set_y_orig np.array(train_dataset[train_set_y][:]) # your train set labelstest_dataset h5py.File(datasets/test_catvnoncat.h5, r)test_set_x_orig np.array(test_dataset[test_set_x][:]) # your test set featurestest_set_y_orig np.array(test_dataset[test_set_y][:]) # your test set labelsclasses np.array(test_dataset[list_classes][:]) # the list of classestrain_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
if __name__ __main__:train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classesload_dataset()print(训练样本数{}.format(train_set_x_orig.shape))print(训练样本对应的标签{}.format(train_set_y_orig.shape))print(前10张训练样本标签{}.format(train_set_y_orig[:,:10]))print(测试样本数{}.format(test_set_x_orig.shape))print(测试样本对应的标签{}.format(test_set_y_orig.shape))print({}.format(classes))可看见打印结果209个样本64x64x3。 下面通过测试代码看看标签0 1 代表的是什么 import cv2
from lr_utils import load_dataset
train_set_x_orig,train_set_y,test_set_x_orig,test_set_y,classesload_dataset()
cv2.imshow(img0,train_set_x_orig[0])
cv2.waitKey()
cv2.imshow(img2,train_set_x_orig[2])
cv2.waitKey() 可知0代表不是猫1代表是猫。
由于训练的标签结果是Y1209X将其拉成一个样本一行向量X(20964*64*3)又W*XY,故权重W为64*64*3,1最终采用的是样本X64*64*3209W64*64*3,1计算过程中W要采用转置。
先初始化权重W激活函数采用sigmoid,输出值A;损失函数采用交叉熵通过链式法则反向求W和b的导数在更新W和b即可。计算过程中注意维度的统一可用assert 判断。
代码如下 import numpy as np
from lr_utils import load_dataset
from matplotlib import pyplot as plt函数功能逻辑回归实现小猫分类import cv2
#sigmoid激活函数
def sigmoid(z):s1.0/(1np.exp(-z))return s
#初始化权值
def initialize_zeros(dim):wnp.zeros(dim).reshape(dim,1)b0return w,b
######w(64*64*3,1)#传播过程
def propagate(w,b,X,Y):mX.shape[1]Asigmoid(np.dot(w.T,X)b)assert np.dot(w.T,X).shapeY.shapecost-1/m*(np.dot(Y,np.log(A).T)np.dot((1-Y),np.log(1-A).T))dw1/m*(np.dot(X,(A-Y).T))db 1 / m * (np.sum(A-Y))grads{dw:dw,db: db}costnp.squeeze(cost)return cost,grads函数功能更新权重 迭代次数学习率 返回最终更新的权重和损失值def optimize(w,b,X,Y,num_iterations,learning_rate,print_costFalse):costs[]for i in range(num_iterations):cost, grads propagate(w, b, X, Y)dwgrads[dw]dbgrads[db]w w - learning_rate * dwb b - learning_rate * dbif i%1000:costs.append(cost)if print_cost and i%1000:print(after iteration %i:%f%(i,cost))params{w:w,b:b}grads {dw: dw,db: db}return params,grads,costs函数功能实现利用更新好的权重预测小猫def predict(w,b,X):m X.shape[1]Y_predictionnp.zeros((1,m))ww.reshape(X.shape[0],1)Asigmoid(np.dot(w.T,X)b)for i in range(A.shape[1]):if A[0,i]0.5:Y_prediction[0,i]1else:Y_prediction[0,i]0return Y_prediction函数功能测试函数,在编写过程中,检查W和b的更新,最终注销掉,不调用def test():dim 2w, b initialize_zeros(dim)print(initialize w,b, w, b)w, b, X, Y np.array([[1], [2]]), 2, np.array([[1, 2], [3, 4]]), np.array([[1, 0]])cost, grads propagate(w, b, X, Y)print(cost, cost)print(dw, grads[dw])print(db, grads[db])params, grads, costs optimize(w, b, X, Y, num_iterations100, learning_rate0.009, print_costFalse)print(w, params[w])print(b, params[b])print(iterations dw, grads[dw])print(iterations db, grads[db])print(costs, costs)Y_prediction predict(w, b, X)print(Y_prediction, Y_prediction)def model(X_train,Y_train,X_test,Y_test,num_iterations,learning_rate,print_cost):w,binitialize_zeros(X_train.shape[0])params, grads,costsoptimize(w,b,X_train,Y_train,num_iterations,learning_rate,print_costTrue)Y_prediction_trainpredict(params[w],params[b],X_train)Y_prediction_test predict(params[w], params[b], X_test)print(train accuracy is {}.format(np.mean(Y_prediction_trainY_train)))print(test accuracy is {}.format(np.mean(Y_prediction_testY_test)))d {costs:costs,w:w,b:b,Y_prediction_train:Y_prediction_train,Y_prediction_test:Y_prediction_test,learning_rate:learning_rate,num_iterations:num_iterations}return d
if __name____main__:#test()train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes load_dataset()##traintrain_set_x_flatten train_set_x_orig.reshape(train_set_x_orig.shape[0],train_set_x_orig.shape[1] *train_set_x_orig.shape[2] * 3).Ttrain_set_x train_set_x_flatten / 255.train_set_y_flatten train_set_y.reshape(train_set_y.shape[0], -1)###testtest_set_x_flatten test_set_x_orig.reshape(test_set_x_orig.shape[0],test_set_x_orig.shape[1]* test_set_x_orig.shape[2] * 3).Ttest_set_x test_set_x_flatten / 255.test_set_y_flatten test_set_y.reshape(test_set_y.shape[0], -1)dmodel(train_set_x,train_set_y_flatten,test_set_x,test_set_y_flatten,num_iterations2000,learning_rate0.002,print_costFalse)#paint costs lineplt.plot(d[costs])#print(d[costs])plt.xlabel(iteration)plt.ylabel(cost)plt.show()#用自带的小猫检测imgcv2.imread(images/my_image2.jpg)imgsize cv2.resize(img, (64, 64), interpolationcv2.INTER_CUBIC)cv2.imshow(imgsize, imgsize)cv2.waitKey(0)my_catnp.array(imgsize.reshape(-1,1))#print(my_cat.shape)My_cat_predictionpredict(d[w], d[b], my_cat)print(My_cat_prediction,My_cat_prediction)
打印如下 测试精度还行,由于样本量少小猫还是预测错了。