TensorFlow中Keras深度学习模型Sequential和Model详解

在Keras中有两种深度学习的模型:序列模型(Sequential)和通用模型(Model)。

差异在于不同的拓扑结构。

一. Sequential序列模型

序列模型各层之间是依次顺序的线性关系(多个网络层的线性堆叠),模型结构通过一个列表来制定,或者逐层添加网络结构。

1. 构造模型

通过将网络层实例的列表传递给 Sequential 的构造器,来创建一个 Sequential 模型。

# 导入类from keras.models
import Sequentialfrom keras.layers
import Dense, Activation

 

# 构建Sequential模型
# Model是keras最核心的数据结构
model = Sequential([
  Dense(32, input_shape=(784,)),
  Activation('relu'),
  Dense(10),
  Activation('softmax'),
])

也可以简单地使用 .add() 方法将各层添加到模型中

model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))

 

3. 指定输入数据的尺寸

指定输入数据的尺寸在第一层,模型需要知道它所期望的输入尺寸,在后面的层中,模型可以自动地推断尺寸。有三种方式指定输入数据的尺寸

1). 传递一个input_shape参数给第一层。它是一个表示尺寸的元组(一个由整数或None组成的元组,其中None表示可能为任何正整数)。在input_shape中不包含数据的batch大小。

2). 某些2D层,如Dense,支持通过参数input_dim指定输入尺寸;某些3D时序层支持input_dim和input_length参数。

3). 如果你需要为你的输入制定一个固定大小的batch(对stateful RNNs很有用),可以传递一个batch_size参数给一个层。如果你同时将batch_size=32和input_shape=(6,8)传递给一个层,那么每一批输入的尺寸就为(32,6,8)。

因此,如下代码是等价的:

1

model.add(Dense(32, input_shape=(784,))

1

model.add(Dense(32, input_dim=784))

2. 编译模型

在训练模型之前,通过 compile 方法配置学习过程,参数:

2.1. 优化器optimizer

1). 可以是现有优化器的字符串标识符(如rmspropadagrad),

2). 也可以是Optimizer类的示例,参见optimizers;下图中的类都可以直接用

字符串标识符代表了Keras预定义的优化器函数类,它们与具体的优化器函数实现相关联

有两种写法:

1) 只写字符串

model.compile(optimizer= 'adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

2)用对应类的构造函数

model.compile(optimizer= tf.keras.optimizers.Adam(),#'adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

 tf.keras.optimizers.Adam(), 调用了Adam类的构造函数,用的是默认参数值,参见 Adam 

2.2. 损失函数loss

模型试图最小化的目标函数。

1). 可以是现有损失函数的字符串标识符(如categorical_crossentropymse

2). 也可以是一个目标函数,见losses

字符串标识符代表了Keras预定义的损失函数类,它们与具体的损失函数实现相关联

2.3. 评估标准metrics

对于任何分类问题,都希望将其设置为metrics = ['accuracy']。可以是现有的字符串标识符,也可以是自定义的评估标准函数。

#分类问题
model.compile(
  optimizer='rmsprop',
  loss='categorical_crossentropy',
  metrics=['accuracy']
)

#二分类问题
model.compile(
  optimizer='rmsprop',
  loss='binary_crossentropy',
  metrics=['accuracy']
)

#均方误差回归问题
model.compile(
  optimizer='rmsprop',
  loss='mse'
)

#自定义评估标准函数
import keras.backend as K
def mean_pred(y_true,y_pred):
  return K.mean(y_pred)

model.compile(
  optimizer='rmsprop',
  loss='binary_crossentropy',
  metrics=['accuracy',mean_pred]
)

 更多metrics,参见 metrics

3. 训练模型

在输入数据和标签的Numpy矩阵上进行训练。为了训练这一个模型,通常会使用 fit 函数,参见 

  • x 和 y:分别代表输入数据和目标变量。
  • batch_size:每次更新使用的样本数。
  • epochs:整个数据集将被遍历的次数。
  • validation_split:验证集占训练集的比例,用于监控模型的性能并防止过拟合。

1

2

3

4

5

6

7

8

9

10

11

12

13

# 对于具有2个类的单输入模型(二进制分类)

model = Sequential()

model.add(Dense(32, activation='relu', input_dim=100))

model.add(Dense(1, activation='sigmoid'))

