请问,以下代码是不是一个完整的神经网络代码?为什么计算出来的准确率不管迭代多少次都是0.5?是我的数据问题?还是这个代码问题?
class NeuralNetwork:
def init(self,layers):#这里是三层网络,列表[64,100,10]表示输入,隐藏,输出层的单元个数
#初始化权值,范围1~-1
self.V=np.random.random((layers[0]+1,layers[1]))2-1#隐藏层权值(65,100),之所以是65,因为有偏置W0
self.W=np.random.random((layers[1],layers[2]))2-1#(100,10)
def train(self,X,y,lr=0.1,epochs=10000):
#lr为学习率,epochs为迭代的次数
#为数据集添加偏置
temp=np.ones([X.shape[0],X.shape[1]+1])
temp[:,0:-1]=X
X=temp#这里最后一列为偏置
for n in range(epochs+1):
i=np.random.randint(X.shape[0])#随机选取一行数据(一个样本)进行更新
x=X[i]
x=np.atleast_2d(x)#转为二维数据
L1=sigmoid(np.dot(x,self.V))#隐层输出(1,100)
L2=sigmoid(np.dot(L1,self.W))#输出层输出(1,10)
L2_delta=(y[i]-L2)*dsigmoid(L2)#(1,10)
L1_delta=L2_delta.dot(self.W.T)*dsigmoid(L1)#(1,100),这里是数组的乘法,对应元素相乘
#更新
self.W+=lr*L1.T.dot(L2_delta)#(100,10)
self.V+=lr*x.T.dot(L1_delta)#
#每训练1000次预测准确率
if n%1000==0:
predictions=[]
for j in range(features_test.shape[0]):
out=self.predict(features_test[j])#用验证集去测试
predictions.append(np.argmax(out))#返回预测结果
accuracy=np.mean(np.equal(predictions,labels_test))#求平均值
print('epoch:',n,'accuracy:',accuracy)
def predict(self,x):
#添加转置,这里是一维的
temp=np.ones(x.shape[0]+1)
temp[0:-1]=x
x=temp
x=np.atleast_2d(x)
L1=sigmoid(np.dot(x,self.V))#隐层输出
L2=sigmoid(np.dot(L1,self.W))#输出层输出
return L2
#创建神经网络
nm=NeuralNetwork([13,100,1])
nm.train(os_features,os_labels,epochs=20000)
epoch: 0 accuracy: 0.5
epoch: 1000 accuracy: 0.5
epoch: 2000 accuracy: 0.5
epoch: 3000 accuracy: 0.5
epoch: 4000 accuracy: 0.5
epoch: 5000 accuracy: 0.5
epoch: 6000 accuracy: 0.5
epoch: 7000 accuracy: 0.5
epoch: 8000 accuracy: 0.5
epoch: 9000 accuracy: 0.5
epoch: 10000 accuracy: 0.5
epoch: 11000 accuracy: 0.5
epoch: 12000 accuracy: 0.5
epoch: 13000 accuracy: 0.5
epoch: 14000 accuracy: 0.5
epoch: 15000 accuracy: 0.5
epoch: 16000 accuracy: 0.5
epoch: 17000 accuracy: 0.5
epoch: 18000 accuracy: 0.5
epoch: 19000 accuracy: 0.5
epoch: 20000 accuracy: 0.5