TensorFlow 中定义模型和层

TensorRT 4 基本介绍及TensorFlow模型转化Uff格式导入(二) 原创作品,转载时请务必以超链接形式标明文章原始出处: http://www.dapalm.com/?p=143,作者:大数据,怕了么? 从TensorRT1到TensorRT4一路跟过来,现在支持也越来越完善,NVIDIA的尿性就是不开源,坑不少,作为一个Inference库,确实为部署网络带来方便。下面从下面几个方面梳理总结一下: 多种模型导入 支持层 自定义层 UFF格式及转换 ... 阅读详情

在 TensorFlow 中定义模型和层

大多数模型都由层组成。层是具有已知数学结构的函数,可以重复使用并具有可训练的变量。在 TensorFlow 中,层和模型的大多数高级实现(例如 Keras 或 Sonnet)都在以下同一个基础类上构建:tf.Module。

下面是一个在标量张量上运行的非常简单的 tf.Module 示例:

继承 tf.Mode

class SimpleModule(tf.Module):
  def __init__(self, name=None):
    super().__init__(name=name)
    self.a_variable = tf.Variable(5.0, name="train_me")
    self.non_trainable_variable = tf.Variable(5.0, trainable=False, name="do_not_train_me")
  def __call__(self, x):
    return self.a_variable * x + self.non_trainable_variable

simple_module = SimpleModule(name="simple")

simple_module(tf.constant(5.0))

<tf.Tensor: shape=(), dtype=float32, numpy=30.0>

模块和引申而来的层是“对象”的深度学习术语:它们具有内部状态以及使用该状态的方法。

__call__ 并无特殊之处,只是其行为与 Python 可调用对象类似;您可以使用任何函数来调用模型。

您可以出于任何原因开启和关闭变量的可训练性,包括在微调过程中冻结层和变量。

注:tf.Module 是 tf.keras.layers.Layer 和 tf.keras.Model 的基类,因此您在此处看到的一切内容也适用于 Keras。出于历史兼容性原因,Keras 层不会从模块收集变量,因此您的模型应仅使用模块或仅使用 Keras 层。不过,下面给出的用于检查变量的方法在这两种情况下相同。

通过将 tf.Module 子类化,将自动收集分配给该对象属性的任何 tf.Variable 或 tf.Module 实例。这样,您可以保存和加载变量,还可以创建 tf.Module 的集合。

下面是一个由模块组成的两层线性层模型的示例。

首先是一个密集(线性)层:

class Dense(tf.Module):
    """自定义全连接层(含ReLU激活)
    
    参数:
        in_features (int): 输入特征维度
        out_features (int): 输出特征维度
        name (str, optional): 层的名称(用于变量命名空间)
    """
    
    def __init__(self, in_features, out_features, name=None):
        super().__init__(name=name)  # 初始化父类tf.Module,启用变量自动跟踪
        
        # 初始化权重矩阵 w: [输入维度, 输出维度]
        # 使用正态分布初始化(默认均值0,标准差1)
        self.w = tf.Variable(
            tf.random.normal([in_features, out_features]), 
            name='w'  # 变量命名为"w"(在TensorBoard中可识别)
        )
        
        # 初始化偏置向量 b: [输出维度]
        # 初始化为全零向量
        self.b = tf.Variable(
            tf.zeros([out_features]), 
            name='b'  # 变量命名为"b"
        )

    def __call__(self, x):
        """前向传播计算
        
        参数:
            x (tf.Tensor): 输入张量,形状为 [batch_size, in_features]
            
        返回:
            tf.Tensor: 输出张量,形状为 [batch_size, out_features]
        """
        # 线性变换:y = x * w + b
        # x形状: [batch_size, in_features]
        # w形状: [in_features, out_features]
        # 结果形状: [batch_size, out_features]
        linear_output = tf.matmul(x, self.w) + self.b
        
        # 应用ReLU激活函数(将负值置零)
        # 输出形状保持 [batch_size, out_features]
        return tf.nn.relu(linear_output)  

随后是完整的模型,此模型将创建并应用两个层实例:

class SequentialModule(tf.Module):
  def __init__(self, name=None):
    super().__init__(name=name)

    self.dense_1 = Dense(in_features=3, out_features=3)
    self.dense_2 = Dense(in_features=3, out_features=2)

  def __call__(self, x):
    x = self.dense_1(x)
    return self.dense_2(x)

# You have made a model!
my_model = SequentialModule(name="the_model")

