让我们构建一个简单的神经网络

天岚量产机 2018-07-15

让我们构建一个简单的神经网络

在本文中,我将向您展示如何使用numpy和pandas制作一个简单人工神经网络。我们的ANN模型将具有单个输入和输出层。

有关数据集的信息

为了演示模型的工作原理,我创建了一个尺寸为12x5的小型数据集。列a,b,c,d是要素,最后一列是标签。

让我们构建一个简单的神经网络

神经网络类

我们将自定义类命名为“ SimpleNeuralNetwork ”。接下来,我们将在__init __()函数下初始化权重矩阵。

import pandas as pd

import numpy as np

class SimpleNeuralNetwork(object):

def __init__(self):

np.random.seed(1)

self.synaptic_weights = []

我们模型中使用的激活函数将是sigmoid。因此,我们将创建一个名为__sigmoid()的函数。它需要两个参数:x (a list) 和deriv (default is False)。如果我们将deriv设置为True,则返回sigmoid函数的导数形式。

def __sigmoid(self, x, deriv=False):

if deriv == True:

return x * (1-x)

return 1 / (1 + np.exp(-x))

predict()函数将以数组作为输入(比如X),并返回X和权重矩阵的乘积。

def predict(self, x):

predicted = np.dot(x, self.synaptic_weights)

return self.__sigmoid(predicted)

我们将为train()函数提供4个输入:file (pandas object), X (features list), y (label array) 和迭代。这里的权重矩阵是用numpy的随机函数初始化的。权值矩阵的维数为(number_of_features, 1)。变量输出存储特征(X)的乘积,权值矩阵和误差变量存储预测输出和实际输出的差值。

def train(self, file, X, y, iterations):

dim = file.shape #Return dimensions of the file, say (m,n)

self.synaptic_weight = 2 * np.random.random((dim[1] - 1, 1)) - 1 #shape of weight matrix is (n,1)

for i in range(iterations):

output = self.predict(X) #Product of training_inputs and weight matrix

error = y - output

adjustment = np.dot(X.T, error * self.__sigmoid(output, deriv=True))

self.synaptic_weight += adjustment

对权重矩阵反复使用相同的值不会让我们的模型学习!因此,我们将使用反向传播的概念。误差变量与sigmoid导数输出相乘,其与X的点积存储在调整变量中,并添加到权值矩阵中以更新值。

主程序

在pandas的帮助下,我们将加载数据集并将其划分为特征和标签。创建我们类的对象,并使用train()函数提供训练数据。我们现在可以给出任何不属于数据集的输入值,我们的模型将输出0到1之间的值。因为,我们希望输出为0或1,设置阈值为0.5,输出为1以上,否则为0。

import pandas as pd

import numpy as np

class SimpleNeuralNetwork(object):

def __init__(self):

np.random.seed(1)

self.synaptic_weights = []

def __sigmoid(self, x, deriv=False):

if deriv == True:

return x * (1-x)

return 1 / (1 + np.exp(-x))

def predict(self, x):

predicted = np.dot(x, self.synaptic_weights)

return self.__sigmoid(predicted)

def train(self, file, X, y, iterations):

dim = file.shape #Return dimensions of the file, say (m,n)

self.synaptic_weight = 2 * np.random.random((dim[1] - 1, 1)) - 1 #shape of weight matrix is (n,1)

for i in range(iterations):

output = self.predict(X) #Product of training_inputs and weight matrix

error = y - output

adjustment = np.dot(X.T, error * self.__sigmoid(output, deriv=True))

self.synaptic_weight += adjustment

if __name__ == "__main__":

# Loading Data

data = pd.read_csv("file.csv")

display(len(data))

X = data.iloc[:, 0:4].values #features

y = data.iloc[:, [4]].values #labels

number_of_iterations = 6000

clf = SimpleNeuralNetwork()

#Training

clf.train(data, X, y, number_of_iterations)

#Testing

prediction = np.array([0,1,1,0])

res = clf.predict(prediction)[0]

#Threshold value check

if res >= 0.5:

print("Prediction:", 1)

else:

print("Prediction:", 0)

¥22.5
购买

相关推荐