手撕代码系列:对率回归

配套的数据和调用库文件在我的博客资源下载中,不知道为啥非要5积分。这个数据就是吴恩达第一课第二周课后编程作业所用的数据集,请同行自行百度下载。

# -*- coding: utf-8 -*-
"""
Created on Sat May 11 19:47:14 2019

@author: Administrator
"""

import numpy as np
import matplotlib.pyplot as plt
import scipy
from scipy import ndimage
from lr_utils import load_dataset


#载入训练数据集和测试数据集
train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset()
#print(train_set_x_orig.shape, train_set_y.shape, test_set_x_orig.shape, test_set_y.shape, classes.shape)

'''
查验数据集内图片
index = 12
plt.imshow(train_set_x_orig[index])
'''


#确定问题的规模
num_train = train_set_x_orig.shape[0]
num_test = test_set_x_orig.shape[0]
size_of_image = train_set_x_orig.shape[1]#图片长宽相等,只要知道一个数值就可以了
#print(num_train,num_test,size_of_image)

#修正训练集和测试集形状
train_set_x_orig_2 = train_set_x_orig.reshape(train_set_x_orig.shape[0], -1).T
test_set_x_orig_2 = test_set_x_orig.reshape(test_set_x_orig.shape[0], -1).T
#print(train_set_x.shape,test_set_x.shape)


#数据归一化
train_set_x = train_set_x_orig_2/255
test_set_x = test_set_x_orig_2/255
#print(train_set_x[0:5, 0])
#print(test_set_x[0:5, 0])


#参数初始化
def init(dim):
    db = 0
    dw = np.zeros((dim, 1))
    #print(dw.shape,db)
    return dw, db
#dw, db = init(train_set_x.shape[0])
#print(dw, db)


#激活函数
def sigmiod(z):
    a = 1/(1+(np.exp(-z)))
    return a
#a = sigmiod(np.array([1,1]))
#print(a)


#前向传播
def forward(w, b, X, Y):
    Num_train = X.shape[1]
#    print(Num_train)
    Z = np.dot(w.T, X) + b
#    print(Z.shape)
    Y_pred = sigmiod(Z)
#    A = np.log(Y_pred)
#    print(Y)
    cost =  -1 / Num_train * np.sum(Y * np.log(Y_pred) + (1 - Y) * np.log(1 - Y_pred))
#    print(cost)
    dw = (1/Num_train) * np.dot(X, (Y_pred-Y).T)
    db = (1/Num_train) * np.sum(Y_pred - Y)
#    assert(dw.shape == w.shape)
#    assert(db.dtype == float)
#    cost = np.squeeze(cost)
#    assert(cost.shape == ())
    grads = {"dw":dw, "db":db}
    return grads, cost
#grads,cost = forward(dw, db, train_set_x, train_set_y)
#print(grads["dw"].shape,grads["db"],cost)
    

def gradientdescent(w, b, X, Y, lr):
#    m = X.shape[0]
    costs=[]
    grads, cost = forward(w, b, X, Y)
    dw = grads["dw"]
    db = grads["db"]
    costs.append(cost)
    w = w - lr*dw
    b = b - lr*db
    parmeters = {"w":w,"b":b}
    return parmeters, grads, costs


def predict(w, b, X):
    w = w.reshape(X.shape[0], 1)
    assert(b.shape == ())
    Z = np.dot(w.T, X) + b
    Y_pred = sigmiod(Z)
    Y_pred.reshape(1, X.shape[1])
    Y_prediction = np.zeros((1,Y_pred.shape[1]))
    for i in range(Y_pred.shape[1]):
        if Y_pred[0, i] <= 0.5:
            Y_prediction[0, i] = 0
        else:
            Y_prediction[0, i] = 1
    assert(Y_prediction.shape == (1,Y_pred.shape[1]))
    return Y_prediction
     


def model(X_train, Y_train, X_test, Y_test, lr, num_iter):
    w, b = init(X_train.shape[0])
    for i in range(num_iter):
        parmeters, grads, costs = gradientdescent(w, b, X_train, Y_train, lr)
        w = parmeters["w"]
        b = parmeters["b"]
#        print(w, b,costs)
    X_train_pred = predict(w, b, X_train)
    X_test_pred = predict(w, b, X_test)
    print("train accuracy: {} %".format(100 - np.mean(np.abs(X_train_pred - Y_train)) * 100))
    print("test accuracy: {} %".format(100 - np.mean(np.abs(X_test_pred - Y_test)) * 100))
    d = {"costs": costs,
         "Y_prediction_test": X_train_pred, 
         "Y_prediction_train" : X_test_pred, 
         "w" : w, 
         "b" : b,
         "learning_rate" : lr,
         "num_iterations": num_iter}
    return d

d = model(train_set_x, train_set_y, test_set_x, test_set_y, num_iter = 2000, lr = 0.005)
        

## START CODE HERE ## (PUT YOUR IMAGE NAME) 用训练好的模型验证一个图片是否是猫
my_image = "my_image2.jpg"   # 将此处改为待验证图片,带格式,验证图片在源代码下的目录images 
## END CODE HERE ##

# We preprocess the image to fit your algorithm.
fname = "images/" + my_image
image = np.array(ndimage.imread(fname, flatten=False))
my_image = scipy.misc.imresize(image, size=(size_of_image,size_of_image)).reshape((1, size_of_image*size_of_image*3)).T#图片的压缩和降维
my_predicted_image = predict(d["w"], d["b"], my_image)#使用之前训练好的参数

plt.imshow(image)
print("y = " + str(np.squeeze(my_predicted_image)) + ", your algorithm predicts a \"" + classes[int(np.squeeze(my_predicted_image)),].decode("utf-8") +  "\" picture.")        

发布了39 篇原创文章 · 获赞 22 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/UEVOLIshy/article/details/90734242