推荐 :手把手教你用Python创建简单的神经网络(附代码)

本文详细指导如何用Python创建一个神经网络,通过训练数据预测输出值,亲自动手实现Sigmoid函数和反向传播,以理解神经网络工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解神经网络工作方式的最佳途径莫过于亲自创建一个神经网络,本文将演示如何做到这一点。

神经网络(NN)又称人工神经网络(ANN),是机器学习领域中基于生物神经网络概念的学习算法的一个子集。

拥有五年以上经验的德国机器学习专家Andrey Bulezyuk声称:“神经网络正在彻底改变机器学习,因为它们能够在广泛的学科和行业中为抽象对象高效建模。”

人工神经网络基本上由以下组件组成:

  • 输入层:接收并传递数据
  • 隐藏层
  • 输出层
  • 各层之间的权重
  • 每个隐藏层都有一个激活函数。在这个简单的神经网络Python教程中,我们将使用Sigmoid激活函数。

神经网络有多种类型。在本项目中,我们将创建前馈或感知神经网络。这种类型的ANN直接将数据从前向后传递。

前馈神经元的训练往往需要反向传播,它为网络提供了相应的输入和输出集。当输入数据被传送到神经元时,经过处理后,产生一个输出。

下面的图表显示了一个简单的神经网络的结构:
在这里插入图片描述
了解神经网络如何工作的最佳方法是学习如何从头开始构建神经网络(而不是采用任何库)。

在本文中,我们将演示如何利用Python编程语言创建一个简单的神经网络。

问题

如下是一个展示问题的表格。
在这里插入图片描述
我们将提供一个新的数据集,利用它训练神经网络,从而能够预测正确的输出值。

正如上表所示,输出值总是等于输入部分中的第一个值。因此,我们期望输出的值为1。

让我们看看是否可以使用Python代码来得出相同的结果(你可以在本文末尾仔细阅读这个项目的代码,然后再继续阅读本文)。

创建一个NeuralNetwork类

我们将用Python创建一个NeuralNetwork类来训练神经元,以期给出准确的预测。这个类还会有其他的帮助函数。

即使我们不会在这个简单的神经网络示例中使用神经网络库,我们也将导入numpy库来辅助计算。

numpy库提供了以下四种重要方法:

  • exp—用于生成自然指数
  • array—用于生成矩阵
  • dot—用于矩阵相乘
  • random—用于生成随机数。请注意,我们将生成随机数,以确保它们的有效分布。

1.应用Sigmoid函数

我们将使用Sigmoid函数,来绘制一个特征“S”型曲线,作为神经网络的激活函数。
在这里插入图片描述
此函数可以将任何值映射到0到1之间的值,它将有助于我们对输入的加权和归一化。

此后,我们将创建Sigmoid函数的导数,以帮助计算权重的调整参数。

可以利用Sigmoid函数的输出来生成它的导数。例如,如果输出变量为“x”,则其导数为x*(1-x)。

2. 训练模型

这是我们教神经网络做出准确预测的阶段。每个输入都有一个权重-可为正值或负值。这意味着:有较大的正权重或负权重的输入会对结果的输出产生更大的影响。请记住,我们最初是通过为每个随机数分配一个权重后开始的。

下面是这个神经网络示例的训练过程:

第一步:从训练数据集中提取输入,根据训练数据集的权重进行调整,并通过一种计算神经网络输出的方法对其进行筛选。

第二步:计算反向传播错误率。在这种情况下,它是神经元的预测输出与训练数据集的期望输出之间的差异。

第三步:利用误差加权导数公式,根据所得到的误差范围,进行了一些较小的权值调整。

第四步:对这一过程进行15000次迭代。在每次迭代中,整个训练集被同时处理。

我们使用“.T”函数将矩阵从水平位置转换为垂直位置。因此,数字将以如下方式存储:
在这里插入图片描述

