配套的数据和调用库文件在我的博客资源下载中,不知道为啥非要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.")