TensorFlow与Keras:构建复杂模型教程

一、函数式api

tf.keras.Sequential 模型只适用于多层简单堆叠网络,不能表示复杂模型。
使用 Keras functional API 可以构建有复杂拓扑结构的模型。比如:

  • 多输入模型(Multi-input models)
  • 多输出模型(Multi-output models)
  • 有共享层的模型(同一层被调用多次)
  • 具有非顺序数据流的模型(如残差连接)


使用函数式API构建模型要求:

  1. 层实例可调用并返回张量。
  2. 输入张量和输出张量用于定义 tf.keras.Model 实例

示例:

登录后复制

from __future__ import absolute_import, division, print_functionimport tensorflow as tfimport numpy as 
npfrom tensorflow.keras import layerstrain_x = np.random.random((1000, 72))train_y = np
.random.random((1000, 10))val_x = np.random.random((200, 72))val_y = np.random.random((200, 10))
input_x = tf.keras.Input(shape=(72,))  # 实例化Keras张量hidden1 = layers.Dense(32, activation='relu')
(input_x)hidden2 = layers.Dense(16, activation='relu')(hidden1)pred = layers.Dense(10, 
activation='softmax')(hidden2)model = tf.keras.Model(inputs=input_x, 
outputs=pred)model.compile(optimizer=tf.keras.optimizers.Adam(0.001),              
loss=tf.keras.losses.categorical_crossentropy,              
metrics=['accuracy'])model.fit(train_x, train_y, batch_size=32, 
epochs=5)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.

TensorFlow2学习三、Keras 构建复杂模型_tensorflow


二、通过类更好地模块化自己的程序

登录后复制

from __future__ import absolute_import, division, print_functionimport tensorflow as tfimport numpy as 
npfrom tensorflow.keras import layersclass MyModel(tf.keras.Model):    def __init__(self, num_classes=10):
super(MyModel, self).__init__(name='my_model')        self.num_classes = num_classes        
self.layer1 = layers.Dense(32, activation='relu')        self.layer2 = layers.Dense(num_classes, 
activation='softmax')    def call(self, inputs):        h1 = self.layer1(inputs)        
out = self.layer2(h1)        return out    def compute_output_shape(self, input_shape):        
shape = tf.TensorShape(input_shape).as_list()        shape[-1] = self.num_classes        
return tf.TensorShape(shape)model = MyModel(num_classes=10)model.compile(optimizer=tf.keras.optimizers.
RMSprop(0.001),              loss=tf.keras.losses.categorical_crossentropy,              
metrics=['accuracy'])train_x = np.random.random((1000, 72))train_y = np.random.random((1000, 10))model
.fit(train_x, train_y, batch_size=16, epochs=5)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.
22.23.24.25.26.27.28.29.30.31.

TensorFlow2学习三、Keras 构建复杂模型_自定义_02


三、自定义层

通过对 tf.keras.layers.Layer 进行子类化并通过下面方法创建自定义层:

  • build:创建层的权重,add_weight 方法设置权重。
  • call:定义前向传播。
  • compute_output_shape:在给定输入形状的情况下如何计算层的输出形状。
    也可以通过实现 get_config 方法和 from_config 类方法序列化层。



  • 登录后复制
from __future__ import absolute_import, division, print_functionimport tensorflow as tfimport numpy as 
npimport tensorflow.keras as kerasfrom tensorflow.keras import layersclass 
MyLayer(keras.layers.Layer):    def __init__(self, output_dim, **kwargs):        
self.output_dim = output_dim        super(MyLayer, self).__init__(**kwargs)    
def build(self, input_shape):        shape = tf.TensorShape((input_shape[1], self.output_dim))        
# Create a trainable weight variable for this layer.        
self.kernel = self.add_weight(name='kernel',                                      
shape=shape,                                      initializer='uniform',                                      
trainable=True)        # Be sure to call this at the end        
super(MyLayer, self).build(input_shape)    def call(self, inputs):        
return tf.matmul(inputs, self.kernel)    def compute_output_shape(self, input_shape):        
shape = tf.TensorShape(input_shape).as_list()        shape[-1] = self.output_dim        
return tf.TensorShape(shape)    def get_config(self):        
base_config = super(MyLayer, self).get_config()        base_config['output_dim'] = self.output_dim        
return base_config    @classmethod    def from_config(cls, config):        
return cls(**config)# Create a model using the custom layermodel = keras.Sequential([MyLayer(10),
keras.layers.Activation('softmax')])# The compile step specifies the training configurationmodel.
compile(optimizer=tf.compat.v1.train.RMSPropOptimizer(0.001),              
loss='categorical_crossentropy',              
metrics=['accuracy'])train_x = np.random.random((1000, 72))train_y = np.random.random((1000, 10))
# Trains for 5 epochs.model.fit(train_x, train_y, batch_size=32, epochs=5)1.2.3.4.5.6.7.8.9.10.11.12.13.14.
15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.
51.52.53.54.

TensorFlow2学习三、Keras 构建复杂模型_函数式_03


四、回调

回调用于在训练期间自定义和扩展其行为。 可以编写自己的自定义回调或使用包含以下内置的tf.keras.callbacks:

  • tf.keras.callbacks.ModelCheckpoint:定期保存checkpoints。
  • tf.keras.callbacks.LearningRateScheduler:动态改变学习速率。
  • tf.keras.callbacks.EarlyStopping:当验证集上的性能不再提高时,终止训练。
  • tf.keras.callbacks.TensorBoard:使用TensorBoard 监测模型的行为。


使用回调是将其传递给模型的fit方法:

登录后复制

callbacks = [    # Interrupt training if `val_loss` stops improving for over 2 epochs    
keras.callbacks.EarlyStopping(patience=2, monitor='val_loss'),    
# Write TensorBoard logs to `./logs` directory    keras.callbacks.TensorBoard(log_dir='./logs')]1.2.3.4.5.6.


示例:

登录后复制

callbacks = [    tf.keras.callbacks.EarlyStopping(patience=2, monitor='val_loss'),    
tf.keras.callbacks.TensorBoard(log_dir='./logs')]model.fit(train_x, train_y, batch_size=16, epochs=5,         
callbacks=callbacks, validation_data=(val_x, val_y))1.2.3.4.5.6.




免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空