介绍
在“运行神经网络”一章中,我们用 Python 代码编写了一个名为“神经网络”的类。此类的实例是具有三层的网络。当我们实例化此类的 ANN 时,层之间的权重矩阵是自动随机选择的。甚至可以在某些输入上运行这样的 ANN,但自然而然地,除了用于测试目的之外,它没有多大意义。这样的人工神经网络不能提供正确的分类结果。事实上,分类结果并没有适应预期的结果。权重矩阵的值必须根据分类任务进行设置。我们需要改进权重值,这意味着我们必须训练我们的网络。为了训练它,我们必须在train
方法。如果您不了解反向传播并想了解它,我们建议您返回神经网络中的反向传播一章。
在了解并希望理解反向传播之后,您就可以完全理解该train
方法了。
train
使用输入向量和目标向量调用该方法。向量的形状可以是一维的,但它们会自动变成正确的二维形状,即reshape(input_vector.size, 1)
和reshape(target_vector.size, 1)
。之后我们调用run
方法来获取网络的结果output_vector_network = self.run(input_vector)
。此输出可能与target_vector
. 我们计算出output_error
减去网络的输出output_vector_network
从target_vector
。
从scipy.special import expit as activation_function from scipy.stats import truncnorm导入numpy 作为 np
def truncated_normal ( mean = 0 , sd = 1 , low = 0 , upp = 10 ):
return truncnorm (
( low - mean ) / sd , ( upp - mean ) / sd , loc = mean , scale = sd )
类 神经网络:
def __init__ ( self ,
no_of_in_nodes ,
no_of_out_nodes ,
no_of_hidden_nodes ,
learning_rate ):
self 。no_of_in_nodes = no_of_in_nodes
self 。no_of_out_nodes = no_of_out_nodes
self 。no_of_hidden_nodes = no_of_hidden_nodes
self 。learning_rate = learning_rate
self . create_weight_matrices ()
def create_weight_matrices ( self ):
""" 一种初始化神经网络权重矩阵的方法"""
rad = 1 / np . SQRT (自我。no_of_in_nodes )
X = truncated_normal (平均值= 0 , SD = 1 , 低= -弧度, UPP =弧度)
自我。weights_in_hidden = X 。房车((自我。no_of_hidden_nodes ,
self 。no_of_in_nodes ))
rad = 1 / np 。SQRT (自我。no_of_hidden_nodes )
X = truncated_normal (平均值= 0 , SD = 1 , 低= -弧度, UPP =弧度)
自我。weights_hidden_out = X 。RVS ((自我。no_of_out_nodes ,
自我。no_of_hidden_nodes ))
def train ( self , input_vector , target_vector ):
"""
input_vector 和 target_vector 可以是元组、列表或 ndarrays
"""
# 确保向量具有正确的形状
input_vector = np . 数组(input_vector )
input_vector = input_vector 。reshape ( input_vector . size , 1 )
target_vector = np 。数组(target_vector )。重塑(目标向量。大小, 1 )
output_vector_hidden = activation_function (自我。weights_in_hidden @ input_vector )
output_vector_network = activation_function (自我。weights_hidden_out @ output_vector_hidden )
output_error = target_vector - output_vector_network
tmp = output_error * output_vector_network * ( 1.0 - output_vector_network )
self 。weights_hidden_out += self 。learning_rate * ( tmp @ output_vector_hidden . T )
# 计算隐藏错误:
hidden_errors = self . weights_hidden_out 。Ť @ output_error
#更新的权重:
TMP = hidden_errors * output_vector_hidden * (1.0 - output_vector_hidden )
自我。weights_in_hidden += self 。learning_rate