7-初识Keras:轻松完成神经网络模型搭建

声明

本文章基于哔哩哔哩付费课程《小白也能听懂的人工智能原理》。仅供学习记录、分享,严禁他用!!如有侵权,请联系删除

目录

一、知识引入

(一)矩阵和向量

1、向量

2、矩阵

(二)Keras框架

1、Keras实现一个神经元

2、存在的问题

二、编程实验1--向量和矩阵构建神经元

(一)编写预测模型-向量版

(二)前向传播--向量版

(三)反向传播--向量版

 (四)绘图

三、编程实验2--使用Keras实现学过的神经网络模型

(一)输入数据特征维度为1,仅使用激活函数激活,区间0,1表示有毒/无毒概率的数据集

1、使用Keras搭建神经网络

2、模型训练

3、模型预测

4、绘图

(二)加入隐藏层,使得函数富有多样的单调性

1、修改为2个神经元(隐藏层),并添加输出层神经元

2、调整学习率

3、绘图

(三)两个特征维度的输入数据,简单的线性可分情况

1、指定输入数据维度2,单神经元

2、绘制三维空间图形 

(四)两个特征维度的输入数据,加入隐藏层,扭曲预测曲面和分割线

1、指定输入数据维度2,修改为2个神经元(隐藏层),并添加输出层神经元

2、绘制三维空间图形


一、知识引入

(一)矩阵和向量

1、向量

        用三元一次函数(z = w1x1 + w2x2 + w3x3 + b)举例,用一个向量把函数的自变量放入其中、再把权重系数放入另一个向量中、偏置项系数b也放入一个向量中。

        定义向量的转置(T)

        定义向量间的乘法,点乘:对应元素相乘再相加

        加上偏置向量b

        对于一个1000元函数来说:

        向量元素的数量,也叫做维度。

        输入、权重参数、偏置项都看作是向量。

2、矩阵

        如果输入数据送入的是一组函数进行运算,比如加入隐藏层神经元的神经网络。

        每一个函数都有一个权重系数向量和偏置系数向量

        将函数的权重系数向量放在一起、偏置向量也放在一起,形成矩阵

        可以把矩阵看作是:由多个向量并在一起形成的“特殊向量”。矩阵的转置,也就可以看作是对其中每一个向量的转置

        再让输入x点乘权重系数矩阵。分别让输入向量x点乘第一列计算出第一个结果,再让输入向量x点乘第二列计算出第二个结果,两个计算结果组成结果向量。

        再加入偏置向量b

        对于多个函数,仍然可以使用z = x * wt + b表示

(二)Keras框架

        就像机器学习中的高级语言,实现了对机器学习神经网络底层复杂的数学运算的封装。可以轻松地通过它提供的各种上层接口搭建模型

1、Keras实现一个神经元

# 导入keras
from keras.models import Sequential

# 创建模型
model = Sequential()
# 创建一个神经元,使用sigmoid激活函数
# units表示神经元数量,当前隐藏层神经元数量为2
model.add(Dense(units = 2, activation = 'sigmoid', input_dim = 1))
# 创建一个输出层神经元,使用sigmoid激活函数
model.add(Dense(units = 1, activation = 'sigmoid'))
# 告诉keras使用均方误差代价函数 和 随机梯度下降算法(sgd)
model.compile(loss = 'mean_squared_error',
              optimizer = 'sgd',
              metrics = ['accuracy'])

# 开始训练
model.fit(x_train, y_train, epochs = 5, batch_size = 32)

2、存在的问题

  • Kears并不是独立存在的框架,需要通过调用诸如TensorFlow,CNTK 等独立框架实现

  • 封装的过于好,并没有像更加底层的TensorFlow框架那样灵活

  • 高度封装化,流失了对具体细节的控制

二、编程实验1--向量和矩阵构建神经元

(一)编写预测模型--向量版

# 编写预测模型
# 因为有2个树突,所以输入和神经元之间有2个权重参数
W = np.array([0.1, 0.1])
B = np.array([0.1])

(二)前向传播--向量版

