tnblog
首页
视频
资源
登录

python 矩阵、向量与Keras框架

6486人阅读 2023/4/24 11:32 总访问:3455652 评论:0 收藏:0 手机
分类: AI

python 矩阵、向量与Keras框架

矩阵、向量


随着传入的参数值越来越多,我们一步一步的写显得很麻烦,这时我们可以通过矩阵和向量来简化这一步骤。

矩阵与向量的诞生


以前我们学习数学的时候,一元一次函数,二元一次函数,三元一次函数。。。到n元一次函数,不够优雅也不够方便。
因此我们向量和矩阵诞生了。


我们以三元一次函数举例,把自变量x1、x2、x3放到X中,把权重系数w1、w2、w3放入到另一个W向量中,把偏置项b也放入一个B向量中。
接着我们将W进行转置,将横着的W变成竖着的一列。
再将X与W^T进行相乘再相加,再加上偏置项B,这个计算的结果恰好就是我们函数的运算结果。

向量名 描述
Z 结果向量
X 输入向量
W^T 权重系数向量
B 偏置系数向量


这样做变得很简洁、很统一。
当我们加入两个隐藏层神经元的神经网络,输入实际上就是分别送入两个线性函数进行计算,这时候单靠向量视乎不行了,得用上矩阵才行。

编程实践


为了确保我们工具类的正常运行,我们先安装tensorflowkeras

  1. pip install tensorflow -i https://pypi.mirrors.ustc.edu.cn/simple/
  2. pip install keras -i https://pypi.mirrors.ustc.edu.cn/simple/


创建工具类plot_utils_2.py

  1. import matplotlib.pyplot as plt
  2. from mpl_toolkits.mplot3d import Axes3D
  3. import numpy as np
  4. from keras.models import Sequential #导入keras
  5. def show_scatter_curve(X,Y,pres):
  6. plt.scatter(X, Y)
  7. plt.plot(X, pres)
  8. plt.show()
  9. def show_scatter(X,Y):
  10. if X.ndim>1:
  11. show_3d_scatter(X,Y)
  12. else:
  13. plt.scatter(X, Y)
  14. plt.show()
  15. def show_3d_scatter(X,Y):
  16. x = X[:,0]
  17. z = X[:,1]
  18. fig = plt.figure()
  19. ax = fig.add_subplot(111,projection='3d')
  20. ax.scatter(x, z, Y)
  21. plt.show()
  22. def show_surface(x,z,forward_propgation):
  23. x = np.arange(np.min(x),np.max(x),0.1)
  24. z = np.arange(np.min(z),np.max(z),0.1)
  25. x,z = np.meshgrid(x,z)
  26. y = forward_propgation(X)
  27. fig = plt.figure()
  28. ax = fig.add_subplot(111,projection='3d')
  29. ax.plot_surface(x, z, y, cmap='rainbow')
  30. plt.show()
  31. def show_scatter_surface(X,Y,forward_propgation):
  32. if type(forward_propgation) == Sequential:
  33. show_scatter_surface_with_model(X,Y,forward_propgation)
  34. return
  35. x = X[:,0]
  36. z = X[:,1]
  37. y = Y
  38. fig = plt.figure()
  39. ax = fig.add_subplot(111,projection='3d')
  40. ax.scatter(x, z, y)
  41. x = np.arange(np.min(x),np.max(x),0.1)
  42. z = np.arange(np.min(z),np.max(z),0.1)
  43. x,z = np.meshgrid(x,z)
  44. X = np.column_stack((x[0],z[0]))
  45. for j in range(z.shape[0]):
  46. if j == 0:
  47. continue
  48. X = np.vstack((X,np.column_stack((x[0],z[j]))))
  49. r = forward_propgation(X)
  50. y = r[0]
  51. if type(r) == np.ndarray:
  52. y = r
  53. y = np.array([y])
  54. y = y.reshape(x.shape[0],z.shape[1])
  55. ax.plot_surface(x, z, y, cmap='rainbow')
  56. plt.show()
  57. def show_scatter_surface_with_model(X,Y,model):
  58. #model.predict(X)
  59. x = X[:,0]
  60. z = X[:,1]
  61. y = Y
  62. fig = plt.figure()
  63. ax = fig.add_subplot(111,projection='3d')
  64. ax.scatter(x, z, y)
  65. x = np.arange(np.min(x),np.max(x),0.1)
  66. z = np.arange(np.min(z),np.max(z),0.1)
  67. x,z = np.meshgrid(x,z)
  68. X = np.column_stack((x[0],z[0]))
  69. for j in range(z.shape[0]):
  70. if j == 0:
  71. continue
  72. X = np.vstack((X,np.column_stack((x[0],z[j]))))
  73. y = model.predict(X)
  74. # return
  75. # y = model.predcit(X)
  76. y = np.array([y])
  77. y = y.reshape(x.shape[0],z.shape[1])
  78. ax.plot_surface(x, z, y, cmap='rainbow')
  79. plt.show()
  80. def pre(X,Y,model):
  81. model.predict(X)


