创建一个NeuralNetwork类
我们将用Python创建一个NeuralNetwork类来训练神经元,以期给出准确的预测。这个类还会有其他的帮助函数。
1. 应用Sigmoid函数
我们将使用Sigmoid函数,来绘制一个特征“S”型曲线,作为神经网络的激活函数。
此函数可以将任何值映射到0到1之间的值,它将有助于我们对输入的加权和归一化。
此后,我们将创建Sigmoid函数的导数,以帮助计算权重的调整参数。
可以利用Sigmoid函数的输出来生成它的导数。例如,如果输出变量为“x”,则其导数为x*(1-x)。
2. 训练模型
这是我们教神经网络做出准确预测的阶段。每个输入都有一个权重-可为正值或负值。这意味着:有较大的正权重或负权重的输入会对结果的输出产生更大的影响。请记住,我们最初是通过为每个随机数分配一个权重后开始的。
下面是这个神经网络示例的训练过程:
第一步:从训练数据集中提取输入,根据训练数据集的权重进行调整,并通过一种计算神经网络输出的方法对其进行筛选。
第二步:计算反向传播错误率。在这种情况下,它是神经元的预测输出与训练数据集的期望输出之间的差异。
第三步:利用误差加权导数公式,根据所得到的误差范围,进行了一些较小的权值调整。
第四步:对这一过程进行15000次迭代。在每次迭代中,整个训练集被同时处理。
我们使用“.T”函数将矩阵从水平位置转换为垂直位置。因此,数字将以如下方式存储:
最后一步,训练过程中神经元的权重将根据所提供的训练数据进行优化。随后,如果让神经元考虑一个新的输入进行测试,看看它能否作出一个准确的预测。
美丽的分割线
import numpy as np
class NeuralNetwork():
def __init__(self):
# seeding for random number generation
np.random.seed(1)
#converting weights to a 3 by 1 matrix with values from -1 to 1 and mean of 0
self.synaptic_weights = 2 * np.random.random((3, 1)) - 1
def sigmoid(self, x):
#applying the sigmoid function
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(self, x):
#computing derivative to the Sigmoid function
return x * (1 - x)
def train(self, training_inputs, training_outputs, training_iterations):
#training the model to make accurate predictions while adjusting weights continually
for iteration in range(training_iterations):
#siphon the training data via the neuron
output = self.think(training_inputs)
#computing error rate for back-propagation
error = training_outputs - output
#performing weight adjustments
adjustments = np.dot(training_inputs.T, error * self.sigmoid_derivative(output))
self.synaptic_weights += adjustments
def think(self, inputs):
#passing the inputs via the neuron to get output
#converting values to floats
inputs = inputs.astype(float)
output = self.sigmoid(np.dot(inputs, self.synaptic_weights))
return output
if __name__ == "__main__":
#initializing the neuron class
neural_network = NeuralNetwork()
print("Beginning Randomly Generated Weights: ")
print(neural_network.synaptic_weights)
#training data consisting of 4 examples--3 input values and 1 output
training_inputs = np.array([[0,0,1],
[1,1,1],
[1,0,1],
[0,1,1]])
training_outputs = np.array([[0,1,1,0]]).T
#training taking place
neural_network.train(training_inputs, training_outputs, 15000)
print("Ending Weights After Training: ")
print(neural_network.synaptic_weights)
user_input_one = str(input("User Input One: "))
user_input_two = str(input("User Input Two: "))
user_input_three = str(input("User Input Three: "))
print("Considering New Situation: ", user_input_one, user_input_two, user_input_three)
print("New Output data: ")
print(neural_network.think(np.array([user_input_one, user_input_two, user_input_three])))
print("Wow, we did it!")
这样,我们便成功地创建了一个简单的神经网络。
神经元首先给自己分配一些随机权重,接着,利用训练实例进行了自我训练。
之后,如果输入新的数据[1,0,0],则它得出的数值为0.9999584。
还记得我们想要的正确答案是1吗?
这个数值非常接近,Sigmoid函数输出值在0到1之间。