最终,神经元的权重将根据所提供的训练数据进行优化。随后,如果让神经元考虑一个新的状态,与先前的状态相同,它便可以作出一个准确的预测。这就是反向传播的方式。

打包运行

最后,NeuralNetwork类初始化成功后,可以运行代码了。

下面是如何在Python项目中创建神经网络的完整代码:

import numpy as np

 

class NeuralNetwork():

    

    def __init__(self):

        # seeding for random number generation

        np.random.seed(1)

        

        #converting weights to a 3 by 1 matrix with values from -1 to 1 and mean of 0

        self.synaptic_weights = 2 * np.random.random((3, 1)) - 1

 

    def sigmoid(self, x):

        #applying the sigmoid function

        return 1 / (1 + np.exp(-x))

 

    def sigmoid_derivative(self, x):

        #computing derivative to the Sigmoid function

        return x * (1 - x)

 

    def train(self, training_inputs, training_outputs, training_iterations):

        

        #training the model to make accurate predictions while adjusting weights continually

        for iteration in range(training_iterations):

            #siphon the training data via  the neuron

            output = self.think(training_inputs)

 

            #computing error rate for back-propagation

            error = training_outputs - output

            

            #performing weight adjustments

            adjustments = np.dot(training_inputs.T, error * self.sigmoid_derivative(output))

 

            self.synaptic_weights += adjustments

 

    def think(self, inputs):

        #passing the inputs via the neuron to get output   

        #converting values to floats

        

        inputs = inputs.astype(float)

        output = self.sigmoid(np.dot(inputs, self.synaptic_weights))

        return output

 

 

if __name__ == "__main__":

 

    #initializing the neuron class

    neural_network = NeuralNetwork()

 

    print("Beginning Randomly Generated Weights: ")

    print(neural_network.synaptic_weights)

 

    #training data consisting of 4 examples--3 input values and 1 output

    training_inputs = np.array([[0,0,1],

                                [1,1,1],

                                [1,0,1],

                                [0,1,1]])

 

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

 

    #training taking place

    neural_network.train(training_inputs, training_outputs, 15000)

 

    print("Ending Weights After Training: ")

    print(neural_network.synaptic_weights)

 

    user_input_one = str(input("User Input One: "))

    user_input_two = str(input("User Input Two: "))

    user_input_three = str(input("User Input Three: "))

    

    print("Considering New Situation: ", user_input_one, user_input_two, user_input_three)

    print("New Output data: ")

    print(neural_network.think(np.array([user_input_one, user_input_two, user_input_three])))

print("Wow, we did it!")

运行代码之后的输出:
在这里插入图片描述
这样,我们便成功地创建了一个简单的神经网络。

神经元首先给自己分配一些随机权重,接着,利用训练实例进行了自我训练。

之后,如果出现新的状态[1,0,0],则它得出的数值为0.9999584。

还记得我们想要的正确答案是1吗?

这个数值非常接近,Sigmoid函数输出值在0到1之间。

当然,在这个例子中,我们只使用一个神经元网络来完成简单的任务。如果我们把几千个人工神经网络连接在一起,情况将会是怎样呢?我们能不能完全模仿人类的思维方式呢?

读者福利:知道你对Python感兴趣,便准备了这套python学习资料

👉[[CSDN大礼包:《python兼职资源&全套学习资料》免费分享]]安全链接,放心点击

对于0基础小白入门:

如果你是零基础小白,想快速入门Python是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以找到适合自己的学习方案

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等习教程。带你从零基础系统性的学好Python!

零基础Python学习资源介绍

  • ① Python所有方向的学习路线图,清楚各个方向要学什么东西
  • ② 600多节Python课程视频,涵盖必备基础、爬虫和数据分析
  • ③ 100多个Python实战案例,含50个超大型项目详解,学习不再是只会理论
  • ④ 20款主流手游迫解 爬虫手游逆行迫解教程包
  • 爬虫与反爬虫攻防教程包,含15个大型网站迫解
  • 爬虫APP逆向实战教程包,含45项绝密技术详解
  • ⑦ 超300本Python电子好书,从入门到高阶应有尽有
  • ⑧ 华为出品独家Python漫画教程,手机也能学习
  • ⑨ 历年互联网企业Python面试真题,复习时非常方便

