for self-use
目的:识别图片中的是否是猫。
分析:已有训练集及测试集,设计一个简单算法解决此二分类问题。给出的数据集类型为h5,查看知其有三个键,样本数据在train_set_x中,对应标签在train_set_y中。取出样本数据(209,64*64*3)及对应标签(209,1),在处理完维数并标准化数据后,可以开始进行训练。week1要求不高,激活函数使用sigmoid即可。
Code
preprocess
import h5py
import numpy as np
import matplotlib.pyplot as plt
train_data = h5py.File("D:\\DL\\C1WEEK2\\datasets\\train_catvnoncat.h5","r")
test_data = h5py.File("D:\\DL\\C1WEEK2\\datasets\\test_catvnoncat.h5","r")
#取出训练集和测试集
train_data_org = train_data['train_set_x'][:]
train_label_org = train_data['train_set_y'][:]
test_data_org = test_data['test_set_x'][:]
test_label_org = test_data['test_set_y'][:]
#数据维度处理
m_train = train_data_org.shape[0]
m_test = test_data_org.shape[0]
train_data_trans = train_data_org.reshape(m_train,-1).T
test_data_trans = test_data_org.reshape(m_test,-1).T
train_label_tran = train_label_org[np.newaxis,:] #增加一个新的维度 50行变1行50列
test_label_tran = test_label_org[np.newaxis,:]
#标准化数据
train_data_sta = train_data_trans / 255
test_data_sta = test_data_trans / 255
#初始化参数
n_dim = train_data_trans.shape[0]
w = np.zeros((n_dim,1))
b = 0
sigmoid
#定义sigmoid
def sigmoid(z):
a = 1 / (1+np.exp(-z))
return a
forwardPropagation & costFution & gradientDescent
#forward propagation & costFuction & GD
def fwdppg(w,b,X,y):
z = np.dot(w.T,X)+b
A = sigmoid(z)
m = X.shape[1] # 0行,1列
J = -1/m * np.sum(y * np.log(A) + (1-y) * np.log(1-A))
dw = np.dot(X,(A-y).T)/m
db = np.sum(A-y)/m
grads = {'dw':dw,'db':db}
return grads,J
optimize
#优化
def optimize(w,b,X,y,alpha,n_iters,print_cost):
costs = []
for i in range(n_iters):
grads,J = fwdppg(w,b,X,y)
dw = grads['dw']
db = grads['db']
w = w - alpha * dw
b = b - alpha * db
if i % 100 == 0:
costs.append(J)
if print_cost:
print('n_iters is ',i,' cost is ',J)
grads = {'dw':dw,'db':db}
params = {'w':w,'b':b}
return grads,params,costs
predict
#预测
def predict(w,b,X_test):
z = np.dot(w.T,X_test) + b
A = sigmoid(z)
m = X_test.shape[1]
y_pred = np.zeros([1,m])
for i in range(m):
if A[:,i] > 0.5:
y_pred[0,i] = 1
else:
y_pred[0,i] = 0
return y_pred
model
#整合模型
def model(w,b,X_train,y_train,X_test,y_test,alpha,n_iters,print_cost):
grads,params,costs = optimize(w,b,X_train,y_train,alpha,n_iters,print_cost)
w = params['w']
b = params['b']
y_pred_train = predict(w,b,X_train)
y_pred_test = predict(w,b,X_test)
print('The Train Accurancy: ',np.mean(y_pred_train == y_train)*100,'%')
print('The Test Accurancy: ',np.mean(y_pred_test == y_test)*100,'%')
B = {
'w' : w,
'b' : b,
'costs' : costs,
'y_pred_train' : y_pred_train,
'y_pred_test' : y_pred_test,
'alpha' : alpha
}
return B
use it
D = model(w,b,train_data_sta,train_label_tran,test_data_sta,test_label_tran,alpha=0.005,n_iters=2000,print_cost=True)
check the graph
plt.plot(D['costs'])
plt.xlabel('per hundred inters')
plt.ylabel('cost')
try different alpha
alphas = [0.01,0.001,0.0001]
for i in alphas:
print('alpha = ',i)
D = model(w,b,train_data_sta,train_label_tran,test_data_sta,test_label_tran,alpha=i,n_iters=2000,print_cost=False)
print('==========================')
plt.plot(D['costs'],label = str(i))
plt.xlabel('per hundred iters')
plt.ylabel('costs')
plt.legend()
try our own picture
fname = 'C:\\Users\\JUMP_C\\Desktop\\6B31D1B92637CA60CBACF2937FF297A8.gif'
image = plt.imread(fname)
plt.imshow(image)
#看一下图片的格式,把他转换成符合要求的格式
image.shape
from skimage import transform
image_tran = transform.resize(image,(64,64,3)).reshape(64*64*3,1)
image_tran.shape
y = predict(D['w'],D['b'],image_tran)
print(int(y))
于是汤姆猫作为一只猫猫被认可了!
参考:手把手教大家实现吴恩达深度学习作业第二周01_哔哩哔哩_bilibili
这个小姐姐真的太好了