# 编写前向传播代码
# 参数X同时包含豆豆的两个特征维度数据
def forward_propagation(X):
    # 向量运算
    # ndarray的dot函数:点乘运算(相乘再相加)
    # ndarray的T属性:转置运算
    Z = X.dot(W.T) + B
    # exp操作也有广播机制,让此运算发生在每个元素上,1除以它们,依旧是广播效果
    # 最终结果仍旧是一个向量
    # Z:[w1x11 + w2x12 + b]
    # 结果A也是一个单元素的向量
    A = 1 / (1 + np.exp(-Z))
    return A

(三)反向传播--向量版

for _ in range(5000):
    for i in range(num):
        # 一行两列,表示一个豆豆的大小和深浅的数据特征
        Xi = X[i]
        Yi = Y[i]
        # 最终返回的A向量,也就一行一列
        A = forward_propagation(Xi)
        # A是一行一列,Y是一个数子,也就是一行一列
        # 误差e结果仍然为一行一列
        E = (Yi - A)**2

        # 一行一列
        dEdA = -2 * (Yi - A)
        # 一行一列
        dAdZ = A * (1 - A)
        # 一行两列
        dZdW = Xi
        # 一行一列
        dZdB = 1

        # 链式求导
        # 一行两列,恰好表示误差在这个两个权重系数上的导数
        dEdW = dEdA * dAdZ * dZdW
        dEdB = dEdA * dAdZ * dZdW

        alpha = 0.01
        W = W - alpha * dEdW
        B = B - alpha * dEdB

 (四)绘图

plot_utils.show_scatter_surface(X, Y, forward_propgation)

三、编程实验2--使用Keras实现学过的神经网络模型

(一)输入数据特征维度为1,仅使用激活函数激活,区间0,1表示有毒/无毒概率的数据集

1、使用Keras搭建神经网络

  • units表示这一层有几个神经元
  • activation表示指定的激活函数类型
  • input_dim输入数据的特征维度,此处只有豆豆的大小这1个特征
  • loss均方误差代价函数,损失函数和代价函数一般都认为是同一种东西
  • optimizer优化器:用来优化 or 调整参数的算法,sgd:随机梯度下降算法
  • metrics:训练时希望得到的评估标准,accuracy准确度
# 使用Keras搭建神经网络模型
# 创建一个Sequential,将神经元堆叠在一起组成一个网络预测模型
model = Sequential()
# 创建全连接层
# 指定参数,units表示这一层有几个神经元;activation表示指定的激活函数类型
# input_dim输入数据的特征维度,此处只有豆豆的大小这1个特征
dense = Dense(units=1, activation='sigmoid', input_dim=1)
# 将全连接层Dense堆叠到序列上
model.add(dense)
# 配置模型
# 均方误差代价函数,损失函数和代价函数一般都认为是同一种东西
model.compile(loss='mean_squared_error',
              # 优化器:用来优化 or 调整参数的算法,sgd:随机梯度下降算法
              optimizer='sgd',
              # metrics:训练时希望得到的评估标准,accuracy准确度
              metrics=['accuracy'])

2、模型训练

  • epochs训练的回合数,在全体样本完成一次训练称为一个回合
  • batch_size每一次训练使用的样本数量
# 开始训练
# epochs训练的回合数,在全体样本完成一次训练称为一个回合
# 每一次训练使用的样本数量batch_size
model.fit(X, Y, epochs=5000, batch_size=10)

3、模型预测

# 对训练好的模型进行预测
pres = model.predict(X)

4、绘图

# 同时绘制散点图和预测曲线
plot_utils.show_scatter_curve(X, Y, pres)

(二)加入隐藏层,使得函数富有多样的单调性

1、修改为2个神经元(隐藏层),并添加输出层神经元

# 指定参数,units表示这一层有几个神经元;activation表示指定的激活函数类型
# input_dim输入数据的特征维度,此处只有豆豆的大小这1个特征
dense = Dense(units=2, activation='sigmoid', input_dim=1)
# 输出层的神经元
dense2 = Dense(units=1, activation='sigmoid')
# 将全连接层Dense堆叠到序列上
model.add(dense)
model.add(dense2)

2、调整学习率

model.compile(loss='mean_squared_error',
              # SGD优化器默认学习率为0.01,我们使用创建对象的方式,设定其学习率为0.05
              optimizer=SGD(lr=0.05),
              # metrics:训练时希望得到的评估标准,accuracy准确度
              metrics=['accuracy'])

