一个神经网络类
我们在神经网络教程的前一章中学到了关于权重的最重要的事实。我们看到了它们的使用方式以及如何在 Python 中实现它们。我们看到,通过应用矩阵乘法,可以使用 Numpy 中的数组完成权重与输入值的乘法。
然而,我们没有做的是在真实的神经网络环境中测试它们。我们必须先创造这个环境。我们现在将在 Python 中创建一个类,实现一个神经网络。我们将分步进行,以便一切都易于理解。
我们班级需要的最基本的方法是:
__init__
初始化一个类,即我们将设置每一层的神经元数量并初始化权重矩阵。run
:一种应用于我们想要分类的样本的方法。它将此样本应用于神经网络。我们可以说,我们“运行”网络以“预测”结果。此方法在其他实现中通常称为predict
.train
: 该方法获取一个样本和对应的目标值作为输入。如有必要,它可以通过此输入调整重量值。这意味着网络从输入中学习。从用户的角度来看,我们“训练”了网络。在sklearn
例如,这种方法被称为fit
我们将把train
andrun
方法的定义推迟到以后。权重矩阵应该在__init__
方法内部初始化。我们是间接这样做的。我们定义一个方法create_weight_matrices
并在__init__
. 这样,init 方法就清晰了。
我们还将推迟向层添加偏置节点。
以下 Python 代码包含应用我们在前一章中得出的知识的神经网络类的实现:
导入 numpy的 是 NP
从 scipy.stats 导入 truncnorm
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 。RVS ((自我。no_of_hidden_nodes ,
自我。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_nod