国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

TensorFlow 幫你實現更好的結構化圖層和模型

Tamic / 722人閱讀

摘要:層常用的操作集大多數情況下,在編寫機器學習模型代碼時,您希望在比單個操作和操作單個變量更高的抽象級別上進行操作。模型組合層機器學習模型中許多有趣的類層事物都是通過組合現有的層來實現的。

今天主要向大家介紹的內容是:自定義層。

我們建議使用 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

相關文章

  • 遷移學習

    摘要:由于它能用較少的數據訓練深度神經網絡,這使得目前它在深度學習領域非常流行。這種類型的遷移學習在深度學習中最為常用。特征提取另一種方法是使用深度學習找出表述問題的最佳形式,這意味著要找到最重要的特征。 摘要: 到底是遷移學習?什么時候使用它?如何使用它? 所謂遷移學習是指針對新問題重新使用預先訓練的模型。由于它能用較少的數據訓練深度神經網絡,這使得目前它在深度學習領域非常流行。通過這篇文...

    darcrand 評論0 收藏0

發表評論

0條評論

Tamic

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<