|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
import numpy as np
def tanh(x):
return np.tanh(x)
def tanh_deriv(x):
return 1.0-np.tanh(x)*np.tanh(x)
def logistic(x):
return 1/(1+np.exp(-x))
def logistic_deriv(x):
return logistic*(1-logistic(x))
class NeuralNetwork:#定义一个类
def __init__(self,layers,activation='tanh'):
if activation=='logistic':
self.activation=logistic
self.activation_deriv=logistic_deriv
elif activation=='tanh':
self.activation=tanh
self.activation_deriv=tanh_deriv
#对权重初始化
self.weights=[]
for i in range(1,len(layers)-1):
self.weights.append((2*np.random.random((layers[i-1]+1,layers[i]+1))-1)*0.25)
self.weights.append((2*np.random.random((layers[i]+1,layers[i+1]))-1)*0.25)
def fit(self,X,y,learning_rate=0.2,epochs=1000):
X=np.atleast_2d(X)#atlest_2d函数:确认x至少二位的矩阵
temp=np.ones([X.shape[0],X.shape[1]+1])#初始化矩阵全是1(行数,列数+1是为了有B这个偏向)
temp[:,0:-1]=X#行全选,第一列到倒数第二列
X=temp
y=np.array(y)
#数据结构转换把list转换成array的形式
for k in range(epochs):
#随机选取一行,对神经网络进行更新
i=np.random.randint(X.shape[0])
a=[X[i]]
#完成所有的正向更新
for l in range(len(self.weights)):
a.append(self.activation(np.dot(a[l],self.weights[l])))
#向前传播,得到每个节点的输出结果
error=y[i]-a[-1]#最后一层错误率
deltas=[error*self.activation_deriv(a[-1])]#输出层误差
layerNum=len(a)-2
for j in range(layerNum,0,-1):
deltas.append(deltas[-1].dot(self.weights[j].T)*self.activation_deriv(a[j]))
deltas.reverse()
for i in range(len(self.weights)):
layer=np.atleast_2d(a[i])
delta=np.atleast_2d(deltas[i])
self.weights[i] +=learning_rate*layer.T.dot(delta)
def predict(self,x):
x=np.array(x)
temp=np.ones(x.shape[0]+1)
temp[0:-1]=x
a=temp
for l in range(0,len(self.weights)):
a=self.activation(np.dot(a,self.weights[l]))
return a
from sklearn.datasets import load_digits
import numpy as np
from accidentNN import NeuralNetwork
from numpy import genfromtxt
from sklearn.metrics import confusion_matrix,classification_report
from sklearn.preprocessing import LabelBinarizer
from sklearn.cross_validation import train_test_split
digits=load_digits()
X=digits.data
y=digits.target
X-=X.min()
X/=X.max()
nn=NeuralNetwork([64,100,10],'tanh')
X_train,X_test,y_train,y_test=train_test_split(X,y)
labels_train=LabelBinarizer().fit_transform(y_train)
labels_test=LabelBinarizer().fit_transform(y_test)
print("start fitting")
nn.fit(X_train,labels_train,epochs=3000)
predictions=[]
for i in range(X_train.shape[0]):
o=nn.predict(X_test[i])
predictions.append(np.argmax(o))
a=confusion_matrix(y_test,predictions)
print(a)
b=classification_report(y_test,predictions)
print(b)
报错 o=nn.predict(X_test[i])
IndexError: index 450 is out of bounds for axis 0 with size 450
求 大佬 帮忙 看一下
|
|