识别猫咪AI算法代价函数的所有求导过程

举报
小康不会AI 发表于 2022/09/01 09:19:37 2022/09/01
【摘要】 识别猫咪AI算法代价函数的所有求导过程

识别猫咪AI算法代价函数的所有求导过程

问题阐述:

1.刚学习人工智能的同学,一进来都会莫名其妙地接触到吴恩达老师的猫咪识别项目,这里将贴上一部分代码。

import  numpy as np
import matplotlib.pyplot as plt
import h5py
import skimage.transform as tf
#import torch



def load_dataset():
    train_dataset=h5py.File('datasets/train_catvnoncat.h5','r')
    trainsetX=np.array(train_dataset['train_set_x'][:])
    trainsetY=np.array(train_dataset['train_set_y'][:])

    test_dataset=h5py.File('datasets/test_catvnoncat.h5', "r")
    testsetX=np.array(test_dataset['test_set_x'][:])
    testsetY = np.array(test_dataset['test_set_y'][:])

    classes = np.array(test_dataset['list_classes'][:])

    trainsetY=trainsetY.reshape(1,trainsetY.shape[0])
    testsetY=testsetY.reshape(1,testsetY.shape[0])

    return trainsetX,trainsetY,testsetX,testsetY,classes


def sigmoid(z):

    s=1/(1+np.exp(-z))
    return s

def initdata(dim):
    w=np.zeros((dim,1))
    b=0
    return w,b

def propgate(w,b,X,Y):
    m=X.shape[1]


    A=sigmoid(np.dot(w.T,X)+b)
    cost=-np.sum(Y*np.log(A)+(1-Y)*np.log(1-A))/m


    #反向传播
    dZ=A-Y
    dw=np.dot(X,dZ.T)/m
    db=np.sum(dZ)/m
    grads={
        "dw":dw,
        "db":db
    }
    return grads,cost



train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset()
train_set_x_flatten=train_set_x_orig.reshape(train_set_x_orig.shape[0],-1).T
test_set_x_flatten=test_set_x_orig.reshape(test_set_x_orig.shape[0],-1).T



train_set_x=train_set_x_flatten/255.
test_set_x=test_set_x_flatten/255.

print(test_set_x_flatten.shape)

def optimize(w,b,X,Y,num_iterations,learning_rate,print_cost=False):



    costs=[]
    for i in range(num_iterations):
        grads,cost=propgate(w,b,X,Y)

        dw=grads["dw"]
        db=grads["db"]

        w=w-learning_rate*dw
        b=b-learning_rate*db

        if i%100==0:
            costs.append(cost)
            if print_cost:
                print("优化%i次后的成本是:%f" %(i,cost))



    params={
        "w":w,
        "b":b
    }

    return  params,costs


def predict(w,b,X):
    m=X.shape[1]
    Y_prediction=np.zeros((1,m))

    A=sigmoid(np.dot(w.T,X)+b)

    for i in range(A.shape[1]):
        if A[0,i]>=0.5:
            Y_prediction[0,i]=1

    return Y_prediction



def model(X_train,Y_train,X_test,Y_test,num_iterations=2000,learning_rate=0.5,print_cost=False):
    w,b=initdata(X_train.shape[0])

    parameters,costs=optimize(w,b,X_train,Y_train,num_iterations,learning_rate,print_cost)

    w=parameters["w"]
    b=parameters["b"]

    Y_prediction_train=predict(w,b,X_train)
    Y_prediction_test=predict(w,b,X_test)


    print("对训练图片的预测准确率为: {}%".format(100 - np.mean(np.abs(Y_prediction_train - Y_train)) * 100))
    print("对测试图片的预测准确率为: {}%".format(100 - np.mean(np.abs(Y_prediction_test - Y_test)) * 100))

    d = {"costs": costs,
         "Y_prediction_test": Y_prediction_test,
         "Y_prediction_train": Y_prediction_train,
         "w": w,
         "b": b,
         "learning_rate": learning_rate,
         "num_iterations": num_iterations}

    return d


d=model(train_set_x,train_set_y,test_set_x,test_set_y,num_iterations=2000,learning_rate=0.005,print_cost=True)


问题研究:

很多人可能像小康一样,即使把整体看的明明白白,却不知道以下导数怎么求过来的,因为大多数网站和老师,都是直接选择掠过的,导致很多像小康这样的萌新学生表示摸不着头脑:

    #反向传播
    dZ=A-Y
    dw=np.dot(X,dZ.T)/m
    db=np.sum(dZ)/m

问题解决:

下面我将为大家粘出我的求解过程,过程清晰易懂,比其他博客和老师各种画饼强多了:

51C4358827FD68BDD85B2A4EA34D63A3.png

总结:

总的来说其实就是一步一步的链式求导法则,识别猫咪也就这里比较难懂,希望大家看小康的步骤能够理解哈。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。