Özel katmanlar

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

Sinir ağları oluşturmak için üst düzey bir API olarak tf.keras kullanmanızı öneririz. Bununla birlikte, çoğu TensorFlow API'si istekli yürütme ile kullanılabilir.

import tensorflow as tf
print(tf.config.list_physical_devices('GPU'))
-yer tutucu2 l10n-yer
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

Katmanlar: faydalı işlemlerin ortak kümeleri

Çoğu zaman, makine öğrenimi modelleri için kod yazarken, bireysel işlemlerden ve bireysel değişkenlerin manipülasyonundan daha yüksek bir soyutlama düzeyinde çalışmak istersiniz.

Birçok makine öğrenimi modeli, nispeten basit katmanların bileşimi ve istiflenmesi olarak ifade edilebilir ve TensorFlow, hem çok sayıda ortak katman kümesi hem de kendi uygulamaya özel katmanlarınızı sıfırdan veya mevcut katmanlar

TensorFlow, tf.keras paketinde tam Keras API'sini içerir ve Keras katmanları, kendi modellerinizi oluştururken çok kullanışlıdır.

# In the tf.keras.layers package, layers are objects. To construct a layer,
# simply construct the object. Most layers take as a first argument the number
# of output dimensions / channels.
layer = tf.keras.layers.Dense(100)
# The number of input dimensions is often unnecessary, as it can be inferred
# the first time the layer is used, but it can be provided if you want to
# specify it manually, which is useful in some complex models.
layer = tf.keras.layers.Dense(10, input_shape=(None, 5))

Önceden var olan katmanların tam listesi belgelerde görülebilir. Yoğun (tamamen bağlı bir katman), Conv2D, LSTM, BatchNormalization, Dropout ve diğerlerini içerir.

# To use a layer, simply call it.
layer(tf.zeros([10, 5]))
<tf.Tensor: shape=(10, 10), 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)>
# Layers have many useful methods. For example, you can inspect all variables
# in a layer using `layer.variables` and trainable variables using
# `layer.trainable_variables`. In this case a fully-connected layer
# will have variables for weights and biases.
layer.variables
[<tf.Variable 'dense_1/kernel:0' shape=(5, 10) dtype=float32, numpy=
 array([[-0.4370762 ,  0.6231566 , -0.44082257, -0.48535   ,  0.17860883,
         -0.521853  , -0.45774594, -0.5409817 ,  0.29194772, -0.18690601],
        [ 0.3304953 , -0.27142242, -0.48322448, -0.19328138, -0.14415592,
          0.05973059,  0.56227285,  0.5323917 , -0.4914217 ,  0.62182254],
        [-0.5313885 ,  0.54680306,  0.1632638 , -0.10741419, -0.04727739,
         -0.35414204,  0.07529551, -0.06515282, -0.19732419,  0.25217015],
        [ 0.49743277,  0.31172627,  0.04989761,  0.1200847 ,  0.42642146,
          0.5887727 ,  0.5771937 ,  0.08720696,  0.43024355, -0.17298424],
        [-0.07610255,  0.04131562,  0.3136508 , -0.6197298 ,  0.2331146 ,
          0.04888463, -0.54215366,  0.41208786,  0.27439958,  0.08524591]],
       dtype=float32)>,
 <tf.Variable 'dense_1/bias:0' shape=(10,) dtype=float32, numpy=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)>]
