摘要:層常用的操作集大多數情況下,在編寫機器學習模型代碼時,您希望在比單個操作和操作單個變量更高的抽象級別上進行操作。模型組合層機器學習模型中許多有趣的類層事物都是通過組合現有的層來實現的。
今天主要向大家介紹的內容是:自定義層。
我們建議使用 tf.keras 作為構建神經網絡的高級 API。也就是說,大多數 TensorFlow API 都可以通過 eager execution(即時執行)來使用。
import tensorflow as tf
tf.enable_eager_execution()
層:常用的操作集
大多數情況下,在編寫機器學習模型代碼時,您希望在比單個操作和操作單個變量更高的抽象級別上進行操作。
許多機器學習模型可以表達為相對簡單的層的組合和堆疊,TensorFlow 提供了一組常見層作為一種簡單的方法,您可以從頭編寫自己的特定于應用程序的層,或者將其作為現有層的組合。
TensorFlow 在 tf.keras 包中封裝了完整的 Keras API,并在構建模型時 Keras 層和 Keras 包發揮著巨大的作用。
# 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))
可以在文檔中看到已存在層的完整列表。它包括 Dense(完全連接層),Conv2D,LSTM,BatchNormalization(批處理標準化),Dropout 等等。
# To use a layer, simply call it.
layer(tf.zeros([10, 5]))
# Layers have many useful methods. For example, you can inspect all variables
# in a layer by calling layer.variables. In this case a fully-connected layer
# will have variables for weights and biases.
layer.variables
[,
?]
# The variables are also accessible through nice accessors
layer.kernel, layer.bias
(,
?)
實現自定義層
實現自定義層的較佳方法是擴展 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=[int(input_shape[-1]),?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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)
tf.Tensor(
[[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.]], shape=(10, 10), dtype=float32)
[ array([[ 0.2774077 , -0.0018627 , ?0.35655916, ?0.5582008 , ?0.17234564, ? ? ? ? -0.15487313, -0.417266 ?, -0.50856596, -0.5074028 , ?0.01600116], ? ? ? ?[ 0.534511 ?, -0.4714492 , -0.23187858, ?0.53936654, ?0.53503364, ? ? ? ? -0.617422 ?, -0.6192259 , ?0.29145825, ?0.0223884 , -0.5270795 ], ? ? ? ?[-0.2874091 , ?0.16588253, ?0.0788359 , -0.1317451 , ?0.2750584 , ? ? ? ? -0.5630307 , -0.07108849, -0.38031346, -0.30722007, -0.5128627 ], ? ? ? ?[-0.5630339 , -0.4541433 , -0.3941666 , -0.26502702, ?0.10295987, ? ? ? ? -0.41846734, -0.18145484, ?0.28857005, ?0.0117566 , ?0.10138774], ? ? ? ?[ 0.5869536 , -0.35585892, -0.32530165, ?0.52835554, -0.29882053, ? ? ? ? -0.26029676, -0.2692049 , -0.2949 ? ?, ?0.13486022, -0.40910304]], ? ? ? dtype=float32)>] 請注意,您不必等到調用 build 來創建變量,您還可以在 __init__ 中創建變量。 盡可能使用標準層,則整體代碼更易于閱讀和維護,其他讀者也將熟悉標準層的行為。如果你想使用 tf.keras.layers 或 tf.contrib.layers 中不存在的圖層,請考慮提交一份 github 問題,或者更好的是,你可以提交一個 pull 請求。 模型:組合層 機器學習模型中許多有趣的類層事物都是通過組合現有的層來實現的。例如,resnet 中的每個剩余塊都是卷積、批處理規范化和快捷方式的組合。 在創建包含其他圖層的類似圖層時使用的主類是 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]) tf.Tensor( [[[[0. 0. 0.] ? ?[0. 0. 0.] ? ?[0. 0. 0.]] ? ? [[0. 0. 0.] ? ?[0. 0. 0.] ? ?[0. 0. 0.]]]], shape=(1, 2, 3, 3), dtype=float32) ["resnet_identity_block/conv2d/kernel:0", "resnet_identity_block/conv2d/bias:0", "resnet_identity_block/batch_normalization/gamma:0", "resnet_identity_block/batch_normalization/beta:0", "resnet_identity_block/conv2d_1/kernel:0", "resnet_identity_block/conv2d_1/bias:0", "resnet_identity_block/batch_normalization_1/gamma:0", "resnet_identity_block/batch_normalization_1/beta:0", "resnet_identity_block/conv2d_2/kernel:0", "resnet_identity_block/conv2d_2/bias:0", "resnet_identity_block/batch_normalization_2/gamma:0", "resnet_identity_block/batch_normalization_2/beta:0", "resnet_identity_block/batch_normalization/moving_mean:0", "resnet_identity_block/batch_normalization/moving_variance:0", "resnet_identity_block/batch_normalization_1/moving_mean:0", "resnet_identity_block/batch_normalization_1/moving_variance:0", "resnet_identity_block/batch_normalization_2/moving_mean:0", "resnet_identity_block/batch_normalization_2/moving_variance:0"] 然而,很多時候,由許多層組成的模型只是簡單地調用一個接一個的層。這可以使用 tf.keras.Sequential 在非常少的代碼中完成。 my_seq = tf.keras.Sequential([tf.keras.layers.Conv2D(1, (1, 1)), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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])) 下一步 現在,您可以回到之前的筆記并調整線性回歸示例,以使用更好的結構化圖層和模型。 聲明:文章收集于網絡,如有侵權,請聯系小編及時處理,謝謝!
商業智能與數據分析群
興趣范圍包括各種讓數據產生價值的辦法,實際應用案例分享與討論,分析工具,ETL工具,數據倉庫,數據挖掘工具,報表系統等全方位知識
QQ群:81035754
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/4856.html
閱讀 665·2021-11-15 11:37
閱讀 4105·2021-09-09 09:34
閱讀 3558·2019-08-30 15:52
閱讀 2601·2019-08-29 14:03
閱讀 2841·2019-08-26 13:36
閱讀 1586·2019-08-26 12:16
閱讀 1592·2019-08-26 11:45
閱讀 3487·2019-08-23 18:41