面向初学者的最小神经网络

前言

此篇博客不会涉及到复杂的数学和算法。相反,我将建立您对神经网络如何工作初步的认识,并通过创建最小的神经网络并进行训练以完成一个简单的任务来做到这一点。

神经网络背后的想法

神经网络是权重的集合。我们可以在一组输入和输出(目标或标签)上训练神经网络。神经网络内部的权重与输入交互并产生输出。在训练网络时,权重会更新,以使其尝试将输出与目标值进行匹配。简而言之,神经网络学习输入和输出之间的映射。现在,让我们看看所有这些是什么意思。

最小神经网络

以下是**只有一个权重(w)**的最小神经网络。我们给它输入一个输入(x),再乘以权重,结果就是网络的输出。

最小神经网络
由于此神经网络非常小,我们将在一个非常简单的任务上对其进行训练。我们的任务是向其提供任何数字,网络应更改该数字的符号(即求相反数)。例如,如果我们输入3,则网络应输出-3。

在Keras中创建神经网络

现在,我将在Keras中构建和训练最小的神经网络,这是一个深度学习库。现在不需要深入语法,这只是为了建立初步认识。

import keras
from keras.layers import Dense

model = keras.models.Sequential()

model.add(Dense(units=1, use_bias=False, input_shape=(1,)))   # 仅有的1个权重在这里

model.compile(loss='mse', optimizer='adam')

非常好!通过以上代码我们创建了只有一个权重的神经网络。现在,让我们创建用于训练神经网络的训练数据。

创建数据

神经网络是需要学习数据数据的,因此我们创建用于学习的数据。

import numpy as np

data_input = np.random.normal(size=100000)  # 训练数据

data_label = -(data_input)  # 数据标签

我们创建了训练数据。数据包含100K随机数,标签为该数字的负数。让我们根据刚刚创建的数据训练网络。

训练网络

首先,神经网络的权重是随机初始化的。随着我们不断训练网络,权重也会随之更新。

  1. 开始训练之前,让我们检查一下权重(W)的大小。
    model.layers[0].get_weights()
  2. 现在让我们将数据放入网络中。Fitting 不过是 training 的别称。
    model.fit(data_input, data_label)
  3. 我们已经训练过网络。正如您在进度栏中看到的那样,该网络已接受10万个样本的训练。现在,让我们向网络提供一个值并检查响应。
    model.predict(np.array([2.5]))
  4. 网络几乎完成了任务。输出非常接近输入数字,并带有相反的符号。随着我们将在更多数据上训练它,输出将越来越接近目标值。另外,让我们现在检查训练成功网络后的权重值(W)。
    model.layers[0].get_weights()
    当我们根据数据训练网络时,权重从一开始的 随机数值 变为 大约-1。这很明显,因为必须将数字乘以-1才能更改其符号。

摘要

因此,基本上神经网络可以学习任何输入和输出之间的映射,并可以用作函数逼近器。一旦学习了映射,它就可以为您提供给它的任何输入生成近似输出。

完整代码

# 定义网络begin
import keras
from keras.layers import Dense
model = keras.models.Sequential()
model.add(Dense(units=1, use_bias=False, input_shape=(1,)))   # 仅有的1个权重在这里
model.compile(loss='mse', optimizer='adam')
# end

# 创建数据begin
import numpy as np
data_input = np.random.normal(size=1000000)  # 训练数据
data_label = -(data_input)  # 数据标签
# end

print('模型随机权重分配为:%s' % (model.layers[0].get_weights()))  # 检查随机初始化的权重大小

model.fit(data_input, data_label)  # 对创建的数据用创建的网络进行训练

print('模型进行预测:' % (model.predict(np.array([2.5]))))  # 利用训练好的模型进行预测

print('训练完成后权重分配为:%s' % (model.layers[0].get_weights()))  # 再次查看训练好的模型中的权重值

在这里插入图片描述

附录:扩展阅读

深入理解 keras 中 Dense 层参数

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章