model.compile(optimizer='rmsprop',

             loss='binary_crossentropy',

             metrics=['accuracy'])

# 生成虚拟数据

import numpy as np

data = np.random.random((1000, 100))

labels = np.random.randint(2, size=(1000, 1))

# 训练模型,以32个样本为一个batch进行迭代

model.fit(data, labels, epochs=10, batch_size=32)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

Epoch 1/10

1000/1000 [==============================] - 0s 105us/step - loss: 0.7028 - accuracy: 0.4980

Epoch 2/10

1000/1000 [==============================] - 0s 32us/step - loss: 0.6932 - accuracy: 0.5380

Epoch 3/10

1000/1000 [==============================] - 0s 34us/step - loss: 0.6862 - accuracy: 0.5510

Epoch 4/10

1000/1000 [==============================] - 0s 34us/step - loss: 0.6842 - accuracy: 0.5580

Epoch 5/10

1000/1000 [==============================] - 0s 31us/step - loss: 0.6834 - accuracy: 0.5570

Epoch 6/10

1000/1000 [==============================] - 0s 34us/step - loss: 0.6799 - accuracy: 0.5720

Epoch 7/10

1000/1000 [==============================] - 0s 34us/step - loss: 0.6760 - accuracy: 0.5860

Epoch 8/10

1000/1000 [==============================] - 0s 37us/step - loss: 0.6742 - accuracy: 0.5920

Epoch 9/10

1000/1000 [==============================] - 0s 35us/step - loss: 0.6702 - accuracy: 0.5810

Epoch 10/10

1000/1000 [==============================] - 0s 36us/step - loss: 0.6686 - accuracy: 0.6050

<keras.callbacks.callbacks.History at 0x1e1c574b888>

二. Model通用模型

通用模型可以设计非常复杂、任意拓扑结构的神经网络,例如有向无环网络、共享层网络等。

相比于序列模型只能依次线性逐层添加,通用模型能够比较灵活地构造网络结构,设定各层级的关系。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

from keras.layers import Input, Dense

from keras.models import Model

# 定义输入层,确定输入维度

input = input(shape = (784, ))

# 2个隐含层,每个都有64个神经元,使用relu激活函数,且由上一层作为参数

x = Dense(64, activation='relu')(input)

x = Dense(64, activation='relu')(x)

# 输出层

y = Dense(10, activation='softmax')(x)

# 定义模型,指定输入输出

model = Model(input=input, output=y)

# 编译模型,指定优化器,损失函数,度量

model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

# 模型拟合,即训练

model.fit(data, labels)

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据引用\[1\]提供的信息,目前测试成功环境包的版本包含了tensorflow-gpu=1.13.2和keras2.1.5。而根据引用\[2\]的代码,你尝试加载了一个名为'rygh_logistic_save.h5'的模型,并使用tensorflow.keras.models.load_model函数进行加载。然而,根据引用\[3\]的信息,你提到你当前使用的tensorflow版本为2.0,并且使用了tensorflow.keras。这可能导致了报错。 根据你的问题,你想要安装keras2.10.0并从tensorflow.keras.models导入Sequential。然而,根据提供的引用内容,没有提到安装keras2.10.0的信息。因此,我无法提供关于安装keras2.10.0的具体步骤。 然而,你可以尝试以下解决方法: 1. 确保你已经正确安装了tensorflowkeras。可以使用pip install tensorflow和pip install keras命令来安装它们。 2. 确认你的tensorflow版本是否与keras兼容。如果你使用的是tensorflow 2.x版本,可以尝试使用tensorflow.keras.models.Sequential来代替tensorflow.keras.modelsSequential。 3. 检查你的代码是否存在其他错误或拼写错误。 希望这些解决方法能够帮助你解决问题。如果问题仍然存在,请提供更多的信息,以便我能够更好地帮助你。 #### 引用[.reference_title] - *1* [kerastensorflow安装详解-神经网络第一个脚本](https://blog.csdn.net/yi247630676/article/details/123404817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [tensorflow2.1.0加载模型keras.models.load_model()没反应,原因可能是你的tf不支持版本过高的h5py](https://blog.csdn.net/a_cherry_blossoms/article/details/113951126)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [tensorflow.keras图像分类及django部署总结](https://blog.csdn.net/m0_51402187/article/details/113919947)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青瓷看世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值