您的位置:首页 > 理论基础 > 计算机网络

神经网络与深度学习编程练习(coursera 吴恩达 )(3)

2017-11-01 11:11 761 查看
完整实现多层神经网络识别图片中的猫

coursera课程主页,在网易云课堂中也有课程资源不过没有编程练习。

本次编程利用上次作业中完成的各个函数,完整实现一个多层神经网络,进过训练来识别图片中是否有猫。

代码及训练测试数据下载

代码中没注释,不过coursera里的解释很详细。

import time
import numpy as np
import h5py
import matplotlib.pyplot as plt
import scipy
from PIL import Image
from scipy import ndimage
from dnn_app_utils_v2 import *

plt.rcParams['figure.figsize'] = (5.0, 4.0) # set default size of plots
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'

np.random.seed(1)

train_x_orig,train_y,test_x_orig,test_y,classes=load_dataset()
'''
index=11
plt.imshow(train_x_orig[index])
print('y='+str(train_y[0,index])+",It's a "+classes[train_y[0,index]].decode('utf-8')+' picture.')

plt.show()
'''
m_train=train_x_orig.shape[0]
num_px=train_x_orig.shape[1]
m_test=test_x_orig.shape[0]

print ("Number of training examples: " + str(m_train))
print ("Number of testing examples: " + str(m_test))
print ("Each image is of size: (" + str(num_px) + ", " + str(num_px) + ", 3)")
print ("train_x_orig shape: " + str(train_x_orig.shape))
print ("train_y shape: " + str(train_y.shape))
print ("test_x_orig shape: " + str(test_x_orig.shape))
print ("test_y shape: " + str(test_y.shape))

train_x_flatten=train_x_orig.reshape(train_x_orig.shape[0],-1).T
test_x_flatten=test_x_orig.reshape(test_x_orig.shape[0],-1).T
train_x=train_x_flatten/255
test_x=test_x_flatten/255

print('train_x.shape:'+str(train_x.shape))
print('test_x.shape:'+str(test_x.shape))

n_x=train_x.shape[0]
n_h=7
n_y=1
layers_dims=(n_x,n_h,n_y)

def two_layer_model(X,Y,layers_dims,learning_rate=0.0075,num_iterations=3000,print_cost=False):
np.random.seed(1)
grads={}
costs=[]
m=X.shape[1]
(n_x,n_h,n_y)=layers_dims

parameters=initialize_parameters(n_x,n_h,n_y)

W1=parameters['W1']
b1=parameters['b1']
W2=parameters['W2']
b2=parameters['b2']
ab8d

for i in range(0,num_iterations):
A1,cache1=linear_activation_forward(X,W1,b1,'relu')
A2,cache2=linear_activation_forward(A1,W2,b2,'sigmoid')

cost=compute_cost(A2,Y)

dA2=-(np.divide(Y,A2)-np.divide(1-Y,1-A2))

dA1,dW2,db2=linear_activation_backward(dA2,cache2,'sigmoid')
dA0,dW1,db1=linear_activation_backward(dA1,cache1,'relu')

grads['dW1']=dW1
grads['db1']=db1
grads['dW2']=dW2
grads['db2']=db2

parameters=update_parameters(parameters,grads,learning_rate)

W1=parameters["W1"]
b1=parameters['b1']
W2=parameters['W2']
b2=parameters['b2']

if print_cost and i%100==0:
print("Cost after iteration {}:{}".format(i,np.squeeze(cost)))
if print_cost and i%100==0:
costs.append(cost)
plt.plot(np.squeeze(costs))
plt.ylabel('cost')
plt.xlabel('iterations(per tens)')
plt.title('Learning rate = '+str(learning_rate))

plt.show()
return parameters

layers_dims=[12288,20,7,5,1]

def L_layer_model(X,Y,layers_dims,learning_rate=0.0075,num_iterations=3000,print_cost=False):
np.random.seed(1)
costs=[]

parameters=initialize_parameters_deep(layers_dims)

for i in range(0,num_iterations):
AL,caches=L_model_forward(X,parameters)
cost=compute_cost(AL,Y)
grads=L_model_backward(AL,Y,caches)
parameters=update_parameters(parameters,grads,learning_rate)
if print_cost and i%100==0:
print("Cost after iteration %i:%f"%(i,cost))
if print_cost and i%100==0:
costs.append(cost)
plt.plot(np.squeeze(costs))
plt.ylabel('cost')
plt.xlabel('iterations (per tens)')
plt.title('Learning rate = '+str(learning_rate))

plt.show()
return parameters

parameters = L_layer_model(train_x, train_y, layers_dims, num_iterations = 2500, print_cost = True)
pred_train=predict(train_x,train_y,parameters)
pred_test=predict(test_x,test_y,parameters)

print_mislabeled_images(classes, test_x, test_y, pred_test)

my_image = "my_image.jpg" # change this to the name of your image file
my_label_y = [1] # the true class of your image (1 -> cat, 0 -> non-cat)
## END CODE HERE ##

fname = "images/" + my_image
image = np.array(ndimage.imread(fname, flatten=False))
my_image = scipy.misc.imresize(image, size=(num_px,num_px)).reshape((num_px*num_px*3,1))
my_predicted_image = predict(my_image, my_label_y, parameters)

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


dnn_app_utils_v2及测试训练数据在下载链接里。

运行结果:

随着训练次数增加,cost损失函数下降





测试集中识别错误的图片:



可以测试自己拍的图片:



测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