微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Tensorflow 2.0中是否有更简便的方法来执行模型的图层?

如何解决在Tensorflow 2.0中是否有更简便的方法来执行模型的图层?

让我们假设我通过使用Tensorflow 2.0中的 Keras子类化API 创建一个自定义模型,如下所示。

class MyModel(Model):
  def __init__(self):
    super(MyModel,self).__init__()
    self.conv1 = Conv2D(32,3,activation='relu')
    self.flatten = Flatten()
    self.d1 = Dense(128,activation='relu')
    self.d2 = Dense(10,activation='softmax')

  def call(self,x):
    x = self.conv1(x)
    x = self.flatten(x)
    x = self.d1(x)
    return self.d2(x)

model = MyModel()

如果没有很多层,那么编写该类的“ def call”并不是那么烦人。

要做的就是像上面那样写下3〜4行图层。

但是如果层数增加到50〜60甚至更高呢?

我是否必须键入所有这些层?我不知道会有更好的方法吗?

期待您的答复。预先谢谢你!

解决方法

您可以创建一个循环以一次创建多个图层,然后使用for循环调用它们。

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
import tensorflow as tf
from functools import partial

x = tf.random.uniform((5,2),1)

class MyModel(tf.keras.Model):
  def __init__(self):
    super(MyModel,self).__init__()
    dense_layer = partial(tf.keras.layers.Dense,units=3,activation='relu')
    self.layer_list = [dense_layer(name=f'layer_{i}') for i in range(3)]
    self.out = tf.keras.layers.Dense(1,activation='sigmoid')

  def call(self,x,training=None,**kwargs):
    for layer in self.layer_list:
        x = layer(x)
    x = self.out(x)
    return x

model = MyModel()
model.build(input_shape=(5,2))
print(list(map(lambda x: x.name,model.layer_list)))
['layer_0','layer_1','layer_2']
model(x)
<tf.Tensor: shape=(5,1),dtype=float32,numpy=
array([[0.51850706],[0.5285746 ],[0.51396513],[0.5171388 ],[0.50938624]],dtype=float32)>

某些架构会重复自身(例如,连续多次卷积层和最大池化层),因此您可以创建返回多个层的函数,然后使用循环创建其中的许多层。为了避免重复所有操作,我使用了functools.partial,它使用默认参数创建了一个可调用对象。

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
import tensorflow as tf
from functools import partial

x = tf.random.uniform((5,256,3),1)

def conv_block(units):
    conv = partial(tf.keras.layers.Conv2D,kernel_size=(3,activation='relu')
    pool = partial(tf.keras.layers.MaxPooling2D,pool_size=(2,2))
    layer_dict = {
        'conv1': conv(units),'pool1': pool(),'conv2': conv(units*2),'pool2': pool(),'conv3': conv(units*3)
    }
    return layer_dict

class MyModel(tf.keras.Model):
  def __init__(self):
    super(MyModel,self).__init__()
    self.block_list = [conv_block(i) for i in range(1,3)]
    self.flat = tf.keras.layers.Flatten()
    self.out = tf.keras.layers.Dense(1,**kwargs):
    for block in self.block_list:
        for layer in block.values():
            x = layer(x)
    x = self.flat(x)
    x = self.out(x)
    return x

model = MyModel()
model.build(input_shape=(5,3))

model(x)
<tf.Tensor: shape=(5,numpy=
array([[0.48275623],[0.48887327],[0.49217385],[0.48883903],[0.48933515]],dtype=float32)>

如您所见,我两次生成了此块:

model.layers
[<tensorflow.python.keras.layers.convolutional.Conv2D at 0x1b404f47b08>,<tensorflow.python.keras.layers.convolutional.Conv2D at 0x1b40be6cb48>,<tensorflow.python.keras.layers.convolutional.Conv2D at 0x1b40d6eab88>,<tensorflow.python.keras.layers.pooling.MaxPooling2D at 0x1b40be6cb08>,<tensorflow.python.keras.layers.pooling.MaxPooling2D at 0x1b40d6ddc08>,<tensorflow.python.keras.layers.convolutional.Conv2D at 0x1b40d6f2188>,<tensorflow.python.keras.layers.convolutional.Conv2D at 0x1b40d6f2bc8>,<tensorflow.python.keras.layers.convolutional.Conv2D at 0x1b40d6f0648>,<tensorflow.python.keras.layers.pooling.MaxPooling2D at 0x1b40d6f2748>,<tensorflow.python.keras.layers.pooling.MaxPooling2D at 0x1b40d6f01c8>,<tensorflow.python.keras.layers.core.Flatten at 0x1b40d6f8cc8>,<tensorflow.python.keras.layers.core.Dense at 0x1b40d6ee248>]
,

在TF 2.0中创建类可以更轻松地与Pytorch和其他深度学习框架竞争。但是,如果您的模型是顺序模型,并且彼此堆叠,则仍然可以通过此example应用它。

对于需要执行多个输出,并行计算(例如SSD或YOLO)的模型,像类一样全面编写更好,或者您可以通过将多个输入和多个输出传递给模型来直接使用模型(example

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。