Tensorflow2.0チュートリアル - カスタム層

Tensorflow2.0チュートリアル - カスタム層

温首相は、アドレスに喜んで:https://doit-space.blog.csdn.net/article/details/95040756

最も完全なTensorflow 2.0入門チュートリアルは、継続的に更新:https://blog.csdn.net/qq_31456593/article/details/88606284

完全tensorflow2.0チュートリアルのコードを参照してくださいhttps://github.com/czy36mengfei/tensorflow2_tutorials_chinese(歓迎スター)

:個人による学習上のこのチュートリアル焦点はノートは、チュートリアルの中国の友人を読んで楽しむことが簡単に説明するために、中国の仕上げから公式のチュートリアル公式チュートリアルをtensorflow2.0再現https://www.tensorflow.orgを

一般的な操作、ネットワーク層の層

通常、機械学習モデルを積み重ね、シンプルなネットワーク層の組み合わせとして表現することができる、とtensorflowは私たちのために、ニューラルネットワークプログラムの便利な準備を提供し、一般的なネットワーク層を提供します。
TensorFlow2のtf.kerasは、使用の読みやすさと使いやすさを有するネットワークを構築するためにそれを使用して、ネイティブkerasからネットワーク層、tf.kerasを構築することをお勧めします。

たとえば、私たちはシンプルに完全に接続されたネットワークを構築したい、あなただけのネットワーク内のニューロンの数を指定する必要が

layer = tf.keras.layers.Dense(100)
# 也可以添加输入维度限制
layer = tf.keras.layers.Dense(100, input_shape=(None, 20))

あなたはできる文書、既存の層の完全なリストを。これは、高密度、Conv2D、LSTM、BatchNormalization、含まドロップアウトようにしています。

各層は機能として、及び機能のデータ入力への入力として使用することができます

layer(tf.ones([6, 6]))

我々はまた、などの変数ネットワーク重み行列、バイアスを得ることができます

print(layer.variables) # 包含了权重和偏置
[<tf.Variable 'dense_1/kernel:0' shape=(6, 100) dtype=float32, numpy=
array([[-0.18237606,  0.16415142,  0.20687856,  0.23396944,  0.09779547,
        -0.14794639, -0.10231382, -0.22263053, -0.0950674 ,  0.18697281,
         ...
        -0.10450925, -0.12111329, -0.2259491 ,  0.12304659, -0.04047236]],
      dtype=float32)>, <tf.Variable 'dense_1/bias:0' shape=(100,) dtype=float32, numpy=
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
      dtype=float32)>]
print(layer.kernel, layer.bias)  # 也可以分别取出权重和偏置
<tf.Variable 'dense_1/kernel:0' shape=(6, 100) dtype=float32, numpy=
array([[-0.18237606,  0.16415142,  0.20687856,  0.23396944,  0.09779547,
       ...
        -0.10450925, -0.12111329, -0.2259491 ,  0.12304659, -0.04047236]],
      dtype=float32)> <tf.Variable 'dense_1/bias:0' shape=(100,) dtype=float32, numpy=
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
      dtype=float32)>

第二に、カスタムネットワーク層を達成するために

あなたの層を達成するための最良の方法は、拡張tf.keras.Layerクラスであり、実装します。

  • _ INIT _()関数を、あなたはここで入力された初期のすべての独立を実行することができます

  • ビルド()関数は、テンソル入力形状を得ることができ、初期化の残りの部分が実行されてもよいです

  • ()関数の呼び出し、前に広がるように構成されたネットワーク構造

