import tensorflow as tf
tfe = tf.contrib.eager
tf.enable_eager_execution()

大多数情况下,在为机器学习模型编写代码时,您希望在比单个操作和单个变量操作更高的抽象级别上操作。

1.关于图层的一些有用操作

许多机器学习模型可以表达为相对简单的图层的组合和堆叠,TensorFlow提供了一组许多常用图层,以及您从头开始或作为组合创建自己的应用程序特定图层的简单方法。TensorFlow在tf.keras包中包含完整的Keras API,而Keras层在构建自己的模型时非常有用。

#在tf.keras.layers包中,图层是对象。要构造一个图层,只需构造一个对象。大多数层将输出维度/通道的数量作为第一个参数。

layer=tf.keras.layers.Dense(100)

#输入维度的数量通常是不必要的,因为它可以在第一次使用图层时推断出来,但如果您想手动指定它,则可以提供它,这在某些复杂模型中很有用。

layer=tf.keras.layers.Dense(10,input_shape=(None,5))

#调用层

layer(tf.zeros([10,5]))
 

 

#图层有许多有用的方法。例如,您可以通过调用layer.variables来检查图层中的所有变量。在这种情况下,完全连接的层将具有权重和偏差的变量。

variable=layer.variables

# variable[0]

layer.kernel.numpy()

layer.bias
 

2.自定义图层

实现自己的层的最佳方法是扩展tf.keras.Layer类并实现:

  • __init__,您可以在其中执行所有与输入无关的初始化
  • build方法,您知道输入张量的形状,并可以进行其余的初始化
  • call方法,在这里进行正向传播计算

请注意,您不必等到调用build来创建变量,您也可以在__init__中创建它们。但是,在build中创建它们的优点是它可以根据图层将要操作的输入的形状启用后期变量创建。另一方面,在__init__中创建变量意味着需要明确指定创建变量所需的形状。

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_variable("kernel",

shape=[input_shape[-1].value,

self.num_outputs])



def call(self, input):

return tf.matmul(input, self.kernel)



layer = MyDenseLayer(10)

print(layer(tf.zeros([10, 5])))

print(layer.variables)

3.搭建网络结构

机器学习模型中许多有趣的图层是通过组合现有层来实现的。例如,resnet中的每个residual块是卷积,批量标准化等的组合。

创建包含其他图层的类似图层的东西时使用的主类是tf.keras.Model。实现一个是通过继承自tf.keras.Model完成的。

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])

print(block(tf.zeros([1, 2, 3, 3])))

print([x.name for x in block.variables])
内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!