👉Python学习路线汇总👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取哈)
在这里插入图片描述

👉Python必备开发工具👈

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

👉实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

👉100道Python练习题👈

检查学习结果。
在这里插入图片描述

👉面试刷题👈

在这里插入图片描述

在这里插入图片描述

python副业兼职与全职路线

在这里插入图片描述

上述这份完整版的Python全套学习资料已经上传CSDN官方,朋友们如果需要可以微信扫描下方CSDN官方认证二维码 即可领取↓↓↓

### 如何使用Python实现近似最近邻(Approximate Nearest Neighbor, ANN)算法 #### 使用Hierarchical Navigable Small World Graphs (HNSW) 一种高效的ANN解决方案是基于分层可导航小世界图(Hierarchical Navigable Small World graphs, HNSW)[^1]。该结构允许快速执行高维空间中的相似度搜索。 为了展示这一过程,下面提供了一个简单例子,说明如何通过Faiss库在Python中实施HNSW索引: ```python import faiss import numpy as np # 创建随机数据作为示例输入 d = 64 # 向量维度 nb = 1000 # 数据集大小 np.random.seed(1234) # 设置随机种子以便结果重现 dataset = np.random.random(size=(nb, d)).astype('float32') # 构建HNSW索引 hnsw_index = faiss.IndexHNSWFlat(d, 32) # 参数m控制最大连接数 hnsw_index.hnsw.efConstruction = 200 # 增加efConstruction提高构建质量 hnsw_index.add(dataset) # 添加数据到索引 # 查询最接近的邻居 k = 4 # 查找前四个最近邻 query_vector = dataset[:5] # 取前五个向量作查询样本 hnsw_index.hnsw.efSearch = 100 # 调整efSearch以平衡速度和精度 distances, indices = hnsw_index.search(query_vector, k) print("Distances:", distances) print("Indices of nearest neighbors:", indices) ``` 这段代码展示了怎样初始化一个`IndexHNSWFlat`实例并配置其参数;接着添加一些随机生成的数据点至索引内;最后针对几个查询向量检索它们各自的$k$个最近邻及其对应的距离值[^1]。 #### K-近邻(KNN)算法的应用于文本分类 另一种常见的ANN应用场景是在文本分类任务里采用KNN方法。这里给出了一种具体做法——借助scikit-learn工具包完成整个流程,包括但不限于加载数据集、预处理文档以及建立与评估模型等操作[^2]。 ```python from sklearn.datasets import fetch_20newsgroups from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.neighbors import KNeighborsClassifier from sklearn.pipeline import Pipeline from sklearn.metrics import classification_report # 加载新闻组数据子集用于训练和测试 data_train = fetch_20newsgroups(subset='train', categories=['alt.atheism', 'soc.religion.christian']) data_test = fetch_20newsgroups(subset='test', categories=['alt.atheism', 'soc.religion.christian']) # 定义管道:先转成tf-idf特征再送入KNN分类器 text_clf = Pipeline([ ('vect', TfidfVectorizer(stop_words="english")), ('clf', KNeighborsClassifier(n_neighbors=5)) ]) # 训练模型 text_clf.fit(data_train.data, data_train.target) # 预测类别标签并对性能做出评价 predicted_labels = text_clf.predict(data_test.data) report = classification_report(data_test.target, predicted_labels) print(report) ``` 上述脚本首先获取了来自20Newsgroup语料库的部分类目下的文章集合,并将其划分为训练集和验证集两部分。之后定义好由TfidfVectorizer负责文本量化而KNeighborsClassifier承担决策职责的一条流水线。最终经过拟合阶段后即能依据新样本来推测所属主题并向用户提供反馈报告。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值