简单的一层DNN:
import numpy as np def nonlin(x,deriv=False): if deriv==True: return x*(1-x) return 1/(1+np.exp(-x)) X=np.array([[0,1,1],[1,1,0],[1,0,1],[1,1,1]]) y=np.array([[0,0,1,1]]).T np.random.seed(1) w=2*np.random.random((3,1))-1 for iter in range(10000): l0=X l1=nonlin(np.dot(l0,w)) l1_error=y-l1 #实际值与预测值之间的差值,差值越大,调整力度越大 l1_grad=l1_error*nonlin(l1,True) #用差值当权重,差值越小,梯度相应较小,调整力度较小 w=w+np.dot(l0.T,l1_grad) print('result') print(l1) #print(l1_grad) print(y)
简单的两层DNN:
import numpy as np def nonlin(x,deriv=False): if deriv==True: return x*(1-x) return 1/(1+np.exp(-x)) X=np.array([[1,0,0],[0,1,0],[1,0,1],[1,1,0]]) #输入数据 y=np.array([[0,0,1,1]]).T #label值 w0=2*np.random.random((3,3))-1 w1=2*np.random.random((3,1))-1 for iter in range(10000): l0=X l1=nonlin(np.dot(l0,w0)) l2=nonlin(np.dot(l1,w1)) l2_error=y-l2 l2_grad=l2_error*nonlin(l2,True) l1_error=l2_grad.dot(w1.T) #不懂 l1_grad=l1_error*nonlin(l1,True) w1=w1+l1.T.dot(l2_grad) w0=w0+l0.T.dot(l1_grad) print('result') print(l2) print(y)
线性分类对三种螺旋形数据:
import numpy as np import matplotlib.pyplot as plt #%matplotlib inline plt.rcParams['figure.figsize']=(10.0,8.0) #set default size of plots plt.rcParams['image.interpolation']='nearest' plt.rcParams['image.cmap']='gray' #%load_ext autoreload #%autoreload 2 np.random.seed(0) N=100 D=2 K=3 X=np.zeros((N*K,D)) y=np.zeros(N*K,dtype='uint8') for j in range(K): ix=list(range(N*j,N*(j+1))) r=np.linspace(0.0,1,N) t=np.linspace(j*4,(j+1)*4,N)+np.random.randn(N)*0.2 X[ix]=np.c_[r*np.sin(t),t*np.cos(t)] y[ix]=j fig=plt.figure() plt.scatter(X[:,0],X[:,1],c=y,s=40,cmap=plt.cm.Spectral) plt.xlim([-1,1]) plt.ylim([-1,1]) W=0.01*np.random.randn(D,K) b=np.zeros((1,K)) step_size=1e-0 #学习率为1时,准确率0.47 step_size=1e-1 #学习率为0.1时,准确率0.75 #step_size=1e-2 #学习率为0.01时,准确率0.63 #step_size=1e-6 #学习率为1e-6时,准确率0.38 reg=1e-3 num_examples=X.shape[0] for i in range(2000): scores= np.dot(X,W)+b exp_score=np.exp(scores) probs=exp_score/np.sum(exp_score,axis=1,keepdims=True) coret_logprobs=-np.log(probs[list(range(num_examples)),y]) data_loss=np.sum(coret_logprobs)/num_examples reg_loss=0.5*reg*np.sum(W*W) loss=data_loss+reg_loss if i%10 == 0: print("iteration %d:loss %f"%(i,loss)) dscores=probs dscores[list(range(num_examples)),y]=dscores[list(range(num_examples)),y]-1 dscores/=num_examples #此处是/号,要细心!!! dW=np.dot(X.T,dscores) db=np.sum(dscores,axis=0,keepdims=True) dW=dW+reg*W W+=-step_size*dW b+=-step_size*db scores= np.dot(X,W)+b predicted_class=np.argmax(scores,axis=1) print('training accuracy:%.2f'%(np.mean(predicted_class==y))) #计算分类准确率
简单的神经网络对三种螺旋形数据分类:
import numpy as np import matplotlib.pyplot as plt #%matplotlib inline plt.rcParams['figure.figsize']=(10.0,8.0) #set default size of plots plt.rcParams['image.interpolation']='nearest' plt.rcParams['image.cmap']='gray' #%load_ext autoreload #%autoreload 2 np.random.seed(0) N=100 D=2 K=3 X=np.zeros((N*K,D)) y=np.zeros(N*K,dtype='uint8') for j in range(K): ix=list(range(N*j,N*(j+1))) r=np.linspace(0.0,1,N) t=np.linspace(j*4,(j+1)*4,N)+np.random.randn(N)*0.2 X[ix]=np.c_[r*np.sin(t),t*np.cos(t)] y[ix]=j fig=plt.figure() plt.scatter(X[:,0],X[:,1],c=y,s=40,cmap=plt.cm.Spectral) plt.xlim([-1,1]) plt.ylim([-1,1]) h=100 W=0.01*np.random.randn(D,h) b=np.zeros((1,h)) W2=0.01*np.random.randn(h,K) b2=np.zeros((1,K)) step_size=1 #学习率为1时,准确率0.94 reg=1e-3 num_examples=X.shape[0] for i in range(1000): hidden_layer=np.maximum(0,np.dot(X,W)+b) scores= np.dot(hidden_layer,W2)+b2 exp_score=np.exp(scores) probs=exp_score/np.sum(exp_score,axis=1,keepdims=True) coret_logprobs=-np.log(probs[list(range(num_examples)),y]) data_loss=np.sum(coret_logprobs)/num_examples reg_loss=0.5*reg*np.sum(W*W)+0.5*reg*np.sum(W*W) loss=data_loss+reg_loss if i%10 == 0: print("iteration %d:loss %f"%(i,loss)) dscores=probs dscores[list(range(num_examples)),y]=dscores[list(range(num_examples)),y]-1 dscores/=num_examples #此处是/号,要细心!!! dW2=np.dot(hidden_layer.T,dscores) db2=np.sum(dscores,axis=0,keepdims=True) dhidden=np.dot(dscores,W2.T) dhidden[hidden_layer <=0] = 0 dW=np.dot(X.T,dhidden) db=np.sum(dhidden,axis=0,keepdims=True) dW2+=reg*W2 dW+=reg*W W+=-step_size*dW b+=-step_size*db W2+=-step_size*dW2 b2+=-step_size*db2 hidden_layer=np.maximum(0,np.dot(X,W)+b) scores= np.dot(hidden_layer,W2)+b2 predicted_class=np.argmax(scores,axis=1) print('training accuracy:%.2f'%(np.mean(predicted_class==y))) #计算分类准确率