更改上一节课的编码方式使用矩阵的方式来进行。

  1. import dataset
  2. import numpy as np
  3. import plot_utils_2
  4. m = 100
  5. #
  6. X,Y = dataset.get_beans7(m)
  7. print(X)
  8. print(Y)
  9. # 三维散点图
  10. plot_utils_2.show_scatter(X,Y)
  11. # w1 = 0.1
  12. # w2 = 0.1
  13. # 改成向量
  14. W = np.array([0.1,0.1])
  15. # b = 0.1
  16. B = np.array([0.1])
  17. # 前向传播
  18. def forward_propgation(X):
  19. # 预测函数
  20. # z = w1 * x1s + w2 * x2s + b
  21. # 矩阵计算
  22. Z = X.dot(W.T) + B
  23. # sigmoid函数求导
  24. # a = 1/(1+np.exp(-z))
  25. A = 1/(1+np.exp(-Z))
  26. return A
  27. # 绘制一次求导的过程
  28. plot_utils_2.show_scatter_surface(X,Y,forward_propgation)
  29. # 梯度下降 500 * 100
  30. for _ in range(500):
  31. for i in range(m):
  32. Xi = X[i]
  33. Yi = Y[i]
  34. # 进行前向传播一次
  35. A = forward_propgation(Xi)
  36. # 平方差
  37. E = (Yi - A) ** 2
  38. # e对a的求导
  39. dEdA = -2*(Yi-A)
  40. # a对z的求导
  41. dAdZ = A*(1-A)
  42. # z对w的求导
  43. dZdW = Xi
  44. # z对b的求导
  45. dZdB = 1
  46. # 获取de对dw求导
  47. dEdW = dEdA * dAdZ * dZdW
  48. # 获取de对db求导
  49. dEdB = dEdA * dAdZ * dZdB
  50. # 设置阿尔法的弧度为0.01
  51. alpha = 0.01
  52. # 计算误差
  53. W = W - alpha * dEdW
  54. B = B - alpha * dEdB
  55. plot_utils_2.show_scatter_surface(X,Y,forward_propgation)

Keras机器学习框架

什么是Keras?


Keras 是一个开源的深度学习框架,以 Python 语言编写,能够在 TensorFlow, CNTK 和 Theano 之上运行。Keras 是一个高层次的 API,可以方便快捷地构建和训练神经网络,专注于用户体验、模块化和可拓展性。它提供了一组简单易用的工具,可帮助用户定义神经网络的层、激活函数、损失函数、优化器、单元等等,并支持大量数据集的输入与输出操作。Keras 为深度学习的实验和快速原型工作提供了一个高效的开发环境。
Keras相当于Python语言简单易用,Tensorflow相当于C语言灵活强大。


我们自己实现一个神经元,首先需要前向传播,然后是代价函数、反向传播、梯度下降。
而Keras实现一个神经元只需要短短的五行代码。


如果希望把神经元变成两个,可以把units=1变成units=2.


最后汇合一下神经元就可以加一个神经元。

Keras的缺点


Keras并不是一个独立的框架,它是基于Tensorflow、CNTK、Theano之上写的一个框架,可以理解为python语言与C语言,如下图所示。


高度集成的框架,会出现对细节把控的不到位。

编程实践一


接下来我们通过Keras来实现四大模块。


首先我们解释一些名词。
Sequential这个实体可以理解为堆叠神经网络的载体。


Dense表示一个全连接层,简单来讲两个神经元的隐藏层是一个Dense,单个神经元的输出也是一个Dense。全连接表示所有层都进行相互关联。


