鱼C论坛

 找回密码
 立即注册
查看: 2197|回复: 5

关于Python中神经网络的问题求助,大神们帮帮忙啦

[复制链接]
发表于 2017-3-8 10:21:18 | 显示全部楼层 |阅读模式

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

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

x
下面是我学习时候模仿别人的简单神经网络代码
import numpy as np

def tanh(x):
    return np.tanh(x)

def tanh_deriv(x):
    return 1 - np.tanh(x)*np.tanh(x)

def logistic(x):
    return 1/(1+np.exp(-x))

def logistic_derivative(x):
    return logistic(x)*(1-logistic(x))

#构造神经网络
class NeuralNetwork:
    def __init__(self, layers, activation='tanh'):
        if activation == 'logistic':
            self.activation = logistic
            self.activation_deriv = logistic_derivation
        elif activation == 'tanh':
            self.activation = tanh
            self.activation_deriv = tanh_deriv
        #建立初始权值向量  并向其中添加权值   
        self.weight = []
        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 ))-1)*0.25)
    def fit(self, X, y, learning_rate=0.2, epochs=10000):
        X = np.atleast_2d(X)
        temp = np.ones(X.shape[0], X.shape[1]+1)
        temp[:, 0:-1] = X     #保留最后一行作为偏量bias
        X = temp
        y = np.array(y)
        
        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[1])))
            error = y[i] - a[-1]    #在最高层计算误差
            deltas = [error*self.activation_deriv(a[-1])]
            
            for l in range(len(a) - 2, 0, -1):    #开始误差反传,
                deltas.append(deltas[-1].dot(self.weights[1].T)*self.activation)
            deltas.reverse()
            for i in range(len(self.weights)):
                layer = np.atleast_2d(a[i])
                delta = np.atleast_2d(delats[i])
                self.weights[i] += learning_rate*layer.dot(delta)
               
    def predict(self, x):
        x = np.array(x)
        temp = np.ones(x.shape[o]+1)
        temp[0:-1] = x
        a = temp
        for l in range(0, len(self.weights)):
            a = self.activation(np.dot(a, self.weights[1]))
        return a


然后在第二个程序中加以应用
from ann import NeuralNetwork
import numpy as np

nn = NeuralNetwork([2,2,1], 'tanh')
X = np.array([0,0], [0,1], [1,0], [1,1])
y = np.array([0, 1, 1, 0])
nn.fit(X, y)
for i in [[0,0], [0,1], [1,0], [1,1]]:
    print(i, nn.predict(i))

两段代码完全模仿了教程里面,但是我这里报错了
AttributeError: 'NeuralNetwork' object has no attribute 'weights'

希望请教下神通广大的鱼友们!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-8 10:23:12 | 显示全部楼层
self.weight = []
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-8 10:47:34 | 显示全部楼层
按你缩进的来看,这个weight应该是__init__函数里面的。你先在外面定义一个weight = [],然后将weight作为init函数的参数传递给它,
def __innit__(self, *weight,xxx):
    self.weight = weight
    xxx
然后再试试?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-8 10:52:34 | 显示全部楼层
hustlin 发表于 2017-3-8 10:47
按你缩进的来看,这个weight应该是__init__函数里面的。你先在外面定义一个weight = [],然后将weight作为in ...

好的3qu 试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-8 14:02:45 | 显示全部楼层
没有weights这个属性,楼上是对的,你自己改一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-8 15:40:07 | 显示全部楼层
没有weight这个属性,注意一下在__init__方法中有没有定义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 00:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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