3、Keras中的顺序模型Sequential和函数式模型Model
文章目录
- 使用函数式模型构建复杂网络
- 1、加宽网络(输入、输出不变)
- 1.1、完整代码:
- 2、多个输入层
- 2.2、完整代码
- 3、多个输出层
- 3.3 完整代码
使用函数式模型构建复杂网络
前面两节分别讲述了:基本分类模型和回归模型 ,但是这两种都是基于Keras中的顺序模型进行构建的,即神经网络只有一个输入和一个输出;如下图所示:
而Keras中模型的构建方式分为两种:
- 顺序模型(Sequential)
- 函数式模型(Model)
相比顺序模型,函数式模型可以构建更加深层、更加宽度的网络,其在大量数据基础上,可以有更强的拟合能力。
1、加宽网络(输入、输出不变)
在不改变数据的基础上,加宽网络的宽度!直接修改上一节中的网络结构,新的网络结构如下:
input = keras.layers.Input(shape=x_train_all.shape[1:]) # 定义输入层(指定输入数据的维度)
dense_1 = keras.layers.Dense(30, activation="relu")(input) # 全连接1
dense_2 = keras.layers.Dense(30, activation="relu")(dense_1) # 全连接2
concat_layer = keras.layers.Concatenate()([input, dense_2]) # 将输入层 和 全连接2 拼接
dense_3 = keras.layers.Dense(30, activation="relu")(concat_layer) # 全连接3
output = keras.layers.Dense(1)(dense_3) # 输出层
model = keras.Model(inputs = [input], outputs = [output]) # 创建函数式Model,指定输入层和输出层
左图为上一节中的顺序式模型,右图为函数式模型。两种神经网络最终效果不同,网络更宽的模型效果更好!
1.1、完整代码:
# 导入相关工具库
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import keras# 加载数据集
housing_data = fetch_california_housing()# 划分训练集和测试集
x_train_all, x_test_all, y_train_all , y_test_all = train_test_split(housing_data["data"], housing_data["target"])# 数据处理(标准化)
scaler = StandardScaler()
x_train_all = scaler.fit_transform(x_train_all)
x_test_all = scaler.transform(x_test_all)# 构建模型
input = keras.layers.Input(shape=x_train_all.shape[1:])
dense_1 = keras.layers.Dense(30, activation="relu")(input)
dense_2 = keras.layers.Dense(30, activation="relu")(dense_1)
concat_layer = keras.layers.Concatenate()([input, dense_2])
dense_3 = keras.layers.Dense(30, activation="relu")(concat_layer)
output = keras.layers.Dense(1)(dense_3)
model = keras.Model(inputs = [input], outputs = [output])# 打印模型结构信息
model.summary()# 模型编译
model.compile(optimizer=keras.optimizers.SGD(), loss=keras.losses.mean_squared_error)# 模型训练
history = model.fit(x_train_all, y_train_all, epochs= 50, validation_split=0.1)# 在测试集上评估
loss = model.evaluate(x_test_all, y_test_all) # 返回测试集的loss
print(loss)
2、多个输入层
和上述改变网络中宽度不同,有时也想改变数据,例如,数据集中一部分特征直接输入网络深层;一部分特征数据依旧一步一步传递下去:如下图所示:
上述中,输入层1、输入层2中的特征划分需要依据数据类型以及实际场景!两个输入层的数据可以重叠也不可以不重叠!
具体网络结构如下所示:
input_1 = keras.layers.Input(shape=[5]) # 特征 0-5 # 总特征有8维,取前4维特征数据
input_2 = keras.layers.Input(shape=[6]) # 特征 2-7 # 总特征有8维,取第2-7维特征数据
dense_1 = keras.layers.Dense(30, activation="relu")(input_2) # 全连接1
dense_2 = keras.layers.Dense(30, activation="relu")(dense_1) # 全连接2
concat_layer = keras.layers.Concatenate()([input_1, dense_2]) # 输入层1 和 全连接2 拼接
dense_3 = keras.layers.Dense(30, activation="relu")(concat_layer) # 全连接3
output = keras.layers.Dense(1)(dense_3) # 输出层
model = keras.Model(inputs = [input_1, input_2], outputs = [output]) # 创建函数式Model,注意输入层有两个!
由于输入层有两个,因此,后期训练、预测时都要指定两个输入层!
2.2、完整代码
# 导入相关工具库
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import keras# 加载数据集
housing_data = fetch_california_housing()# 划分训练集和测试集
x_train_all, x_test_all, y_train_all , y_test_all = train_test_split(housing_data["data"], housing_data["target"])# 数据处理(标准化)
scaler = StandardScaler()
x_train_all = scaler.fit_transform(x_train_all)
x_test_all = scaler.transform(x_test_all)# 构建模型
input_1 = keras.layers.Input(shape=[5]) # 特征 0-4 # 总特征有8维,取前4维特征数据
input_2 = keras.layers.Input(shape=[6]) # 特征 2-7 # 总特征有8维,取第2-7维特征数据
dense_1 = keras.layers.Dense(30, activation="relu")(input_2)
dense_2 = keras.layers.Dense(30, activation="relu")(dense_1)
concat_layer = keras.layers.Concatenate()([input_1, dense_2])
dense_3 = keras.layers.Dense(30, activation="relu")(concat_layer)
output = keras.layers.Dense(1)(dense_3)
model = keras.Model(inputs = [input_1, input_2], outputs = [output])# 打印模型结构信息
model.summary()# 模型编译
model.compile(optimizer=keras.optimizers.SGD(), loss=keras.losses.mean_squared_error)# 将训练集划分子集
x_train_1, x_train_2 = x_train_all[:, :5], x_train_all[:, 2:]
x_test_1, x_test_2 = x_test_all[:, :5], x_test_all[:, 2:]# 模型训练
history = model.fit([x_train_1, x_train_2], y_train_all, epochs= 50, validation_split=0.1)# 在测试集上评估
loss = model.evaluate([x_test_1, x_test_2], y_test_all) # 返回测试集的loss
print(loss)
3、多个输出层
有些任务不仅仅是分类或回归,而是多任务结合的,例如目标检测任务,不仅要在图片中识别出目标(分类)还要给出目标位置、宽高等信息(回归),因此,需要模型多个输出!并且多任务模型训练,有时可以增加模型整体的鲁棒性
对上面的代码继续修改,得到多输出的神经网络模型,图下图所示:
input_1 = keras.layers.Input(shape=[5]) # 特征 0-4 # 总特征有8维,取前4维特征数据
input_2 = keras.layers.Input(shape=[6]) # 特征 2-7 # 总特征有8维,取第2-7维特征数据
dense_1 = keras.layers.Dense(30, activation="relu")(input_2)
dense_2 = keras.layers.Dense(30, activation="relu")(dense_1)
concat_layer = keras.layers.Concatenate()([input_1, dense_2])
dense_3 = keras.layers.Dense(30, activation="relu")(concat_layer)
output1 = keras.layers.Dense(1)(dense_3)
output2 = keras.layers.Dense(1)(dense_2)
model = keras.Model(inputs = [input_1, input_2], outputs = [output1, output2]) # 多输入,多输出
3.3 完整代码
# 导入相关工具库
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import keras# 加载数据集
housing_data = fetch_california_housing()# 划分训练集和测试集
x_train_all, x_test_all, y_train_all , y_test_all = train_test_split(housing_data["data"], housing_data["target"])# 数据处理(标准化)
scaler = StandardScaler()
x_train_all = scaler.fit_transform(x_train_all)
x_test_all = scaler.transform(x_test_all)# 构建模型
input_1 = keras.layers.Input(shape=[5]) # 特征 0-4 # 总特征有8维,取前4维特征数据
input_2 = keras.layers.Input(shape=[6]) # 特征 2-7 # 总特征有8维,取第2-7维特征数据
dense_1 = keras.layers.Dense(30, activation="relu")(input_2)
dense_2 = keras.layers.Dense(30, activation="relu")(dense_1)
concat_layer = keras.layers.Concatenate()([input_1, dense_2])
dense_3 = keras.layers.Dense(30, activation="relu")(concat_layer)
output1 = keras.layers.Dense(1)(dense_3)
output2 = keras.layers.Dense(1)(dense_2)
model = keras.Model(inputs = [input_1, input_2], outputs = [output1, output2])# 打印模型结构信息
model.summary()# 模型编译
model.compile(optimizer=keras.optimizers.SGD(), loss=keras.losses.mean_squared_error)# 划分特征子集
x_train_1, x_train_2 = x_train_all[:, :5], x_train_all[:, 2:]
x_test_1, x_test_2 = x_test_all[:, :5], x_test_all[:, 2:]# 模型训练
history = model.fit([x_train_1, x_train_2], [y_train_all, y_train_all], epochs= 50, validation_split=0.1)# 在测试集上评估,返回总loss、每个输出的loss
sum_loss, output1_loss, output2_loss = model.evaluate([x_test_1, x_test_2], [y_test_all, y_test_all]) # 返回测试集的loss
print(sum_loss, output1_loss, output2_loss)
注意: 由于是多输出,那么每个输出的损失函数都是可以定义的,上述在模型编译时,仅仅指定了loss=keras.losses.mean_squared_error,那么两个输出的损失函数都是均方误差!也可以分开定义。如下;
指定每个输出的损失函数:loss=[“sgd”, “sgd”]
model.compile(optimizer=keras.optimizers.SGD(), loss=["sgd", "sgd"])
指定每个loss的权重,给与某分支较大的决策权:loss_weights=[0.7,0.3]
model.compile(optimizer=keras.optimizers.SGD(), loss=["sgd", "sgd"], loss_weights=[0.7,0.3])
3、Keras中的顺序模型Sequential和函数式模型Model相关推荐
- [转载] 使用Keras和TensorFlow 2.0建立深度学习模型对图像进行分类
参考链接: Keras中的深度学习-建立深度学习模型 在本文中,我们将构建一个深度学习模型来对图像中的对象进行分类.为了构建卷积神经网络,我们将使用Kaggle提供的这个数据集.(https://ww ...
- Keras中Sequential模型及方法详细总结
Sequential 序贯模型 序贯模型是函数式模型的简略版,为最简单的线性.从头到尾的结构顺序,不分叉,是多个网络层的线性堆叠. Keras实现了很多层,包括core核心层,Convolution卷 ...
- 理解keras中的sequential模型
keras中的主要数据结构是model(模型),它提供定义完整计算图的方法.通过将图层添加到现有模型/计算图,我们可以构建出复杂的神经网络. Keras有两种不同的构建模型的方法: Sequentia ...
- Keras中的两种模型:Sequential和Model
在Keras中有两种深度学习的模型:序列模型(Sequential)和通用模型(Model).差异在于不同的拓扑结构. 序列模型 Sequential 序列模型各层之间是依次顺序的线性关系,模型结构通 ...
- Python机器学习笔记:深入理解Keras中序贯模型和函数模型
先从sklearn说起吧,如果学习了sklearn的话,那么学习Keras相对来说比较容易.为什么这样说呢? 我们首先比较一下sklearn的机器学习大致使用流程和Keras的大致使用流程: skl ...
- java55矩阵output_将矩阵乘积输入到keras中的两个模型的输出
具体来说,现在我想对两个CNN模型的两个输出矩阵做外积,并且我完成了矩阵的转置,现在我只想在 keras 中加倍两个矩阵,其大小为(None,512,49)和(无,49,512) . 我尝试在kera ...
- 浅谈深度学习:LSTM对股票的收益进行预测(Sequential 序贯模型,Keras实现)
浅谈深度学习:LSTM对股票的收益进行预测(Sequential 序贯模型,Keras实现) 总包含文章: 一个完整的机器学习模型的流程 浅谈深度学习:了解RNN和构建并预测 浅谈深度学习:基于对LS ...
- Keras中保存和加载权重及模型结构
微信公众号 1. 保存和加载模型结构 (1)保存为JSON字串 json_string = model.to_json() (2)从JSON字串重构模型 from keras.models impor ...
- Keras中的各种Callback函数示例(含Checkpoint模型的保存、读取示例)-----记录
本文整理了绝大多数keras里的Callback回调)函数,并且收集了代码调用示例. 大多数内容整理自网络,参考资料已在文章最后给出. 回调函数Callbacks 回调函数是一组在训练的特定阶段被调用 ...
- keras中的模型保存和加载
tensorflow中的模型常常是protobuf格式,这种格式既可以是二进制也可以是文本.keras模型保存和加载与tensorflow不同,keras中的模型保存和加载往往是保存成hdf5格式. ...
最新文章
- 我记录网站综合系统 -- 技术原理解析[10:PermissionChecker流程]
- C# string.Empty
- 用C#使用HttpWebRequest Post数据时如何保持Session
- WZJ的数据结构(零)KMP
- 服务器空岛怎么修改地形,迷你世界空岛地形码是什么 空岛地形码怎么输入[多图]...
- LiveQing视频流媒体开放平台利用 webpack 打包压缩后端代码
- Shiro框架:授权流程、授权方式、Shiro授权入门程序、自定义Realm进行授权
- Wireshark 抓包分析 RTSP/RTP/RTCP 基本工作过程
- C++中图像处理的类之二 CImg
- 电影:『新警察故事』
- Oracle存储过程基本语法介绍
- 使用SQLite3支持中文路径
- JS取得RadioButtonList的Value,Text及选中值等信息
- 需要压缩NTFS盘的情况有哪些?
- ug区域轮廓铣没有重叠距离_UG编程轮廓铣的切削参数“清理几何体”,360°无死角扫除!...
- 40年开店近4万家,麦当劳老大地位恐不保!看看人家这心机!
- 怎么压缩pdf文件大小?
- spidev0.0的正确打开方式
- python pandas数据清洗:sample()函数
- android listview 点击获取焦点,android – ListView项目焦点行为
热门文章
- API网关的几点思考
- Julia : csv =hdf5
- 节约服务器成本50%以上,独角兽完美日记电商系统容器化改造历程
- 浙江大学公共管理学院与阿里云计算有限公司达成合作 | 凌云时刻
- 降低大数据分析门槛,HashData打造云端数据仓库
- 【数字信号去噪】基于matlab小波软阈值+硬阈值+改进阈值轴承故障仿真信号去噪【含Matlab源码 1024期】
- 【图像修复】基于matlab全变分TV+curvelet变换彩色图像修复【含Matlab源码 461期】
- «构建并破坏它»:某些算法如何生成验证码,而另一些则如何破解
- 强化学习推荐系统_推荐人系统:价值调整,强化学习和道德规范
- pip离线下载安装依赖包,及github包,及常用pip源