添加豆豆类dataset.py

  1. import numpy as np
  2. def get_beans(counts):
  3. xs = np.random.rand(counts)
  4. xs = np.sort(xs)
  5. # ys = [1.2*x+np.random.rand()/10 for x in xs]
  6. ys = [(0.7*x+(0.5-np.random.rand())/5+0.5) for x in xs]
  7. return xs,ys
  8. def get_beans2(counts):
  9. xs = np.random.rand(counts)
  10. xs = np.sort(xs)
  11. ys = np.array([(0.7*x+(0.5-np.random.rand())/5+0.5) for x in xs])
  12. return xs,ys
  13. def get_beans3(counts):
  14. xs = np.random.rand(counts)*2
  15. xs = np.sort(xs)
  16. ys = np.zeros(counts)
  17. for i in range(counts):
  18. x = xs[i]
  19. yi = 0.7*x+(0.5-np.random.rand())/50+0.5
  20. if yi > 0.8 and yi < 1.4:
  21. ys[i] = 1
  22. return xs,ys
  23. def get_beans4(counts):
  24. xs = np.random.rand(counts,2)*2
  25. ys = np.zeros(counts)
  26. for i in range(counts):
  27. x = xs[i]
  28. if (np.power(x[0]-1,2)+np.power(x[1]-0.3,2))<0.5:
  29. ys[i] = 1
  30. return xs,ys
  31. def get_beans7(counts):
  32. xs = np.random.rand(counts,2)*2
  33. ys = np.zeros(counts)
  34. for i in range(counts):
  35. x = xs[i]
  36. if (x[0]-0.5*x[1]-0.1)>0:
  37. ys[i] = 1
  38. return xs,ys
  39. def get_beans0(counts):
  40. xs = np.random.rand(counts)
  41. xs = np.sort(xs)
  42. ys = np.zeros(counts)
  43. for i in range(counts):
  44. x = xs[i]
  45. yi = 0.7*x+(0.5-np.random.rand())/50+0.5
  46. if yi > 0.8:
  47. ys[i] = 1
  48. return xs,ys


编辑keras_for_blue.py代码

  1. import dataset
  2. import numpy as np
  3. import plot_utils_2
  4. # Sequential 表示堆叠神经网络的序列
  5. from keras.models import Sequential
  6. # 层与层之间都相互连接
  7. from keras.layers import Dense
  8. m = 100
  9. X,Y = dataset.get_beans0(m)
  10. plot_utils_2.show_scatter(X,Y)
  11. model = Sequential()
  12. # Dense 表示层
  13. # units 当前层神经元数量
  14. # sigmoid 激活函数类型
  15. # input_dim 输入数据特征维度
  16. dense = Dense(units=2,activation='sigmoid',input_dim=1)
  17. # 添加层
  18. model.add(dense)
  19. # mean_squared_error 均方误差
  20. # sgd 优化器 随机梯度下降算法 'sgd' 如果要设置阿尔法SGD(lr=0.05)
  21. # 评估标准 accuracy 准确度
  22. model.compile(loss='mean_squared_error',optimizer='sgd',metrics=['accuracy'])
  23. # 10次训练,5000回合数
  24. model.fit(X, Y, epochs=5000,batch_size=10)
  25. # 预测
  26. pres = model.predict(X)
  27. # 同时绘制一下散点图和预测曲线
  28. plot_utils_2.show_scatter_curve(X,Y,pres)

编程实践二

  1. import dataset
  2. import numpy as np
  3. import plot_utils_2
  4. # Sequential 表示堆叠神经网络的序列
  5. from keras.models import Sequential
  6. # 层与层之间都相互连接
  7. from keras.layers import Dense
  8. from keras.optimizers import SGD
  9. m = 100
  10. X,Y = dataset.get_beans3(m)
  11. plot_utils_2.show_scatter(X,Y)
  12. model = Sequential()
  13. # Dense 表示层
  14. # units 当前层神经元数量
  15. # sigmoid 激活函数类型
  16. # input_dim 输入数据特征维度
  17. dense = Dense(units=2,activation='sigmoid',input_dim=1)
  18. # 添加层
  19. model.add(dense)
  20. # 添加层
  21. model.add(Dense(units=1,activation='sigmoid'))
  22. # mean_squared_error 均方误差
  23. # sgd 优化器 随机梯度下降算法 'sgd' 如果要设置阿尔法SGD(lr=0.05)
  24. # 评估标准 accuracy 准确度
  25. model.compile(loss='mean_squared_error',optimizer=SGD(lr=0.05),metrics=['accuracy'])
  26. # 10次训练,5000回合数
  27. model.fit(X, Y, epochs=5000,batch_size=10)
  28. # 预测
  29. pres = model.predict(X)
  30. # 同时绘制一下散点图和预测曲线
  31. plot_utils_2.show_scatter_curve(X,Y,pres)

编程实践三

  1. import dataset
  2. import numpy as np
  3. import plot_utils_2
  4. from keras.models import Sequential
  5. # 层与层之间都相互连接
  6. from keras.layers import Dense
  7. from keras.optimizers import SGD
  8. m = 100
  9. X,Y = dataset.get_beans7(m)
  10. plot_utils_2.show_scatter(X,Y)
  11. model = Sequential()
  12. # Dense 表示层
  13. # units 当前层神经元数量
  14. # sigmoid 激活函数类型
  15. # input_dim 输入数据特征维度
  16. dense = Dense(units=1,activation='sigmoid',input_dim=2)
  17. # 添加层
  18. model.add(dense)
  19. # mean_squared_error 均方误差
  20. # sgd 优化器 随机梯度下降算法 'sgd' 如果要设置阿尔法SGD(lr=0.05)
  21. # 评估标准 accuracy 准确度
  22. model.compile(loss='mean_squared_error',optimizer=SGD(lr=0.05),metrics=['accuracy'])
  23. # 10次训练,5000回合数
  24. model.fit(X, Y, epochs=5000,batch_size=10)
  25. # 预测
  26. pres = model.predict(X)
  27. # 同时绘制一下散点图和预测曲线
  28. plot_utils_2.show_scatter_surface(X,Y,model)