3、绘图

plot_utils.show_scatter_curve(X, Y, pres)

(三)两个特征维度的输入数据,简单的线性可分情况

1、指定输入数据维度2,单神经元

dense = Dense(units=1, activation='sigmoid', input_dim=2)
model.add(dense)

2、绘制三维空间图形 

plot_utils.show_scatter_surface(X, Y, model)

(四)两个特征维度的输入数据,加入隐藏层,扭曲预测曲面和分割线

1、指定输入数据维度2,修改为2个神经元(隐藏层),并添加输出层神经元

dense = Dense(units=2, activation='sigmoid', input_dim=2)
# 输出层的神经元
dense2 = Dense(units=1, activation='sigmoid')
# 将全连接层Dense堆叠到序列上
model.add(dense)
model.add(dense2)

2、绘制三维空间图形

plot_utils.show_scatter_surface(X, Y, model)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/469497.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java Flink(四十三)Flink Interval Join源码解析以及简单实例

背景 之前我们在一片文章里简单介绍过Flink的多流合并算子 java Flink(三十六)Flink多流合并算子UNION、CONNECT、CoGroup、Join 今天我们通过Flink 1.14的源码对Flink的Interval Join进行深入的理解。 Interval Join不是两个窗口做关联,…

001_【基础篇】SpringBoot入门案例创建与实现

要求&#xff1a;使用 Springboot 开发一个 web 程序&#xff0c;浏览器发起请求/hello后&#xff0c;给浏览器返回字符串 hello springboot 使用 springboot 只需要引入一个起步依赖 <dependency><groupId>org.springframework.boot</groupId><artifac…

STP环路避免实验(思科)

华为设备参考&#xff1a;STP环路避免实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 Spanning Tree Protocol&#xff08;STP&#xff09;&#xff0c;即生成树协议&#xff0c;是一种数据链路层协议。主要作用是防止二层环路&#xff0c;并自适应网络变化和故障…

个人网站制作 Part 9 添加发布、管理博客功能 | Web开发项目

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加博客功能&#x1f528;使用Express和MongoDB&#x1f527;步骤 1: 创建博客模型&#x1f527;步骤 2: 创建博客路由 &#x1f528;使用前端框架&#x1f527;步骤 3:…

什么是零日攻击?

一、零日攻击的概念 零日攻击是指利用零日漏洞对系统或软件应用发动的网络攻击。 零日漏洞也称零时差漏洞&#xff0c;通常是指还没有补丁的安全漏洞。由于零日漏洞的严重级别通常较高&#xff0c;所以零日攻击往往也具有很大的破坏性。 目前&#xff0c;任何安全产品或解决方案…

OxyPlot 导出图片

在 OxyPlot 官方文档 https://oxyplot.readthedocs.io/en/latest/export/index.html 中查看 这里用到的是导出到 PNG 文件的方法&#xff0c;不过用的 NuGet 包最新版&#xff08;2.1.0&#xff09;中&#xff0c;PngExporter 中并没有 Background 属性&#xff1a; 所以如果图…

字符函数与字符串函数

前言 本次博客可以说内容最为多的一次博客&#xff0c;讲解同样很细致大家好好看看 1字符函数 在讲解字符函数时,大家得了解什么是字符吧 普通字符a b c 1 转义字符 \n 换行‘ \t’ 水平制表符\r回车 大家了解即可 在C语言中字符也可以有分类 所以我们先来看看…

软件测试经验与教训

大概在18年的时候&#xff0c;就看过《软件测试经验与教训》的纸制版&#xff0c;里面的一些观点深刻的影响了我&#xff0c;也影响了后来我对测试的思考。最近又一次快速阅读了电子版&#xff0c;还是收获满满。下面精选出10条&#xff0c;和大家分享。 一、测试人员是项目的…

testng测试类第2步

创建xml文件并编写xml文件 并学习其中的参数 1、创建 xml文件 在测试包->右键找到creat TestNG XML 创建xml文件 如果报错就可以粘贴过来 认识原始文件 这里首行是标识&#xff0c;其次是2个参数&#xff0c;name是测试套件的名称&#xff0c;谁的测试套件一般是公司名称…

