fcx2000913 发表于 2020-6-14 02:09:03

求助 代码出现值错误

这是一个关于BP神经网络实现手写数字识别的代码 在运行的最后几步出现了未对齐的错误 求助大佬们应该怎么改啊

#导入模块
import numpy as np
from sklearn.datasets import load_digits
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report,confusion_matrix
import matplotlib.pyplot as plt
#载入数据
digits = load_digits()
print(digits.images.shape)
#显示图片
plt.imshow(digits.images,cmap = 'gray')
plt.show()
plt.imshow(digits.images,cmap = 'gray')
plt.show()
plt.imshow(digits.images,cmap = 'gray')
plt.show
#数据
X = digits.data
#标签
y = digits.target
print(X.shape)
print(y.shape)
print(X[:3])
print(y[:3])
# 定义一个神经网络,结构:64-100-10
# 定义输入层到隐藏层之间的权值矩阵
V = np.random.random((64,100))*2-1
# 定义隐藏层到输出层之间的权值矩阵
V = np.random.random((100,10))*2-1
# 数据切分
# 1/4为测试集,3/4为训练集
X_train,X_test,y_train,y_test = train_test_split(X,y)
#标签二值化
lables_train = LabelBinarizer().fit_transform(y_train)
print(y_train[:5])
print('哈哈')
print(lables_train[:5])
# 激活函数
def sigmoid(x):
    return 1/(1 + np.exp(-x))
#激活函数的导数
def dsigmoid(x):
    return x*(1-x)
#训练模型
def train(X,y,steps = 10000,lr = 0.11):
    global V,W
    for n in range(steps + 1):
      #随机选取一个数据
      i = np.random.randint(X.shape)
      #获取一个数据
      x = X
      x = np.atleast_2d(x)
      # BP算法公式
      # 计算隐藏层的输出
      L1 = sigmoid(np.dot(x,V))
      #计算输出层的输出
      L2 = sigmoid(np.dot(L1,W))
      #计算L2_delta,L1_delta
      L2_delta = (y - L2) * dsigmoid(L2)
      L1_delta = L2_delta.dot(W.t) * dsigmoid(L1)
      #更新权值
      W += lr * L1.T.dot(L2_delta)
      V += lr*x.T.dot(L1_delta)
      #每训练1000次预测一次准确率
      if n % 1000 == 0:
            output = predict(X_test)
            predictions = np.argmax(output,axis = 1)
            acc = np.mean(np.equal(predictions,y_test))
            print('steps:',n,'accuracy:',acc)
def predict(x):
    #计算隐藏的输出
    L1 = sigmoid(np.dot(x,V))
    #计算输出的输出
    L2 = sigmoid(np.dot(L1,W))
    return L2
# 进行30000次的模型训练,完成1000次训练输出一次训练结果
train(X_train,lables_train,30000)
# 用测试数据对已训练的模型进行测试
output = predict(X_test)
# 按行查找训练结果的最大元素
predictions = np.argmax(output,axis = 1)
# 比较预测测试标签和真实标签,并输出准确率
print(classification_report(predictions,y_test))
#利用混淆矩阵实现模型评估,矩阵行数据相加是真实值类别数,列数据相加是分类后的类别数
print(confusion_matrix(predictions,y_test))

Twilight6 发表于 2020-6-14 08:37:21


报错那写了

L1 = sigmoid(np.dot(x,V))

这里58行未对奇,可能是长度不一样,导致的吧,你检查检查你的代码
页: [1]
查看完整版本: 求助 代码出现值错误