编程实践四

  1. import dataset
  2. import numpy as np
  3. import plot_utils_2
  4. from keras.models import Sequential
  5. # 层与层之间都相互连接
  6. from keras.layers import Dense
  7. from keras.optimizers import SGD
  8. m = 100
  9. X,Y = dataset.get_beans4(m)
  10. plot_utils_2.show_scatter(X,Y)
  11. model = Sequential()
  12. # Dense 表示层
  13. # units 当前层神经元数量
  14. # sigmoid 激活函数类型
  15. # input_dim 输入数据特征维度
  16. dense = Dense(units=2,activation='sigmoid',input_dim=2)
  17. # 添加层
  18. model.add(dense)
  19. model.add(Dense(units=1,activation='sigmoid'))
  20. # mean_squared_error 均方误差
  21. # sgd 优化器 随机梯度下降算法 'sgd' 如果要设置阿尔法SGD(lr=0.05)
  22. # 评估标准 accuracy 准确度
  23. model.compile(loss='mean_squared_error',optimizer=SGD(lr=0.05),metrics=['accuracy'])
  24. # 10次训练,5000回合数
  25. model.fit(X, Y, epochs=5000,batch_size=10)
  26. # 预测
  27. pres = model.predict(X)
  28. # 同时绘制一下散点图和预测曲线
  29. plot_utils_2.show_scatter_surface(X,Y,model)


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

python学习 1-安装

Ptyhon非常简单易用的面向对象的脚本语言,跨平台 入门简单python分2个版本 Python2、Python3。Python 2.7 将于 2020 年结...

python学习 2-基本语法

基础:python脚本语言,不需要编译(像C#、Java、PHP、C++需要编译成机器可识别的语言), 而直接由解释器解释,很多地方类似...

python学习 3-爬虫基本介绍 及简单实例

爬虫爬虫就是一只猪,蜘蛛。。 网络蜘蛛。互联网是一个网由各个网站组成。无数的蜘蛛就在网上到处爬,根据网址从一个网站爬...

python实例 1-日志抓取处理 补错(附日志小技巧)

有时候数据出了问题,可以从日志中恢复数据(如果你没记日志..没备份..→_→..)一、日志展示介绍个平常自己用的小方法,如...

python实例 2-12306抢票(一) 登陆

开坑年关将近,终于对12306下手了,,平安夜撸代码,攻克了12306的登陆 2018-12-24 22:16:00没错 这篇博客就写从零开始的异...

python安装pip以及使用pip安装requests等模块

pip很简单的介绍pip 是一个现代的,通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。如果想...

python数据集合区别

列表(list):可读写,值可以重复,有序排列,初始化语法:[&#39;tom&#39;,‘jerry’]元组(tuple):只读,值可以重复,...

python实例 2-12306抢票(二) 下单

第二篇 刷票与下单1.记住登陆上一篇写了登陆:http://www.tnblog.net/cz/article/details/162 为了方便调试 不让每次登陆都...

使用VS Code开发python

Vs Code开发Python可以很好的支持代码调试、智能提示、代码对齐等1:下载VS Codehttps://code.visualstudio.com/Downloadvs ...

python变量与命名

Python使用等号 ( = ) 作为赋值运算符,例如a = 66 就是一条赋值语句,作用就是将66赋值给变量a。Python是弱类型语言,弱类...

python关键字和内置函数

Python中包含了如下所示的关键字:上面这些关键字都不能作为变量名。另外,Python 3还提供了如下表所示的内置函数:也不能...

python基础输入和输出

Python使用print()函数向打印程序输出,采用input()函数接收程序输入。print()函数的语法格式如下:print(value,...,sep=&#...

python基本数据类型

Python包含两大类基本数据类型:数值类型、字符串类型,三大类组合数据类型:集合类型、序列类型和字典类型.数值类型:整型...

python中通过fake_useragent生成随机UserAgent

fake_useragent第三方库,来实现随机请求头的设置;GitHub ---&gt; https://github.com/hellysmile/fake-useragent安...

python 升级pip

一条命令即可: python -m pip install --upgrade pip 安装成功后,一般是在python目录下面的Scripts里边的

python html编码解码

使用方法:html.escape(s)与html.unescape即可 import html s=&quot;&lt;div&gt;jsdlfjsl&lt;/div&gt;&quot; #html编...
这一世以无限游戏为使命!
排名
2
文章
633
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术