# Call it, with random results
print("Model results:", my_model(tf.constant([[2.0, 2.0, 2.0]])))

Model results: tf.Tensor([[0. 0.]], shape=(1, 2), dtype=float32)

tf.Module 实例将以递归方式自动收集分配给它的任何 tf.Variable 或 tf.Module 实例。这样,您可以使用单个模型实例管理 tf.Module 的集合,并保存和加载整个模型。

print("Submodules:", my_model.submodules)

Submodules: (<__main__.Dense object at 0x7f109408f2e0>, <__main__.Dense object at 0x7f109408f4f0>)

for var in my_model.variables:
  print(var, "\n")

<tf.Variable 'b:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)> 

<tf.Variable 'w:0' shape=(3, 3) dtype=float32, numpy=
array([[-0.6486379 , -2.6884317 , -0.7326858 ],
       [-1.042379  ,  0.43803984,  1.4473952 ],
       [-0.69696647, -1.1517488 , -0.53745973]], dtype=float32)> 

<tf.Variable 'b:0' shape=(2,) dtype=float32, numpy=array([0., 0.], dtype=float32)> 

<tf.Variable 'w:0' shape=(3, 2) dtype=float32, numpy=
array([[-1.2524092 , -0.15825313],
       [ 0.411222  ,  2.0279562 ],
       [-0.9263187 , -0.8771923 ]], dtype=float32)>

等待创建变量

您在这里可能已经注意到,必须定义层的输入和输出大小。这样,w 变量才会具有已知的形状并且可被分配。

通过将变量创建推迟到第一次使用特定输入形状调用模块时,您将无需预先指定输入大小。

class FlexibleDenseModule(tf.Module):
  # Note: No need for `in_features`
  def __init__(self, out_features, name=None):
    super().__init__(name=name)
    self.is_built = False
    self.out_features = out_features

  def __call__(self, x):
    # Create variables on first call.
    if not self.is_built:
      self.w = tf.Variable(
        tf.random.normal([x.shape[-1], self.out_features]), name='w')
      self.b = tf.Variable(tf.zeros([self.out_features]), name='b')
      self.is_built = True

    y = tf.matmul(x, self.w) + self.b
    return tf.nn.relu(y)

# Used in a module
class MySequentialModule(tf.Module):
  def __init__(self, name=None):
    super().__init__(name=name)

    self.dense_1 = FlexibleDenseModule(out_features=3)
    self.dense_2 = FlexibleDenseModule(out_features=2)

  def __call__(self, x):
    x = self.dense_1(x)
    return self.dense_2(x)

my_model = MySequentialModule(name="the_model")
print("Model results:", my_model(tf.constant([[2.0, 2.0, 2.0]])))

Model results: tf.Tensor([[0. 0.]], shape=(1, 2), dtype=float32)

这种灵活性是 TensorFlow 层通常仅需要指定其输出的形状(例如在 tf.keras.layers.Dense 中),而无需指定输入和输出大小的原因。

保存权重

您可以将 tf.Module 保存为检查点和 SavedModel。

检查点即是权重(即模块及其子模块内部的变量集的值)。

chkp_path = "my_checkpoint"
checkpoint = tf.train.Checkpoint(model=my_model)
checkpoint.write(chkp_path)

'my_checkpoint'

检查点由两种文件组成---数据本身以及元数据的索引文件。索引文件跟踪实际保存的内容和检查点的编号,而检查点数据包含变量值及其特性查找路径。

ls my_checkpoint*

my_checkpoint.data-00000-of-00001  my_checkpoint.index

您可以查看检查点内部,以确保整个变量集合已由包含这些变量的 Python 对象保存并排序。

tf.train.list_variables(chkp_path)
[('_CHECKPOINTABLE_OBJECT_GRAPH', []),
 ('model/dense_1/b/.ATTRIBUTES/VARIABLE_VALUE', [3]),
 ('model/dense_1/w/.ATTRIBUTES/VARIABLE_VALUE', [3, 3]),
 ('model/dense_2/b/.ATTRIBUTES/VARIABLE_VALUE', [2]),
 ('model/dense_2/w/.ATTRIBUTES/VARIABLE_VALUE', [3, 2])]

在分布式(多机)训练期间,可以将它们分片,这就是要对它们进行编号(例如 '00000-of-00001')的原因。不过,在本例中,只有一个分片。

重新加载模型时,将重写 Python 对象中的值。