JAVA实战手册-开篇总述

该专题以实战为出发点&#xff0c;总结概述了实际工作中常用的java知识点&#xff0c;掌握了这些知识点&#xff0c;日常工作开发以及面试都不在话下。 话不多说&#xff0c;直入正题&#xff0c;以下为JAVA知识点概括总结&#xff08;总计涵盖了10大类78小项&#xff09; 针对…

AcWing 727. 菱形——像拼图一样做题

题目描述] 分析&#xff1a; 利用程序根据输入的整数&#xff0c;画出由字符*构成的该整数阶的实心菱形。给出一个示例&#xff1a; n 7 n7 n7。 * * * * * * * * * * * * * * * * * * * * * * * * * 我们将采取拆解问题&#xff0c;通过四个部分的…

Linux编程4.7 网络编程-套接字与地址

1、因特网地址结构 struct in_addr{in_addr_t s_addr; /*ipv4地址*/ }struct sockaaddr_in{short int sin_family; /*Internet地址族&#xff0c;如AF_INET&#xff08;主机字节序&#xff09;*/ unsigned short int sin_port; /*端口号&#xff0c;16…

upload-labs第二关第五关

upload-labs第二关 1、先上传个马试试&#xff0c;看看页面显示什么&#xff0c;要先把上次上传的马删掉哦 2、提示文件类型不正确&#xff0c;在看下提示说是在服务端做了检查 3、那就上传个php格式的&#xff0c;然后呢bp抓包把文件格式改了 4、修改后的 5、修改后发现不…

【物联网】Modbus 协议及应用

Modbus 协议简介 QingHub设计器在设计物联网数据采集时不可避免的需要针对Modbus协议的设备做相关数据采集&#xff0c;这里就我们的实际项目经验分享Modbus协议 简介 Modbus由MODICON公司于1979年开发&#xff0c;是一种工业现场总线协议标准。1996年施耐德公司推出基于以太…

ansible 运维自动化

pxe 一键安装操作系统 操作系统只是提供一个平台 lnmp 需要多软件协同完成的一个简单项目 服务器正常运行 日常运维 巡检 服务器上的软件正常运行 zabbix 普罗米修斯 系统调优&#xff0c;架构调优 前言 运维自动化 云计算核心职能 搭建平台架构 …

TCPIP协议总结

一、TCP的三次握手 TCP连接的建立时&#xff0c;双方需要经过三次握手&#xff0c;而断开连接时&#xff0c;双方需要经过四次分手&#xff0c;那么&#xff0c;其三次握手和四次分手分别做了什么呢&#xff1f;又是如何进行的呢&#xff1f; 通常情况下&#xff0c;建立连接的…

从零开始学习如何使用 Postman 请求头

当你在使用 Postman 发送请求时&#xff0c;请求头&#xff08;Headers&#xff09;是你可以包含在 HTTP 请求中的重要部分之一。请求头包含了关于请求的元数据信息&#xff0c;这些信息对于服务器来处理请求是非常重要的。下面是一份详细的图文介绍&#xff0c;说明了如何在 P…

电商数据采集效率开挂【Python电商数据采集API接口】

数据监测 监测线上电商平台的商品、店铺数据&#xff0c;包括商品销量/库存/价格/店铺等级/发货地/促销活动等信息&#xff0c;支持十多个国内主流电商平台。 在线维权 实现多平台在线一键投诉&#xff0c;与各大电商投诉平台系统对接&#xff0c;实时同步投诉进展。 渠道管…

C# visual studio 2022 学习2

类成员&#xff1a; 1.字段成员 字段只是类中声明的一个变量&#xff0c;用来在对象中存储信息。 &#xff08;1&#xff09;.静态字段 使用static关键字修饰的就是静态字段&#xff0c;静态字段属于类而不属于某个类实例&#xff0c;对它的访问使用“类名.静态字段名” &…

28-2 文件上传漏洞 - 双写绕过

环境准备&#xff1a;构建完善的安全渗透测试环境&#xff1a;推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、双写绕过原理 在代码编写过程中&#xff0c;双写绕过原理指的是只对黑名单中的内容进行一次空替换。由于只进行一次替换&#xff0c;导致了双写绕过的情况…