(重要) tensorflow 2.0 functional API

本文详细介绍了如何使用 Keras 的功能性 API 来构建深度学习模型,包括创建输入节点、定义层、搭建模型、保存与加载模型、复用结构和参数、构建多输入多输出模型以及共享层。同时,讨论了自定义层与重用层的区别,并提供了实例展示。此外,还提到了如何提取和利用模型中间层的计算结果。
摘要由CSDN通过智能技术生成

https://tensorflow.google.cn/guide/keras/functional?hl=zh_cn

1. 使用 functional API 流程

1. 创建输入节点

img_inputs = keras.Input(shape=(32, 32, 3))

数据的形状设置为 784 维向量。由于仅指定了每个样本的形状,因此始终忽略批次大小(batch size)。

2. 创建层

x = layers.Dense(64, activation="relu")(inputs)
x = layers.Dense(64, activation="relu")(x)
outputs = layers.Dense(10)(x)

3. 创建model

model = keras.Model(inputs=inputs, outputs=outputs, name="mnist_model")

4. 查看模型

model.summary()
keras.utils.plot_model(model, "my_first_model.png") ## 网络图
keras.utils.plot_model(model, "my_first_model_with_shape_info.png", show_shapes=True)

5. 保存模型

model.save会把,网络和weight,参数配置,优化器状态一起保存。

model.save("path_to_my_model")
del model
# Recreate the exact same model purely from the file:
model = keras.models.load_model("path_to_my_model")

2 复用结构和参数

使用keras.Model创建模块即可,这个模块即可用来训练也可以当做子模块。

2.1 结构和参数都共享

encoder_input = keras.Input(shape=(28, 28, 1), name="original_img")
x = layers.Conv2D(16, 3, activation="relu")(encoder_input)
x = layers.Conv2D(32, 3, activation="relu")(x)
x = layers.MaxPooling2D(3)(x)
x = layers.Conv2D(32, 3, activation="relu")(x)
x = layers.Conv2D(16, 3, activation="relu")(x)
encoder_output = layers.GlobalMaxPooling2D()(x)

encoder = keras.Model(encoder_input, encoder_output, name="encoder")
encoder.summary()

decoder_input = keras.Input(shape=(16,), name="encoded_img")
x = layers.Reshape((4, 4, 1))(decoder_input)
x = layers.Conv2DTranspose(16, 3, activation="relu")(x)
x = layers.Conv2DTranspose(32, 3, activation="relu")(x)
x = layers.UpSampling2D(3)(x)
x = layers.Conv2DTranspose(16, 3, activation="relu")(x)
decoder_output = layers.Conv2DTranspose(1, 3, activation="relu")(x)

decoder = keras.Model(decoder_input, decoder_output, name="decoder")
decoder.summary()

autoencoder_input = keras.Input(shape=(28, 28, 1), name="img")
encoded_img = encoder(autoencoder_input)
decoded_img = decoder(encoded_img)
autoencoder = keras.Model(autoencoder_input, decoded_img, name="autoencoder")
autoencoder.summary()

2.2 结构共享,参数不共享

如果像下面这种,那么网络参数就是不共享的,因为都重新创建一个keras.Model对象。

def get_model():
    inputs = keras.Input(shape=(128,))
    outputs = layers.Dense(1)(inputs)
    return keras.Model(inputs, outputs)


model1 = get_model()
model2 = get_model()
model3 = get_model()

inputs = keras.Input(shape=(128,))
y1 = model1(inputs)
y2 = model2(inputs)
y3 = model3(inputs)
outputs = layers.average([y1, y2, y3])
ensemble_model = keras.Model(inputs=inputs, outputs=outputs)

3. 构建多输入多输出

这样构建即可:

model = keras.Model(
    inputs=[title_input, body_input, tags_input],
    outputs=[priority_pred, department_pred],
)

4 共享embedding

# Embedding for 1000 unique words mapped to 128-dimensional vectors
shared_embedding = layers.Embedding(1000, 128)

# Variable-length sequence of integers
text_input_a = keras.Input(shape=(None,), dtype="int32")

# Variable-length sequence of integers
text_input_b = keras.Input(shape=(None,), dtype="int32")

# Reuse the same layer to encode both inputs
encoded_input_a = shared_embedding(text_input_a)
encoded_input_b = shared_embedding(text_input_b)

5 提取和重用层计算图中的节点

## 下面是一个 VGG19 模型,其权重已在 ImageNet 上进行了预训练:
vgg19 = tf.keras.applications.VGG19()
##通过查询计算图数据结构获得的模型的中间激活:
features_list = [layer.output for layer in vgg19.layers]
## 使用以下特征来创建新的特征提取模型,该模型会返回中间层激活的值:
feat_extraction_model = keras.Model(inputs=vgg19.input, outputs=features_list)

img = np.random.random((1, 224, 224, 3)).astype("float32")
extracted_features = feat_extraction_model(img)

6 自定义layer和重用layer的区别

  • 自定义layer通常是没有算子的情况下需要做

  • 而重用layer只需要定义keras.Model的对象即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值