Python人工智能 | 十六.Keras环境搭建、入门基础及回归神经网络案例
文章目录:
一.为什么要使用Keras
二.安装Keras和兼容Backend
1.如何安装Keras
2.兼容Backend
三.白话神经网络
四.Keras搭建回归神经网络
五.总结
https://github.com/eastmountyxz/
AI-for-TensorFlowhttps://github.com/eastmountyxz/
AI-for-Keras
学Python近八年,认识了很多大佬和朋友,感恩。作者的本意是帮助更多初学者入门,因此在github开源了所有代码,也在公众号同步更新。深知自己很菜,得拼命努力前行,编程也没有什么捷径,干就对了。希望未来能更透彻学习和撰写文章,也能在读博几年里学会真正的独立科研。同时非常感谢参考文献中的大佬们的文章和分享。
- https://blog.csdn.net/eastmount
一.为什么要使用Keras
首先分享Keras基础原理及语法
接着使用Keras搭建回归神经网络、分类神经网络、CNN、RNN、LSTM、Autoencoder等
最后结合Keras实现各种自然语言处理、图像分类、文本挖掘、语音识别、视频分析等案例
二.安装Keras和兼容Backend
1.如何安装Keras
Numpy
Scipy
activate tensorflow
pip3 install keras
pip install keras
# -*- coding: utf-8 -*-
"""
Created on Fri Feb 14 16:43:21 2020
@author: Eastmount CSDN
"""
import numpy as np
from keras.preprocessing.sequence import TimeseriesGenerator
# 时间序列
y = np.array(range(5))
tg = TimeseriesGenerator(y, y, length=3, sampling_rate=1)
for i in zip(*tg[0]):
print(*i)
2.兼容Backend
第一种方法,找到“keras/keras.json”这个文件,然后打开它。所有的backend信息就存储在这里,每次导入Keras包就会检测这个“keras.json”文件的backend。接着我们尝试修改。
第二种方法是在命令行中输入下面这句命令,每次运行脚本时它会直接帮你修改成临时的TensorFlow。
import os
os.environ['KERAS_BACKEND']='tensorflow'
import keras
三.白话神经网络
输入层:直接接收信息的神经层,比如接收一张猫的图片
输出层:信息在神经元中传递中转和分析权衡,形成输出结果,通过该层输出的结果可以看出计算机对事物的认知
隐藏层:在输入和输出层之间的众多神经元连接组成的各个层面,可以有多层,负责对传入信息的加工处理,经过多层加工才能衍生出对认知的理解
四.Keras搭建回归神经网络
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
import matplotlib.pyplot as plt
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
import matplotlib.pyplot as plt
#---------------------------创建散点数据---------------------------
# 输入
X = np.linspace(-1, 1, 200)
# 随机化数据
np.random.shuffle(X)
# 输出
y = 0.5*X + 2 + np.random.normal(0, 0.05, (200,)) #噪声平均值0 方差0.05
# 绘制散点图
plt.scatter(X, y)
plt.show()
# 数据集划分(训练集-测试集)
X_train, y_train = X[:160], y[:160] # 前160个散点
X_test, y_test = X[160:], y[160:] # 后40个散点
创建Sequential模型。
添加神经网络层。在Keras中,增加层的操作非常简单,调用model.add(Dense(output_dim=1, input_dim=1))函数添加即可。注意,如果再添加一个神经层,默认上一层的输出为下一层的输入数据,此时不需要定义input_dim,比如model.add(Dense(output_dim=1, ))。
搭建模型并选择损失函数(loss function)和优化方法(optimizing method)。
#----------------------------添加神经层------------------------------
# 创建模型
model = Sequential()
# 增加全连接层 输出个数和输入个数(均为1个)
model.add(Dense(output_dim=1, input_dim=1))
# 搭建模型 选择损失函数(loss function)和优化方法(optimizing method)
# mse表示二次方误差 sgd表示乱序梯度下降优化器
model.compile(loss='mse', optimizer='sgd')
print("训练")
# 学习300次
for step in range(301):
# 分批训练数据 返回值为误差
cost = model.train_on_batch(X_train, y_train)
# 每隔100步输出误差
if step % 100 == 0:
print('train cost:', cost)
5.测试神经网络并输出误差\权重和偏置
print("测试")
# 运行模型测试 一次传入40个测试散点
cost = model.evaluate(X_test, y_test, batch_size=40)
# 输出误差
print("test cost:", cost)
# 获取权重和误差 layers[0]表示第一个神经层(即Dense)
W, b = model.layers[0].get_weights()
# 输出权重和偏置
print("weights:", W)
print("biases:", b)
6.绘制预测图形
y_pred = model.predict(X_test)
plt.scatter(X_test, y_test)
plt.plot(X_test, y_pred)
plt.show()
输出结果如下所示:
误差从4.002261下降到0.0030148015,说明学习到知识。同时,误差为0.47052705接近我们的初始值0.5,偏置为1.9944116也接近2。
训练
train cost: 4.002261
train cost: 0.07719966
train cost: 0.005076804
train cost: 0.0030148015
测试
40/40 [==============================] - 0s 1ms/step
test cost: 0.0028453178238123655
weights: [[0.47052705]]
biases: [1.9944116]
完整代码如下:
# -*- coding: utf-8 -*-
"""
Created on Fri Feb 14 16:43:21 2020
@author: Eastmount CSDN YXZ
O(∩_∩)O Wuhan Fighting!!!
"""
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
import matplotlib.pyplot as plt
#---------------------------创建散点数据---------------------------
# 输入
X = np.linspace(-1, 1, 200)
# 随机化数据
np.random.shuffle(X)
# 输出
y = 0.5*X + 2 + np.random.normal(0, 0.05, (200,)) #噪声平均值0 方差0.05
# 绘制散点图
# plt.scatter(X, y)
# plt.show()
# 数据集划分(训练集-测试集)
X_train, y_train = X[:160], y[:160] # 前160个散点
X_test, y_test = X[160:], y[160:] # 后40个散点
#----------------------------添加神经层------------------------------
# 创建模型
model = Sequential()
# 增加全连接层 输出个数和输入个数(均为1个)
model.add(Dense(output_dim=1, input_dim=1))
# 搭建模型 选择损失函数(loss function)和优化方法(optimizing method)
# mse表示二次方误差 sgd表示乱序梯度下降优化器
model.compile(loss='mse', optimizer='sgd')
#--------------------------------Traning----------------------------
print("训练")
# 学习300次
for step in range(301):
# 分批训练数据 返回值为误差
cost = model.train_on_batch(X_train, y_train)
# 每隔100步输出误差
if step % 100 == 0:
print('train cost:', cost)
#--------------------------------Test-------------------------------
print("测试")
# 运行模型测试 一次传入40个测试散点
cost = model.evaluate(X_test, y_test, batch_size=40)
# 输出误差
print("test cost:", cost)
# 获取权重和误差 layers[0]表示第一个神经层(即Dense)
W, b = model.layers[0].get_weights()
# 输出权重和偏置
print("weights:", W)
print("biases:", b)
#------------------------------绘制预测图形-----------------------------
y_pred = model.predict(X_test)
plt.scatter(X_test, y_test)
plt.plot(X_test, y_pred, "red")
plt.show()
下面补充代码对比各训练阶段拟合的直线,可以看到随着训练次数增加,误差逐渐降低并且拟合的直线越来越好。
# -*- coding: utf-8 -*-
"""
Created on Fri Feb 14 16:43:21 2020
@author: Eastmount CSDN YXZ
O(∩_∩)O Wuhan Fighting!!!
"""
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
import matplotlib.pyplot as plt
#---------------------------创建散点数据---------------------------
# 输入
X = np.linspace(-1, 1, 200)
# 随机化数据
np.random.shuffle(X)
# 输出
y = 0.5*X + 2 + np.random.normal(0, 0.05, (200,)) #噪声平均值0 方差0.05
# 绘制散点图
# plt.scatter(X, y)
# plt.show()
# 数据集划分(训练集-测试集)
X_train, y_train = X[:160], y[:160] # 前160个散点
X_test, y_test = X[160:], y[160:] # 后40个散点
#----------------------------添加神经层------------------------------
# 创建模型
model = Sequential()
# 增加全连接层 输出个数和输入个数(均为1个)
model.add(Dense(output_dim=1, input_dim=1))
# 搭建模型 选择损失函数(loss function)和优化方法(optimizing method)
# mse表示二次方误差 sgd表示乱序梯度下降优化器
model.compile(loss='mse', optimizer='sgd')
#--------------------------------Traning----------------------------
print("训练")
k = 0
# 学习1000次
for step in range(1000):
# 分批训练数据 返回值为误差
cost = model.train_on_batch(X_train, y_train)
# 每隔100步输出误差
if step % 100 == 0:
print('train cost:', cost)
#-----------------------------------------------------------
# 运行模型测试 一次传入40个测试散点
cost = model.evaluate(X_test, y_test, batch_size=40)
# 输出误差
print("test cost:", cost)
# 获取权重和误差 layers[0]表示第一个神经层(即Dense)
W, b = model.layers[0].get_weights()
# 输出权重和偏置
print("weights:", W)
print("biases:", b)
#-----------------------------------------------------------
# 可视化绘图
k = k + 1
plt.subplot(5, 2, k)
y_pred = model.predict(X_test)
plt.scatter(X_test, y_test)
plt.plot(X_test, y_pred, "red", label='cost=%.4f k=%d' %(cost,k))
plt.legend()
plt.show()
六.总结
写到这里,这篇基础性的Keras文章就讲述完毕。它通过不断地训练和学习,将预测结果与实际直线y=0.5*x+2相匹配,这是非常基础的一篇深度学习文章。
最后,希望这篇基础性文章对您有所帮助,如果文章中存在错误或不足之处,还请海涵~作为人工智能的菜鸟,我希望自己能不断进步并深入,后续将它应用于图像识别、网络安全、对抗样本等领域,指导大家撰写简单的学术论文,一起加油!
读博不易,但深夜总喜欢挤时间写上一篇文章,算是对自己这么多年分享的鼓励,也希望自己能坚持,感谢家人的支持,小珞珞太可爱了。如果您也是从事Python数据分析、图像处理、人工智能、网络安全的朋友,我们可以深入探讨,尤其是做研究的同学,共同进步~
前文分享(可以点击喔):
十六.Keras环境搭建、入门基础及回归神经网络案例
天行健,君子以自强不息。
地势坤,君子以厚德载物。
真诚地感谢您关注“娜璋之家”公众号,也希望我的文章能陪伴你成长,希望在技术路上不断前行。文章如果对你有帮助、有感悟,就是对我最好的回报,且看且珍惜!再次感谢您的关注,也请帮忙宣传下“娜璋之家”,初来乍到,还请多指教。
参考文献:
[1] 杨秀璋. Python网络数据爬取及分析从入门到精通(分析篇)[M]. 北京:北京航天航空大学出版社, 2018.
[2] https://morvanzhou.github.io/tutorials
[3]“莫烦大神” 网易云视频地址
[4] https://study.163.com/course/courseLearn.htm?courseId=1003209007
[5] Keras: The Python Deep Learning library
[6] Keras文本分类 - 基基伟大神
[7] https://github.com/eastmountyxz/AI-for-TensorFlow
[8]《机器学习》周志华
[9] https://github.com/eastmountyxz/AI-for-TensorFlow