文章目录

  • 使用函数式模型构建复杂网络
    • 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相关推荐

  1. [转载] 使用Keras和TensorFlow 2.0建立深度学习模型对图像进行分类

    参考链接: Keras中的深度学习-建立深度学习模型 在本文中,我们将构建一个深度学习模型来对图像中的对象进行分类.为了构建卷积神经网络,我们将使用Kaggle提供的这个数据集.(https://ww ...

  2. Keras中Sequential模型及方法详细总结

    Sequential 序贯模型 序贯模型是函数式模型的简略版,为最简单的线性.从头到尾的结构顺序,不分叉,是多个网络层的线性堆叠. Keras实现了很多层,包括core核心层,Convolution卷 ...

  3. 理解keras中的sequential模型

    keras中的主要数据结构是model(模型),它提供定义完整计算图的方法.通过将图层添加到现有模型/计算图,我们可以构建出复杂的神经网络. Keras有两种不同的构建模型的方法: Sequentia ...

  4. Keras中的两种模型:Sequential和Model

    在Keras中有两种深度学习的模型:序列模型(Sequential)和通用模型(Model).差异在于不同的拓扑结构. 序列模型 Sequential 序列模型各层之间是依次顺序的线性关系,模型结构通 ...

  5. Python机器学习笔记:深入理解Keras中序贯模型和函数模型

     先从sklearn说起吧,如果学习了sklearn的话,那么学习Keras相对来说比较容易.为什么这样说呢? 我们首先比较一下sklearn的机器学习大致使用流程和Keras的大致使用流程: skl ...

  6. java55矩阵output_将矩阵乘积输入到keras中的两个模型的输出

    具体来说,现在我想对两个CNN模型的两个输出矩阵做外积,并且我完成了矩阵的转置,现在我只想在 keras 中加倍两个矩阵,其大小为(None,512,49)和(无,49,512) . 我尝试在kera ...

  7. 浅谈深度学习:LSTM对股票的收益进行预测(Sequential 序贯模型,Keras实现)

    浅谈深度学习:LSTM对股票的收益进行预测(Sequential 序贯模型,Keras实现) 总包含文章: 一个完整的机器学习模型的流程 浅谈深度学习:了解RNN和构建并预测 浅谈深度学习:基于对LS ...

  8. Keras中保存和加载权重及模型结构

    微信公众号 1. 保存和加载模型结构 (1)保存为JSON字串 json_string = model.to_json() (2)从JSON字串重构模型 from keras.models impor ...

  9. Keras中的各种Callback函数示例(含Checkpoint模型的保存、读取示例)-----记录

    本文整理了绝大多数keras里的Callback回调)函数,并且收集了代码调用示例. 大多数内容整理自网络,参考资料已在文章最后给出. 回调函数Callbacks 回调函数是一组在训练的特定阶段被调用 ...

  10. keras中的模型保存和加载

    tensorflow中的模型常常是protobuf格式,这种格式既可以是二进制也可以是文本.keras模型保存和加载与tensorflow不同,keras中的模型保存和加载往往是保存成hdf5格式. ...

最新文章

  1. 我记录网站综合系统 -- 技术原理解析[10:PermissionChecker流程]
  2. C# string.Empty
  3. 用C#使用HttpWebRequest Post数据时如何保持Session
  4. WZJ的数据结构(零)KMP
  5. 服务器空岛怎么修改地形,迷你世界空岛地形码是什么 空岛地形码怎么输入[多图]...
  6. LiveQing视频流媒体开放平台利用 webpack 打包压缩后端代码
  7. Shiro框架:授权流程、授权方式、Shiro授权入门程序、自定义Realm进行授权
  8. Wireshark 抓包分析 RTSP/RTP/RTCP 基本工作过程
  9. C++中图像处理的类之二 CImg
  10. 电影:『新警察故事』
  11. Oracle存储过程基本语法介绍
  12. 使用SQLite3支持中文路径
  13. JS取得RadioButtonList的Value,Text及选中值等信息
  14. 需要压缩NTFS盘的情况有哪些?
  15. ug区域轮廓铣没有重叠距离_UG编程轮廓铣的切削参数“清理几何体”,360°无死角扫除!...
  16. 40年开店近4万家,麦当劳老大地位恐不保!看看人家这心机!
  17. 怎么压缩pdf文件大小?
  18. spidev0.0的正确打开方式
  19. python pandas数据清洗:sample()函数
  20. android listview 点击获取焦点,android – ListView项目焦点行为

热门文章

  1. API网关的几点思考
  2. Julia : csv =hdf5
  3. 节约服务器成本50%以上,独角兽完美日记电商系统容器化改造历程
  4. 浙江大学公共管理学院与阿里云计算有限公司达成合作 | 凌云时刻
  5. 降低大数据分析门槛,HashData打造云端数据仓库
  6. 【数字信号去噪】基于matlab小波软阈值+硬阈值+改进阈值轴承故障仿真信号去噪【含Matlab源码 1024期】
  7. 【图像修复】基于matlab全变分TV+curvelet变换彩色图像修复【含Matlab源码 461期】
  8. «构建并破坏它»:某些算法如何生成验证码,而另一些则如何破解
  9. 强化学习推荐系统_推荐人系统:价值调整,强化学习和道德规范
  10. pip离线下载安装依赖包,及github包,及常用pip源