# The variables are also accessible through nice accessors
layer.kernel, layer.bias
(<tf.Variable 'dense_1/kernel:0' shape=(5, 10) dtype=float32, numpy=
 array([[-0.4370762 ,  0.6231566 , -0.44082257, -0.48535   ,  0.17860883,
         -0.521853  , -0.45774594, -0.5409817 ,  0.29194772, -0.18690601],
        [ 0.3304953 , -0.27142242, -0.48322448, -0.19328138, -0.14415592,
          0.05973059,  0.56227285,  0.5323917 , -0.4914217 ,  0.62182254],
        [-0.5313885 ,  0.54680306,  0.1632638 , -0.10741419, -0.04727739,
         -0.35414204,  0.07529551, -0.06515282, -0.19732419,  0.25217015],
        [ 0.49743277,  0.31172627,  0.04989761,  0.1200847 ,  0.42642146,
          0.5887727 ,  0.5771937 ,  0.08720696,  0.43024355, -0.17298424],
        [-0.07610255,  0.04131562,  0.3136508 , -0.6197298 ,  0.2331146 ,
          0.04888463, -0.54215366,  0.41208786,  0.27439958,  0.08524591]],
       dtype=float32)>,
 <tf.Variable 'dense_1/bias:0' shape=(10,) dtype=float32, numpy=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)>)

Özel katmanları uygulama

Kendi katmanınızı uygulamanın en iyi yolu tf.keras.Layer sınıfını genişletmek ve uygulamaktır:

  1. __init__ , girişten bağımsız tüm başlatma işlemlerini yapabileceğiniz yer
  2. giriş tensörlerinin şekillerini bildiğiniz ve başlatmanın geri kalanını yapabileceğiniz build
  3. call , ileri hesaplamayı yaptığınız yer

Değişkenlerinizi oluşturmak için build çağrılıncaya kadar beklemeniz gerekmediğini unutmayın, bunları __init__ içinde de oluşturabilirsiniz. Ancak bunları build avantajı, katmanın üzerinde çalışacağı girdilerin şekline dayalı olarak geç değişken oluşturmaya olanak sağlamasıdır. Öte yandan, __init__ içinde değişken oluşturmak, değişkenleri oluşturmak için gereken şekillerin açıkça belirtilmesi gerektiği anlamına gelir.

class MyDenseLayer(tf.keras.layers.Layer):
  def __init__(self, num_outputs):
    super(MyDenseLayer, self).__init__()
    self.num_outputs = num_outputs

  def build(self, input_shape):
    self.kernel = self.add_weight("kernel",
                                  shape=[int(input_shape[-1]),
                                         self.num_outputs])

  def call(self, inputs):
    return tf.matmul(inputs, self.kernel)

layer = MyDenseLayer(10)
_ = layer(tf.zeros([10, 5])) # Calling the layer `.builds` it.
yer tutucu12 l10n-yer
print([var.name for var in layer.trainable_variables])
['my_dense_layer/kernel:0']

Diğer okuyucular standart katmanların davranışına aşina olacağından, mümkün olduğunda standart katmanlar kullanıyorsa, genel kodun okunması ve bakımı daha kolaydır. tf.keras.layers içinde bulunmayan bir katman kullanmak istiyorsanız, bir github sorunu göndermeyi veya daha da iyisi bize bir çekme isteği göndermeyi düşünün!

Modeller: Katmanları oluşturma

Makine öğrenimi modellerinde birçok ilginç katman benzeri şey, mevcut katmanlar oluşturularak uygulanır. Örneğin, bir resnet'teki her artık blok, evrişimlerin, toplu normalleştirmelerin ve bir kısayolun bir bileşimidir. Katmanlar diğer katmanların içine yerleştirilebilir.

Tipik olarak, Model.fit , Model.evaluate ve Model.save gibi model yöntemlerine ihtiyacınız olduğunda keras.Model miras alırsınız (ayrıntılar için Özel Keras katmanları ve modelleri bölümüne bakın).

keras.Model ( keras.layers.Layer yerine) tarafından sağlanan diğer bir özellik, değişkenleri izlemeye ek olarak, bir keras.Model iç katmanlarını da izleyerek incelemeyi kolaylaştırmasıdır.

Örneğin burada bir ResNet bloğu var:

class ResnetIdentityBlock(tf.keras.Model):
  def __init__(self, kernel_size, filters):
    super(ResnetIdentityBlock, self).__init__(name='')
    filters1, filters2, filters3 = filters

    self.conv2a = tf.keras.layers.Conv2D(filters1, (1, 1))
    self.bn2a = tf.keras.layers.BatchNormalization()

    self.conv2b = tf.keras.layers.Conv2D(filters2, kernel_size, padding='same')
    self.bn2b = tf.keras.layers.BatchNormalization()

    self.conv2c = tf.keras.layers.Conv2D(filters3, (1, 1))
    self.bn2c = tf.keras.layers.BatchNormalization()

  def call(self, input_tensor, training=False):
    x = self.conv2a(input_tensor)
    x = self.bn2a(x, training=training)
    x = tf.nn.relu(x)

    x = self.conv2b(x)
    x = self.bn2b(x, training=training)
    x = tf.nn.relu(x)

    x = self.conv2c(x)
    x = self.bn2c(x, training=training)

    x += input_tensor
    return tf.nn.relu(x)


block = ResnetIdentityBlock(1, [1, 2, 3])
_ = block(tf.zeros([1, 2, 3, 3]))
block.layers
[<keras.layers.convolutional.Conv2D at 0x7fc7e439bf90>,
 <keras.layers.normalization.batch_normalization.BatchNormalization at 0x7fc7dc1e5dd0>,
 <keras.layers.convolutional.Conv2D at 0x7fc7dc1a1cd0>,
 <keras.layers.normalization.batch_normalization.BatchNormalization at 0x7fc7dc12c490>,
 <keras.layers.convolutional.Conv2D at 0x7fc7dc12c8d0>,
 <keras.layers.normalization.batch_normalization.BatchNormalization at 0x7fc7dc12cf50>]
len(block.variables)
18
block.summary()
Model: ""
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             multiple                  4         
                                                                 
 batch_normalization (BatchN  multiple                 4         
 ormalization)                                                   
                                                                 
 conv2d_1 (Conv2D)           multiple                  4         
                                                                 
 batch_normalization_1 (Batc  multiple                 8         
 hNormalization)                                                 
                                                                 
 conv2d_2 (Conv2D)           multiple                  9         
                                                                 
 batch_normalization_2 (Batc  multiple                 12        
 hNormalization)                                                 
                                                                 
=================================================================
Total params: 41
Trainable params: 29
Non-trainable params: 12
_________________________________________________________________

Bununla birlikte, çoğu zaman, birçok katmandan oluşan modeller, yalnızca bir katmanı diğerinden sonra çağırır. Bu, tf.keras.Sequential kullanılarak çok az kodla yapılabilir:

my_seq = tf.keras.Sequential([tf.keras.layers.Conv2D(1, (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, 1)),
                             tf.keras.layers.BatchNormalization()])
my_seq(tf.zeros([1, 2, 3, 3]))
<tf.Tensor: shape=(1, 2, 3, 3), dtype=float32, numpy=
array([[[[0., 0., 0.],
         [0., 0., 0.],
         [0., 0., 0.]],

        [[0., 0., 0.],
         [0., 0., 0.],
         [0., 0., 0.]]]], dtype=float32)>
yer tutucu24 l10n-yer
my_seq.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d_3 (Conv2D)           (None, None, None, 1)     4         
                                                                 
 batch_normalization_3 (Batc  (None, None, None, 1)    4         
 hNormalization)                                                 
                                                                 
 conv2d_4 (Conv2D)           (None, None, None, 2)     4         
                                                                 
 batch_normalization_4 (Batc  (None, None, None, 2)    8         
 hNormalization)                                                 
                                                                 
 conv2d_5 (Conv2D)           (None, None, None, 3)     9         
                                                                 
 batch_normalization_5 (Batc  (None, None, None, 3)    12        
 hNormalization)                                                 
                                                                 
=================================================================
Total params: 41
Trainable params: 29
Non-trainable params: 12
_________________________________________________________________

Sonraki adımlar

Artık önceki not defterine geri dönebilir ve doğrusal regresyon örneğini daha iyi yapılandırılacak katmanları ve modelleri kullanacak şekilde uyarlayabilirsiniz.