new_model = MySequentialModule()
new_checkpoint = tf.train.Checkpoint(model=new_model)
new_checkpoint.restore("my_checkpoint")

# Should be the same result as above
new_model(tf.constant([[2.0, 2.0, 2.0]]))
<tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[0., 0.]], dtype=float32)>

注:由于检查点处于长时间训练工作流的核心位置,因此 tf.checkpoint.CheckpointManager 是一个可使检查点管理变得更简单的辅助类。有关更多详细信息,请参阅指南。

保存函数

TensorFlow 可以在不使用原始 Python 对象的情况下运行模型,如 TensorFlow Serving 和 TensorFlow Lite 所示,甚至当您从 TensorFlow Hub 下载经过训练的模型时也是如此。

TensorFlow 需要了解如何执行 Python 中描述的计算,但不需要原始代码。为此,您可以创建一个计算图,如计算图和函数简介指南中所述。

此计算图中包含实现函数的运算。

您可以通过添加 @tf.function 装饰器在上面的模型中定义计算图,以指示此代码应作为计算图运行。

class MySequentialModule(tf.Module):
  def __init__(self, name=None):
    super().__init__(name=name)

    self.dense_1 = Dense(in_features=3, out_features=3)
    self.dense_2 = Dense(in_features=3, out_features=2)

  @tf.function
  def __call__(self, x):
    x = self.dense_1(x)
    return self.dense_2(x)

# You have made a model with a graph!
my_model = MySequentialModule(name="the_model")

您构建的模块的工作原理与之前完全相同。传递给函数的每个唯一签名都会创建一个单独的计算图。请参阅计算图和函数简介指南以了解详情。

print(my_model([[2.0, 2.0, 2.0]]))
print(my_model([[[2.0, 2.0, 2.0], [2.0, 2.0, 2.0]]]))

tf.Tensor([[0. 0.]], shape=(1, 2), dtype=float32)
tf.Tensor(
[[[0. 0.]
  [0. 0.]]], shape=(1, 2, 2), dtype=float32)

您可以通过在 TensorBoard 摘要中跟踪计算图来将其可视化。

# Set up logging.
stamp = datetime.now().strftime("%Y%m%d-%H%M%S")
logdir = "logs/func/%s" % stamp
writer = tf.summary.create_file_writer(logdir)

# Create a new model to get a fresh trace
# Otherwise the summary will not see the graph.
new_model = MySequentialModule()

# Bracket the function call with
# tf.summary.trace_on() and tf.summary.trace_export().
tf.summary.trace_on(graph=True)
tf.profiler.experimental.start(logdir)
# Call only one tf.function when tracing.
z = print(new_model(tf.constant([[2.0, 2.0, 2.0]])))
with writer.as_default():
  tf.summary.trace_export(
      name="my_func_trace",
      step=0,
      profiler_outdir=logdir)

2022-12-14 21:20:34.407218: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcupti.so.11.2'; dlerror: libcupti.so.11.2: cannot open shared object file: No such file or directory
tf.Tensor([[2.365068 0.      ]], shape=(1, 2), dtype=float32)

启动 Tensorboard 以查看生成的跟踪:

#docs_infra: no_execute
%tensorboard --logdir logs/func

A screenshot of the graph, in tensorboard

创建 SavedModel

共享经过完全训练的模型的推荐方式是使用 SavedModel。SavedModel 包含函数集合与权重集合。

您可以按以下方式保存刚刚训练的模型:

tf.saved_model.save(my_model, "the_saved_model")

INFO:tensorflow:Assets written to: the_saved_model/assets

# Inspect the SavedModel in the directory
ls -l the_saved_model

total 28
drwxr-sr-x 2 kbuilder kokoro  4096 Dec 14 21:20 assets
-rw-rw-r-- 1 kbuilder kokoro    55 Dec 14 21:20 fingerprint.pb
-rw-rw-r-- 1 kbuilder kokoro 14672 Dec 14 21:20 saved_model.pb
drwxr-sr-x 2 kbuilder kokoro  4096 Dec 14 21:20 variables

# The variables/ directory contains a checkpoint of the variables
ls -l the_saved_model/variables

total 8
-rw-rw-r-- 1 kbuilder kokoro 490 Dec 14 21:20 variables.data-00000-of-00001
-rw-rw-r-- 1 kbuilder kokoro 356 Dec 14 21:20 variables.index

saved_model.pb 文件是一个描述函数式 tf.Graph 的协议缓冲区。

