人工AI — 神经网络构建初步

人工AI — 神经网络构建初步

在之前我就一直对人工智能感兴趣,就去了解那些基本原理啊包括其他一些人的博客,后面就干脆直接实战了,我会从“新”电脑的角度开讲。我会引用我之前参考的博客结合我后期我自己的实际操作步奏,尽量让你一看就会吧。。。


先来简单的了解一下吧,(。•﹃•。)阿巴阿巴阿巴

神经网络并不是一个新概念,1943年,由沃伦·麦卡洛克(Warren McCulloch)和沃尔特·皮茨(Walter Pitts)首次提出。

我们将构建一个没有隐藏层或感知器的单层神经网络。它由一个包含训练示例、突触或权重以及神经元的输入层和一个含有正确答案的输出层组成。神经网络图形如下所示:

人工AI — 神经网络构建初步_第1张图片
此外,需要了解一些如sigmoid和导数之类的数学概念,以清楚神经元的学习方式。神经元只需进行简单操作,即取一个输入值,乘以突触权重。之后,对所有这些乘法结果求和,并使用sigmoid函数获得0到1内的输出值。

神经元表示:

人工AI — 神经网络构建初步_第2张图片

Sigmoid函数:

在这里插入图片描述

问题界定

输入层上有数字序列。我们预期的理想结果是,在数据集样本中,如果输入第一个数字是1,则神经网络返回1;如果第一个数字是0,则返回0。结果在输出层中显示。问题集如下图:
人工AI — 神经网络构建初步_第3张图片

那么现在开始吧٩( ‘ω’ )و get!

如果是刚安装Linux(全代码那种),可能还要先配置一下网络环境(动态配置网络环境:dhclient)和安装一下ssh(后期可以在内网的另一台机子上控制输入指令,这样就可以更好的粘贴复制了(斜眼笑))

先是要安装一下pip(pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。),后面是要用pip安装numpy的,下载安装脚本:

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

部分 Linux 发行版可直接用包管理器安装 pip,如 Debian 和 Ubuntu:

sudo apt-get install python-pip

当然如果你已经下载好了pip(如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具。Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具。)
则查看一下版本或升级:
查看版本:

pip --version 

升级pip:

pip install -U pip

如果升级出现了问题就用这个 QAQ:

sudo easy_install --upgrade pip

NumPY(NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。)安装命令:

pip3 install --user numpy scipy matplotlib

–user 选项可以设置只安装在当前的用户下,而不是写入到系统目录。
默认情况使用国外线路,如果国外线路太慢,那我们使用清华的镜像就可以了:

pip3 install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

Linux 下安装:
Ubuntu & Debian

sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose

CentOS/Fedora

sudo dnf install numpy scipy python-matplotlib ipython python-pandas sympy python-nose atlas-devel

Mac的话就用这个:

pip3 install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

安装成功,即可进入编码部分。将NumPy导入Python文件中:

import numpy as np

训练神经网络٩( ‘ω’ )و get!

首先,创建一个sigmoid函数:

def sigmoid(x):
    return 1 / (1+np.exp(-x))

其次,定义训练示例、输入(4×5矩阵)和输出:

training_inputs = np.array([[0,0,1,0],[1,1,1,0],[1,0,1,0],[0,1,1,1],[0,1,0,1]])
trainign_outputs = np.array([[0,1,1,0,0]]).T

接下来,通过生成随机值来初始化突触权重,并将结果排列在4×1的矩阵中:

np.random.seed(1)
synaptic_weights = 2 * np.random.random((4,1)) - 1

最后,构建训练模型。使用for循环,所有的训练都将在此循环中进行。调用sigmoid函数,并将所有输入的总和乘以sigmoid权重。然后采用Np.dot进行矩阵乘法。过程如下图:

for i in range(1):
    output = sigmoid(np.dot(training_inputs, synaptic_weights))

print('Synaptic weights:')
print(synaptic_weights)
print('Output:')
print(output)

输出结果如下图:
人工AI — 神经网络构建初步_第4张图片

现在进行神经网络模型训练,方法是计算sigmoid函数的输出和实际输出之间的差值。之后可以根据误差的严重性调整权重。多次重复这个过程,比如说一万次。定义sigmoid导数:

def sigmoid_der(x):
    return x * (1 - x)

以下是计算和调整权重的方法:

for i in range(1):
    output = sigmoid(np.dot(training_inputs, synaptic_weights))

    error = trainign_outputs - outputs

    adjustments = error * sigmoid_der(outputs)

    synaptic_weights += np.dot(inputs.T, adjustments)

print('Synaptic weights:')
print(synaptic_weights)
print('Output:')
print(output)

开始学习,观察学习时长会如何影响结果。从100次迭代开始:
在这里插入图片描述
开始情况比较乐观——我们的人工智能已经学会了识别模式,但错误率仍然居高不下。现在进行1000次迭代:
在这里插入图片描述
情况好转,继续进行10000次迭代:
在这里插入图片描述
10万次迭代:
在这里插入图片描述
我们可以继续更多次的学习迭代,但永远无法达到100%的准确性,因为这需要进行无限次的计算。但即使在最坏的情况下,准确率也达到了99.77%,这也相当不错。


对于最终代码,我通过函数将其分开了。除此之外,在文本文件中,我还添加了一种非常复杂方法以存储权重。这样只需进行一次学习,而且需要使用AI时,只需导入权重并利用sigmoid函数即可。

import numpy as np
from tempfile import TemporaryFile
def sigmoid(x):
    return 1 / (1 + np.exp(-x))
def sigmoid_der(x):
    return x * (1 - x)
def training():
    training_inputs = np.array([[0,0,1,0], [1,1,1,0], [1,0,1,0], [0,1,1,1], [0,1,0,1]])
    trainign_outputs = np.array([[0,1,1,0,0]]).T
    np.random.seed(1)
    synaptic_weights = 2 * np.random.random((4,1)) - 1
            for i in range(50000):
        inputs = training_inputs
        outputs = sigmoid(np.dot(inputs, synaptic_weights))
        error = trainign_outputs - outputs
                adjustments = error * sigmoid_der(outputs)
        synaptic_weights += np.dot(inputs.T, adjustments)
    data_file = open("data.txt", "w")
    for row in synaptic_weights:
        np.savetxt(data_file, row)
    data_file.close()
def thinking(inputs):
    synaptic_weights = np.loadtxt("data.txt").reshape(4, 1)
    outputs = sigmoid(np.dot(inputs, synaptic_weights))
    print(outputs)
    return outputs
training()
thinking(np.array([1,1,0,1]))

这样就差不多完成了,但是后期还是需要自己投入时间去开发的。 (づ ̄3 ̄)づ╭❤~

这篇是我引用了一些其他文章的文段,然后进行修改整合,然后再结合我私下的操作完成的,希望能够帮助到你。如果有什么疑问麻烦私信我,谢谢你。


你可能感兴趣的:(笔记,python,人工智能,神经网络,机器学习,深度学习)