神经网络 分为输入层,隐含层(可能右多层),输出层,那如何才能定义一个神经网络了,这就要涉及权重了。
数据的传递过程与权值W密不可分,因此记录每一层网络的权值就相当于记录了一个神经网络的基础架构,完整的神经网络还与 激活函数、损失函数,前向传播算法、反向传播算法有关。
既然神经网络与权值分不开,那定义一个神经网络就相当于定义个权值矩阵。
首先定义 输入层神经元个数 n_inputs,隐含层神经元个数 n_hidden ,输出层神经元个数n_output, 隐含层层数 n。
from random import seed
from random import random
# 初始化网络
def initialize_network(n_inputs, n_hidden, n_outputs,n):
network = list()
for i in range(n):#隐含层
hidden_layer = [{'weights':[random() for i in range(n_inputs + 1)]} for i in range(n_hidden)]
network.append(hidden_layer)
#输出层
output_layer = [{'weights':[random() for i in range(n_hidden + 1)]} for i in range(n_outputs)]
network.append(output_layer)
return network
if __name__ == '__main__':
seed(1)
network = initialize_network(2, 2, 2,1)
for layer in network:
print(layer)
结果:
image.png
定义完神经网络后,下面要定义激活函数,同时要定义加权求和函数
from math import exp
# 计算神经元的激活值(加权)
def activate(weights, inputs):
activation = weights[-1]
for i in range(len(weights) - 1):
activation += weights[i] * inputs[i]
return activation
# 神经元的传递函数
def transfer(activation):
return 1.0 / (1.0 + exp(-activation))
# 计算神经网络的正向传播
def forward_propagate(network, row):
inputs = row
for layer in network:
new_inputs = []
for neuron in layer:
activation = activate(neuron['weights'], inputs)
neuron['output'] = transfer(activation)
new_inputs.append(neuron['output'])
#print(neuron)
inputs = new_inputs
print(new_inputs)#记录每一层传递值
return inputs
from random import seed
from random import random
# 初始化网络
def initialize_network(n_inputs, n_hidden, n_outputs,n):
network = list()
for i in range(n):
hidden_layer = [{'weights': [random() for i in range(n_inputs + 1)]} for i in range(n_hidden)]
network.append(hidden_layer)
output_layer = [{'weights': [random() for i in range(n_hidden + 1)]} for i in range(n_outputs)]
network.append(output_layer)
return network
if __name__ == '__main__':
seed(1)
network= initialize_network(2, 2,2,2) #l两层隐含层
for i in network:
print(i)
row = [1, 0, None]
output = forward_propagate(network, row)
#print(output)
结果:
image.png
参考:深度学习之美:AI时代的数据处理与最佳实践_张玉宏