可以从此表示加载模型和层,而无需实际构建创建该表示的类的实例。在您没有(或不需要)Python 解释器(例如大规模应用或在边缘设备上),或者在原始 Python 代码不可用或不实用的情况下,这样做十分理想。

您可以将模型作为新对象加载:

new_model = tf.saved_model.load("the_saved_model")

通过加载已保存模型创建的 new_model 是 TensorFlow 内部的用户对象,无需任何类知识。它不是 SequentialModule 类型的对象。

isinstance(new_model, SequentialModule)

False

此新模型​​适用于已定义的输入签名。您不能向以这种方式恢复的模型添加更多签名。

print(my_model([[2.0, 2.0, 2.0]]))
print(my_model([[[2.0, 2.0, 2.0], [2.0, 2.0, 2.0]]]))

tf.Tensor([[0. 0.]], shape=(1, 2), dtype=float32)
tf.Tensor(
[[[0. 0.]
  [0. 0.]]], shape=(1, 2, 2), dtype=float32)

因此,利用 SavedModel,您可以使用 tf.Module 保存 TensorFlow 权重和计算图,随后再次加载它们。

Keras 模型和层

请注意,到目前为止,还没有提到 Keras。您可以在 tf.Module 上构建自己的高级 API,而我们已经拥有这些 API。

在本部分中,您将研究 Keras 如何使用 tf.Module。可在 Keras 指南中找到有关 Keras 模型的完整用户指南。

Keras 层

tf.keras.layers.Layer 是所有 Keras 层的基类,它继承自 tf.Module。

您只需换出父项,然后将 __call__ 更改为 call 即可将模块转换为 Keras 层:

class MyDense(tf.keras.layers.Layer):
  # Adding **kwargs to support base Keras layer arguments
  def __init__(self, in_features, out_features, **kwargs):
    super().__init__(**kwargs)

    # This will soon move to the build step; see below
    self.w = tf.Variable(
      tf.random.normal([in_features, out_features]), name='w')
    self.b = tf.Variable(tf.zeros([out_features]), name='b')
  def call(self, x):
    y = tf.matmul(x, self.w) + self.b
    return tf.nn.relu(y)

simple_layer = MyDense(name="simple", in_features=3, out_features=3)

Keras 层有自己的 __call__,它会进行下一部分中所述的某些簿记,然后调用 call()。您应当不会看到功能上的任何变化。

simple_layer([[2.0, 2.0, 2.0]])

<tf.Tensor: shape=(1, 3), dtype=float32, numpy=array([[ 3.3586698, 11.478296 ,  0.6024983]], dtype=float32)>

build 步骤

如上所述,在您确定输入形状之前,等待创建变量在许多情况下十分方便。

Keras 层具有额外的生命周期步骤,可让您在定义层时获得更高的灵活性。这是在 build() 函数中定义的。

build 仅被调用一次,而且是使用输入的形状调用的。它通常用于创建变量(权重)。

您可以根据输入的大小灵活地重写上面的 MyDense 层:

class FlexibleDense(tf.keras.layers.Layer):
  # Note the added `**kwargs`, as Keras supports many arguments
  def __init__(self, out_features, **kwargs):
    super().__init__(**kwargs)
    self.out_features = out_features

  def build(self, input_shape):  # Create the state of the layer (weights)
    self.w = tf.Variable(
      tf.random.normal([input_shape[-1], self.out_features]), name='w')
    self.b = tf.Variable(tf.zeros([self.out_features]), name='b')

  def call(self, inputs):  # Defines the computation from inputs to outputs
    return tf.matmul(inputs, self.w) + self.b

# Create the instance of the layer
flexible_dense = FlexibleDense(out_features=3)

此时,模型尚未构建,因此没有变量:

flexible_dense.variables

[]

调用该函数会分配大小适当的变量。

# Call it, with predictably random results
print("Model results:", flexible_dense(tf.constant([[2.0, 2.0, 2.0], [3.0, 3.0, 3.0]])))

Model results: tf.Tensor(
[[ -4.0764046  -6.8253055   8.713049 ]
 [ -6.114606  -10.237958   13.069572 ]], shape=(2, 3), dtype=float32)

flexible_dense.variables