実際には、あなたがコールビルドが()ネットワーク構造を作成するまで待つ必要はありません、あなたは_にすることができINIT _()でそれらを作成します。しかし、)(ビルドでそれらの利点を作成することは、入力層の形状を操作するに従って構成されたネットワークの後半を可能にすることができるということです。一方、__init__で変数を作成し、それが明示的に、所望の形状を作成するための変数を指定する必要が意味しています。

class MyDense(tf.keras.layers.Layer):
    def __init__(self, n_outputs):
        super(MyDense, self).__init__()
        self.n_outputs = n_outputs
    
    def build(self, input_shape):
        self.kernel = self.add_variable('kernel',
                                       shape=[int(input_shape[-1]),
                                             self.n_outputs])
    def call(self, input):
        return tf.matmul(input, self.kernel)
layer = MyDense(10)
print(layer(tf.ones([6, 5])))
print(layer.trainable_variables)
tf.Tensor(
[[ 1.0200843  -0.42590106 -0.92992705  0.46160045  0.7518406   0.32543844
   0.34020287  0.08215448  0.22044104 -0.5337319 ]
 [ 1.0200843  -0.42590106 -0.92992705  0.46160045  0.7518406   0.32543844
   0.34020287  0.08215448  0.22044104 -0.5337319 ]
 [ 1.0200843  -0.42590106 -0.92992705  0.46160045  0.7518406   0.32543844
   0.34020287  0.08215448  0.22044104 -0.5337319 ]
 [ 1.0200843  -0.42590106 -0.92992705  0.46160045  0.7518406   0.32543844
   0.34020287  0.08215448  0.22044104 -0.5337319 ]
 [ 1.0200843  -0.42590106 -0.92992705  0.46160045  0.7518406   0.32543844
   0.34020287  0.08215448  0.22044104 -0.5337319 ]
 [ 1.0200843  -0.42590106 -0.92992705  0.46160045  0.7518406   0.32543844
   0.34020287  0.08215448  0.22044104 -0.5337319 ]], shape=(6, 10), dtype=float32)
[<tf.Variable 'my_dense/kernel:0' shape=(5, 10) dtype=float32, numpy=
array([[ 0.54810244,  0.042225  ,  0.25634396,  0.1677258 , -0.0361526 ,
         0.32831818,  0.17709464,  0.46625894,  0.29662275, -0.32920587],
       [ 0.30925363, -0.426274  , -0.49862564,  0.3068235 ,  0.29526353,
         0.50076336,  0.17321467,  0.21151704, -0.26317668, -0.2006711 ],
       [ 0.10354012, -0.3258371 , -0.12274069, -0.33250242,  0.46343058,
        -0.45535576,  0.5332853 , -0.37351888, -0.00410944,  0.16418225],
       [-0.4515978 ,  0.04706419, -0.42583126, -0.19347438,  0.54246336,
         0.57910997,  0.01877069,  0.01255274, -0.14176458, -0.6309683 ],
       [ 0.5107859 ,  0.23692083, -0.13907343,  0.51302797, -0.5131643 ,
        -0.6273973 , -0.56216246, -0.23465535,  0.332869  ,  0.4629311 ]],
      dtype=float32)>]

第三に、ネットワーク層組成物

異なる構造層が組み合わされる重畳によって多くの機械学習モデルは、としてresnetの組み合わせそれぞれ「畳み込み+ +残渣を連結バッチの標準化」のための残差ブロックであり、そこです。

tensorflow2に一般tf.keras.Modelクラスの継承と、ネットワークの複数の層を含む構造を作成します。

# 残差块
class ResnetBlock(tf.keras.Model):
    def __init__(self, kernel_size, filters):
        super(ResnetBlock, self).__init__(name='resnet_block')
        
        # 每个子层卷积核数
        filter1, filter2, filter3 = filters
        
        # 三个子层,每层1个卷积加一个批正则化
        # 第一个子层, 1*1的卷积
        self.conv1 = tf.keras.layers.Conv2D(filter1, (1,1))
        self.bn1 = tf.keras.layers.BatchNormalization()
        # 第二个子层, 使用特点的kernel_size
        self.conv2 = tf.keras.layers.Conv2D(filter2, kernel_size, padding='same')
        self.bn2 = tf.keras.layers.BatchNormalization()
        # 第三个子层,1*1卷积
        self.conv3 = tf.keras.layers.Conv2D(filter3, (1,1))
        self.bn3 = tf.keras.layers.BatchNormalization()
        
    def call(self, inputs, training=False):
        
        # 堆叠每个子层
        x = self.conv1(inputs)
        x = self.bn1(x, training=training)
        
        x = self.conv2(x)
        x = self.bn2(x, training=training)
        
        x = self.conv3(x)
        x = self.bn3(x, training=training)
        
        # 残差连接
        x += inputs
        outputs = tf.nn.relu(x)
        
        return outputs

resnetBlock = ResnetBlock(2, [6,4,9])
# 数据测试
print(resnetBlock(tf.ones([1,3,9,9])))
# 查看网络中的变量名
print([x.name for x in resnetBlock.trainable_variables])
tf.Tensor(
[[[[0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.83203167 0.9436392  1.0989372  1.2588525  0.8683256  1.1279813
    0.7571581  0.47963202 0.88908756]]

  [[0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.79764616 1.0550306  0.9386751  1.1079601  0.9402881  0.99479383
    0.9072118  0.5618475  0.9134829 ]
   [0.83203167 0.9436392  1.0989372  1.2588525  0.8683256  1.1279813
    0.7571581  0.47963202 0.88908756]]

  [[1.0775117  1.1620466  0.72680396 1.0019443  1.2767658  1.1365149
    1.1792164  1.0868194  1.0623009 ]
   [1.0775117  1.1620466  0.72680396 1.0019443  1.2767658  1.1365149
    1.1792164  1.0868194  1.0623009 ]
   [1.0775117  1.1620466  0.72680396 1.0019443  1.2767658  1.1365149
    1.1792164  1.0868194  1.0623009 ]
   [1.0775117  1.1620466  0.72680396 1.0019443  1.2767658  1.1365149
    1.1792164  1.0868194  1.0623009 ]
   [1.0775117  1.1620466  0.72680396 1.0019443  1.2767658  1.1365149
    1.1792164  1.0868194  1.0623009 ]
   [1.0775117  1.1620466  0.72680396 1.0019443  1.2767658  1.1365149
    1.1792164  1.0868194  1.0623009 ]
   [1.0775117  1.1620466  0.7268039  1.0019443  1.2767658  1.1365149
    1.1792164  1.0868194  1.0623009 ]
   [1.0775117  1.1620466  0.7268039  1.0019443  1.2767658  1.1365149
    1.1792164  1.0868194  1.0623009 ]
   [0.87889266 0.9541194  0.8929231  0.96703756 1.0905087  1.0646607
    0.9235744  0.9829142  1.1302696 ]]]], shape=(1, 3, 9, 9), dtype=float32)
['resnet_block/conv2d_12/kernel:0', 'resnet_block/conv2d_12/bias:0', 'resnet_block/batch_normalization_v2_12/gamma:0', 'resnet_block/batch_normalization_v2_12/beta:0', 'resnet_block/conv2d_13/kernel:0', 'resnet_block/conv2d_13/bias:0', 'resnet_block/batch_normalization_v2_13/gamma:0', 'resnet_block/batch_normalization_v2_13/beta:0', 'resnet_block/conv2d_14/kernel:0', 'resnet_block/conv2d_14/bias:0', 'resnet_block/batch_normalization_v2_14/gamma:0', 'resnet_block/batch_normalization_v2_14/beta:0']

モデルが線形であるならば、直接tf.keras.Sequentialを構築するために使用することができます。

seq_model = tf.keras.Sequential(
[
    tf.keras.layers.Conv2D(1, 1, input_shape=(None, None, 3)),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Conv2D(2, 1, padding='same'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Conv2D(3, 1),
    tf.keras.layers.BatchNormalization(),
    
])
seq_model(tf.ones([1,2,3,3]))
<tf.Tensor: id=1354, shape=(1, 2, 3, 3), dtype=float32, numpy=
array([[[[-0.36850607, -0.60731524,  1.2792252 ],
         [-0.36850607, -0.60731524,  1.2792252 ],
         [-0.36850607, -0.60731524,  1.2792252 ]],

        [[-0.36850607, -0.60731524,  1.2792252 ],
         [-0.36850607, -0.60731524,  1.2792252 ],
         [-0.36850607, -0.60731524,  1.2792252 ]]]], dtype=float32)>
公開された143元の記事 ウォンの賞賛345 ビュー470 000 +

おすすめ

転載: blog.csdn.net/qq_31456593/article/details/95040756