鱼C论坛

 找回密码
 立即注册
查看: 591|回复: 1

[已解决]求助 代码出现值错误

[复制链接]
发表于 2020-6-14 02:09:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是一个关于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[0],cmap = 'gray')
plt.show()
plt.imshow(digits.images[1],cmap = 'gray')
plt.show()
plt.imshow(digits.images[2],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[0])
        #获取一个数据
        x = X[i]
        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[i] - 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))
最佳答案
2020-6-14 08:37:21

报错那写了
L1 = sigmoid(np.dot(x,V))

这里58行未对奇,可能是长度不一样,导致的吧,你检查检查你的代码
QQ图片20200614020636.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-14 08:37:21 | 显示全部楼层    本楼为最佳答案   

报错那写了
L1 = sigmoid(np.dot(x,V))

这里58行未对奇,可能是长度不一样,导致的吧,你检查检查你的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 17:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表