[<tf.Variable 'flexible_dense/w:0' shape=(3, 3) dtype=float32, numpy=
 array([[-2.0289247 , -2.076827  ,  1.1995791 ],
        [-0.7080742 , -1.0767206 ,  1.6391587 ],
        [ 0.6987968 , -0.25910503,  1.5177863 ]], dtype=float32)>,
 <tf.Variable 'flexible_dense/b:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>]

由于仅调用一次 build,因此如果输入形状与层的变量不兼容,输入将被拒绝。

try:
  print("Model results:", flexible_dense(tf.constant([[2.0, 2.0, 2.0, 2.0]])))
except tf.errors.InvalidArgumentError as e:
  print("Failed:", e)

Failed: Exception encountered when calling layer 'flexible_dense' (type FlexibleDense).

{ {function_node __wrapped__MatMul_device_/job:localhost/replica:0/task:0/device:GPU:0} } Matrix size-incompatible: In[0]: [1,4], In[1]: [3,3] [Op:MatMul]

Call arguments received by layer 'flexible_dense' (type FlexibleDense):
  • inputs=tf.Tensor(shape=(1, 4), dtype=float32)

Keras 层具有许多额外的功能,包括:

  • 可选损失
  • 对指标的支持
  • 对可选 training 参数的内置支持,用于区分训练和推断用途
  • get_config 和 from_config 方法,允许您准确存储配置以在 Python 中克隆模型

在自定义层和模型的完整指南中阅读关于它们的信息。

Keras 模型

您可以将模型定义为嵌套的 Keras 层。

但是,Keras 还提供了称为 tf.keras.Model 的全功能模型类。它继承自 tf.keras.layers.Layer,因此 Keras 模型支持以同样的方式使用、嵌套和保存。Keras 模型还具有额外的功能,这使它们可以轻松训练、评估、加载、保存,甚至在多台机器上进行训练。

您可以使用几乎相同的代码定义上面的 SequentialModule,再次将 __call__ 转换为 call() 并更改父项。

class MySequentialModel(tf.keras.Model):
  def __init__(self, name=None, **kwargs):
    super().__init__(**kwargs)

    self.dense_1 = FlexibleDense(out_features=3)
    self.dense_2 = FlexibleDense(out_features=2)
  def call(self, x):
    x = self.dense_1(x)
    return self.dense_2(x)

# You have made a Keras model!
my_sequential_model = MySequentialModel(name="the_model")

# Call it on a tensor, with random results
print("Model results:", my_sequential_model(tf.constant([[2.0, 2.0, 2.0]])))

Model results: tf.Tensor([[ -7.7209134 -11.065    ]], shape=(1, 2), dtype=float32)

所有相同的功能都可用,包括跟踪变量和子模块。

注:为了强调上面的注意事项,嵌套在 Keras 层或模型中的原始 tf.Module 将不会收集其变量以用于训练或保存。相反,它会在 Keras 层内嵌套 Keras 层。

my_sequential_model.variables

输出

[<tf.Variable 'my_sequential_model/flexible_dense_1/w:0' shape=(3, 3) dtype=float32, numpy=
 array([[ 2.101298  ,  0.688942  ,  0.03565756],
        [ 2.3658068 ,  0.85582966,  2.0014653 ],
        [ 0.01524658,  2.8060834 , -0.9343785 ]], dtype=float32)>,
 <tf.Variable 'my_sequential_model/flexible_dense_1/b:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>,
 <tf.Variable 'my_sequential_model/flexible_dense_2/w:0' shape=(3, 2) dtype=float32, numpy=
 array([[-0.6302263 ,  0.16817436],
        [-0.0965464 , -0.8405755 ],
        [-0.5581541 , -2.3841376 ]], dtype=float32)>,
 <tf.Variable 'my_sequential_model/flexible_dense_2/b:0' shape=(2,) dtype=float32, numpy=array([0., 0.], dtype=float32)>]

my_sequential_model.submodules
(<__main__.FlexibleDense at 0x7f10356a2ac0>,
 <__main__.FlexibleDense at 0x7f0f840a6df0>)

重写 tf.keras.Model 是一种构建 TensorFlow 模型的极 Python 化方式。如果要从其他框架迁移模型,这可能非常简单。

如果要构造的模型是现有层和输入的简单组合,则可以使用函数式 API 节省时间和空间,此 API 附带有关模型重构和架构的附加功能。

下面是使用函数式 API 构造的相同模型:

inputs = tf.keras.Input(shape=[3,])

x = FlexibleDense(3)(inputs)
x = FlexibleDense(2)(x)

my_functional_model = tf.keras.Model(inputs=inputs, outputs=x)

my_functional_model.summary()

Model: "model"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_1 (InputLayer)        [(None, 3)]               0         
                                                                 
 flexible_dense_3 (FlexibleD  (None, 3)                12        
 ense)                                                           
                                                                 
 flexible_dense_4 (FlexibleD  (None, 2)                8         
 ense)                                                           
                                                                 
=================================================================
Total params: 20
Trainable params: 20
Non-trainable params: 0
_________________________________________________________________

my_functional_model(tf.constant([[2.0, 2.0, 2.0]]))

<tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[17.50604  , -3.8958669]], dtype=float32)>

