ValueError:数据必须为一维(NeuralNetwork)吗?

时间:2018-08-26 04:26:14

标签: python python-3.x neural-network jupyter-notebook

我正在做一个预测并实现一个神经网络,目前正在使用numpy库,并且正在使代码适应我所拥有的数据。

我离开了神经网络的当前进度,在代码结尾处有一个错误,我不太清楚。 有人可以帮我吗?

import numpy as np
from sklearn.cross_validation import train_test_split

class LinearLayer:
    def __init__(self, n_input, n_output):
        self.n = n_input
        self.m = n_output
        self.W = (1/np.sqrt(n_input))*np.random.rand(n_input+1, n_output)

    def forward(self, X):
        self.input = np.zeros((X.shape[0],self.n+1))
        # if only one feature, the input should always be a batch, at least
        if len(X.shape) == 1:  # of one element
            self.input[:-1,:] = X.reshape(-1,self.n)
        else:
            self.input[:,:-1] = X

        self.input[:,-1] = 1
        self.output = self.input.dot(self.W) # xW + b
        return self.output


    def backward(self, d_out):
        self.gradients = self.W.dot(d_out)[:-1]
        self.dW = np.einsum("ij,ki", self.input, d_out)
        return self.gradients


    def updateWeights(self, lr=0.1):
        self.W = self.W - lr*self.dW


class Sigmoid:
    def __init__(self, n_input):
        self.output = np.zeros(n_input)
        self.gradients = np.zeros(n_input)        


    def forward(self, X):
        self.output = 1/(np.exp(-X)+1)
        return self.output


    def backward(self, d_out):
        ds = self.output.T*(1 - self.output).T
        self.gradients = ds*d_out
        return self.gradients



print("Training a multilayer perceptron\n")
import pandas as pd
data = pd.read_csv('Data_Balanceada.csv') #Data (74,11)
X = data.iloc[:,0:11]
y = data.iloc[:,-1]
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.25, random_state=1)

h1 = LinearLayer(11,1)  #stack some layers
s1 = Sigmoid(7) 
h2 = LinearLayer(7,1)
s2 = Sigmoid(1)

def loss(pred, target):
    return np.mean(np.power(pred-target,2))

predict = lambda x: s2.forward(h2.forward(s1.forward(h1.forward(x))))
backpropagate = lambda d: h1.backward(s1.backward(h2.backward(s2.backward(d))))

lr = 0.005
n = 0 # patience
max_epochs = 1500
valid = loss(predict(X_test), y_test) 
for i in range(max_epochs):
    l = 0
    p = predict(X_train)  
    backpropagate(p.T-y_train.T)
    h1.updateWeights(lr)
    h2.updateWeights(lr)
    l = loss(p,y_train)
    new_valid = loss(predict(X_test), y_test)
    if new_valid < valid:
        valid = new_valid
        n = 0
    else:
        n += 1
    if n > 50:  break
    if i%50 == 0:   
        print("Loss: {0}\t\tValidation: {1}".format(l/100, valid))
        lr = lr*0.97


# Validation
print("\nFinal validation loss: {0}. {1} epochs\n".format(loss(predict(X_test), y_test),i+1))
#print(np.argmax(predict(X_test), axis=1))
#print(np.argmax(y_test, axis=1))

链接数据集:

https://mega.nz/#!jM8AQAbB!61NOeJadGXtiKJQsn_tdJ955p5lRD6kQjBlCQTHtt6I

我遇到此错误:

Data must be 1-dimensional

IMG-错误

0 个答案:

没有答案