这里的主要区别在于,输入形状是作为函数构造过程的一部分预先指定的。在这种情况下,不必完全指定 input_shape 参数;您可以将某些维度保留为 None。

注:您无需在子类化模型中指定 input_shape 或 InputLayer;这些参数和层将被忽略。

保存 Keras 模型

可以为 Keras 模型创建检查点,这看起来和 tf.Module 一样。

Keras 模型也可以使用 tf.saved_models.save() 保存,因为它们是模块。但是,Keras 模型具有更方便的方法和其他功能:

my_sequential_model.save("exname_of_file")

INFO:tensorflow:Assets written to: exname_of_file/assets

同样地,它们也可以轻松重新加载:

reconstructed_model = tf.keras.models.load_model("exname_of_file")

WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.

Keras SavedModels 还可以保存指标、损失和优化器状态。

可以使用此重构模型,并且在相同数据上调用时会产生相同的结果:

reconstructed_model(tf.constant([[2.0, 2.0, 2.0]]))

<tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[ -7.7209134, -11.065    ]], dtype=float32)>

有关保存和序列化 Keras 模型,包括为自定义层提供配置方法来为功能提供支持的更多信息,请参阅保存和序列化指南。

后续步骤

如果您想了解有关 Keras 的更多详细信息,可以在此处查看现有的 Keras 指南。

在 tf.module 上构建的高级 API 的另一个示例是 DeepMind 的 Sonnet,其网站上有详细介绍。

16 | TensorFlow 2中实现自定义层和模型 在TensorFlow 2中实现自定义层的好处主要体现在灵活性、可重用性和可读性方面。 阅读详情

相关推荐

TensorFlow2.0 自定义层、自定义模块、自定义模型构建

头文件 import numpy as np import tensorflow as tf import datetime import os from tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPool2D 1、加载数据集 def load_dataset(): mnist = np.load("mnist.npz") return mnist['x_train']/255.0, mnist['y_tr

猫ER 2443

keras layers

定义keras layers 什么是layers state compution tf.keras.layers.Layer 是keras中layer对象的基类, custom layer对象继承该类即可. layer对象包括它的state(即该layer的weights和bias, 是tf.Variable.将weidhts和bias定义为该类的属性的时候, 计算图会自动跟踪和更新这些变量的state)和计算图(call 函数, 输入输出都是tensor, 默认dtype为tf.float32)

renmeng140481的博客 1566

tf.keras.layers.Layer自定义层

为了进一步了解上一篇中的class,搜了github如下示例: import tensorflow as tf class MyLayer(tf.keras.layers.Layer): def __init__(self, output_dim, **kwargs): self.output_dim = output_dim super(MyLayer, self).__init__(**kwargs) def build(self, input_shape): # Create a trainable weight vari

Keras定义Layer和Model

自定义Layer tf.keras.layers.Layer 是所有 Keras 层的基类,它继承自 tf.Module。 定义call 您只需换出父项,然后将 __call__ 更改为 call 即可将模块转换为 Keras 层 定义build 定义输入的shape.build 仅被调用一次,而且是使用输入形状时调用的。它通常用于创建变量(权重) import tensorflow as tf class MyLayer(tf.keras.layers.Layer): ...

ustbbsy的博客 2165

学Simulink——基于Simulink的输入-输出线性化精确转矩控制

本文详细介绍了基于Simulink的永磁同步电机(PMSM)输入-输出线性化(IOL)精确转矩控制方法。针对传统解耦控制在非线性转矩特性下的局限性,提出通过精确反馈线性化实现转矩指令与实际转矩的严格线性关系。文章系统阐述了IOL原理、PMSM控制器推导过程,并提供了完整的Simulink建模步骤,包括电机模型搭建、IOL控制器实现和闭环系统构建。通过仿真对比验证了IOL方法在转矩跟踪精度、动态响应和参数鲁棒性方面的显著优势,最后讨论了工程实现要点和扩展应用方向。该方法为高性能伺服系统开发提供了有效解决方案。

amy_mhd的博客 60

携程机票数据爬取实战:使用 Python 获取携程网机票信息

通过本篇博客,我们详细介绍了如何使用 Python 爬取携程网的机票信息,涉及了静态网页爬取(使用 Requests 和 BeautifulSoup)和动态网页爬取(使用 Selenium)两种方法。通过获取的数据,我们不仅能够进行票价分析,还可以构建更为复杂的预测模型或趋势分析工具。爬虫技术不仅能够帮助我们收集有价值的数据,还能够为商业决策提供数据支持。在实际应用中,我们可以结合更多的分析方法,如自然语言处理、图像处理等,进一步提升数据的价值。

2201_76125261的博客 1657

tf.keras.layers.BatchNormalization、tf.keras.layer.LayerNormalization函数

函数原型 tf.keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initi

weixin_49346755的博客 5072

【微服务】SpringBoot 整合 FastExcel 实现导入导出操作详解

SpringBoot 整合 FastExcel 实现导入导出操作详解

congge 4234

tf.keras.layer介绍

通过继承tf.keras.layer 实现自定义层的最佳方法是继承tf.keras.Layer类并实现: init ,在其中进行所有与输入无关的变量或常量的初始化 build,在其中知道输入张量的形状,并可以进行其余的初始化 call,在这里进行前向传播逻辑的计算的定义 请注意,不必等到build被调用才创建变量,也可以在__init__中直接定义。但是,在build中创建变量的好处在于,可以根据build的参数 input shape来自动调整变量的shape。而在__init__中创建变量意味着需要显

github_39605284的博客 688

3D打印机控制系统设计:基于MATLAB的3D打印机运动学建模、轨迹规划和控制

控制实现:在控制实现中,需要将轨迹规划的结果转化为实际的控制指令,控制3D打印机按照规划的轨迹进行运动。3D打印机的运动学建模:3D打印机的运动学建模是指将3D打印机的机械结构、传动系统和运动控制部件等抽象成数学模型,以便于进行控制系统的设计和分析。轨迹规划:轨迹规划是指根据3D模型的几何形状和打印机的运动学模型,计算出打印机需要执行的运动轨迹,以便于实现所需的打印效果。控制实现:控制实现是指将轨迹规划的结果转化为控制指令,控制3D打印机按照规划的轨迹进行运动。

走向CTO的路上... 2473

手把手教你学simulink实例--基于Simulink的航空发动机控制系统设计与仿真

航空发动机是飞机的核心动力装置,其性能直接影响飞行器的安全性、经济性和可靠性。现代航空发动机控制系统需要具备高精度、快速响应和强鲁棒性的特点,以适应复杂的飞行环境和任务需求。本项目旨在使用MATLAB/Simulink平台,设计并实现一种适用于涡扇发动机的闭环控制系统,通过调节燃油流量、压气机叶片角度等控制变量,确保发动机在不同工况下稳定运行,并满足推力需求。

MHD0815的博客 275

TensorFlow中的Keras用法和自定义模型和层

Keras Keras 是一个用于构建和训练深度学习模型的高阶 API。它可用于快速设计原型、高级研究和生产,具有以下三个主要优势: 方便用户使用 Keras 具有针对常见用例做出优化的简单而一致的界面。它可针对用户错误提供切实可行的清晰反馈。 模块化和可组合 将可配置的构造块连接在一起就可以构建 Keras 模型,并且几乎不受限制。 易于扩展 可以编写自定义构造块以表达新的研究创意...

进击的菜鸟 2万+

Microsemi Libero系列教程(一)——Libero开发环境介绍、下载、安装与注册

前言 相比与Xilinx和Altera在国内的市场,Microsemi的FPGA在国内应用很少很少,网上几乎没有详细的教程,刚开始使用时,遇到了各种问题,自己也走了不少弯路。本系列教程以Libero V11.8.2.4,SmartFusion系列A2F200M3F FPGA芯片为例,将详细介绍Libero SoC软件的基本使用,及使用过程中遇到一些问题的解决方法。 Libero 简介 关于Lib...

whik1194的博客 3万+

第四章:Tensorflow 2.0 实现自定义层和自定义模型的编写并实现cifar10 的全连接网络(理论+实战)

通过阅读少奶奶上一篇博文,我们初步实现了调用Tensorflow 2.0提供的keras模块下的方法,使用极少的代码完成了一个五层的全连接网络,具体代码如下: 若小伙伴需要复习一下上一篇博文的内容的话,少奶奶这里给出对应链接,希望对大家有所帮助: 第三章:Tensorflow 2.0 利用高级接口...

变强啊!三少奶奶 6111

ExpressLRS(ELRS)接收机技术全景:从历史演进、技术底层到产业生态全解析——上

ExpressLRS(ELRS)是一种由全球开源社区驱动的双向射频遥控链路协议栈,其接收机作为核心终端,承担信号接收解调、遥控指令解析、飞控数据交互与遥测回传等关键功能。自2018年问世以来,ELRS凭借极致性能、低成本、开放生态和强兼容性,从航模DIY方案发展为消费级无人机领域的事实标准,并逐步渗透工业级场景。 ELRS接收机采用模块化分层架构,支持2.4GHz和900MHz双频段,通过LoRa、FLRC、FSK多调制模式实现低延迟与远距离平衡。其核心技术包括自适应跳频抗干扰、TDD双向链路和极简数据包。

bother3000的博客 303

基于Python的海关进出口数据爬取与贸易关系分析

本文介绍了如何使用Python爬虫技术获取海关进出口数据,并基于这些数据进行贸易关系分析。文章详细阐述了数据采集、清洗、存储和分析的全过程,使用了最新的爬虫技术和数据分析方法,为国际贸易研究提供数据支持和技术参考。关键词:Python爬虫、海关数据、贸易分析、数据可视化、Selenium、Scrapy。

2201_76125261的博客 543

【TensorFlow深度学习】十二、模块(自定义层与块、参数的访问、初始化与存取)

在本节中,我们将深入探索深度学习计算的关键组件, 即模型构建、参数访问与初始化、设计自定义层和块、将模型读写到磁盘, 以及利用GPU实现显著的加速。

鹤子的一些知识共享 1472

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TensorFlow 2.0 + Keras实战:用自定义层和回调函数打造你的第一个神经网络模型

本文详细介绍了如何使用TensorFlow 2.0和Keras构建自定义神经网络层和回调函数,实现高效的深度学习模型开发。通过实战案例,展示了自定义层设计、混合精度训练、回调系统应用以及模型部署的全流程,帮助开发者提升AI工程化能力。特别适合需要掌握CNN等深度学习技术的开发者。

weixin_30216561的博客 530

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TensorFlow通过子类化创建新的层和模型

学会通过继承tf.keras.layers.Layer类自定义层,和继承tf.keras.Model类自定神经网络模型

my_name_is_learn的博客 1127

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

在tensorflow中自定义层

import tensorflow as tf from tensorflow.keras import layers class Linear(layers.Layer): def __init__(self,units=32): super(Linear,self).__init__() self.units=units def build(self,input_shape): ...

thebeautyofmath的博客 1101

37.自定义层与模型

之前我们使用的层都是在tf.keras.layers中封装好的,在我们实际应用上,封装好的层应用的也比较多,但有的时候我们需要让层实现在封装层中没有的功能,这个时候我们就要自定义层 所有的自定义层都要继承tf.keras.layers.Layer,才能被使用,我们在自定义类前先导入库 1自定义全连接层 dense 首先我们创建一个类,这个类需要继承tf.keras.layers.Layer 1.1定义初始化方法 之后我们定义初始化函数,初始化函数有两个参数,一个是神经元个数(uni...

potato123232的博客 698

TensorFlow定制模型和训练算法(下)

TensorFlow定制模型和训练算法(上) 5、自定义层 要构建自定义的有状态层(有权重的层),需要创建Keras.layers.Layer类的子类。 例如(实现Dense层的简化版本): class MyDense(keras.layers.Layer): def __init__(self, units, activation=None, **kwargs): //负责处理标准参数。 super().__init__(**kwargs) self.un

qq_51153436的博客 1061

全面小白分析如何使用tensorflow2.0中Model子类化创建自定义模型

使用tensorflow2.0搭建神经网络结构的方法剩下最后一种啦。明白了这种之后,自己多加练习,融汇贯通,有朝一日自己也是别人眼中随便搭建网络的大神了

my_name_is_learn的博客 2453
上一篇: cmake find_package
下一篇: mediapipe流水线分析 三
江太翁
博客等级 码龄15年 271粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值