摘要:層常用的操作集大多數(shù)情況下,在編寫機(jī)器學(xué)習(xí)模型代碼時(shí),您希望在比單個(gè)操作和操作單個(gè)變量更高的抽象級(jí)別上進(jìn)行操作。模型組合層機(jī)器學(xué)習(xí)模型中許多有趣的類層事物都是通過組合現(xiàn)有的層來實(shí)現(xiàn)的。
今天主要向大家介紹的內(nèi)容是:自定義層。
我們建議使用 tf.keras 作為構(gòu)建神經(jīng)網(wǎng)絡(luò)的高級(jí) API。也就是說,大多數(shù) TensorFlow API 都可以通過 eager execution(即時(shí)執(zhí)行)來使用。
import tensorflow as tf
tf.enable_eager_execution()
層:常用的操作集
大多數(shù)情況下,在編寫機(jī)器學(xué)習(xí)模型代碼時(shí),您希望在比單個(gè)操作和操作單個(gè)變量更高的抽象級(jí)別上進(jìn)行操作。
許多機(jī)器學(xué)習(xí)模型可以表達(dá)為相對(duì)簡(jiǎn)單的層的組合和堆疊,TensorFlow 提供了一組常見層作為一種簡(jiǎn)單的方法,您可以從頭編寫自己的特定于應(yīng)用程序的層,或者將其作為現(xiàn)有層的組合。
TensorFlow 在 tf.keras 包中封裝了完整的 Keras API,并在構(gòu)建模型時(shí) Keras 層和 Keras 包發(fā)揮著巨大的作用。
# 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(批處理標(biāo)準(zhǔn)化),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
(,
?)
實(shí)現(xiàn)自定義層
實(shí)現(xiàn)自定義層的較佳方法是擴(kuò)展 tf.keras.Layer 類并實(shí)現(xiàn):* __init__,您可以在其中執(zhí)行所有與輸入無關(guān)的初始化 * build,您可以在其中了解輸入張量的形狀,并可以執(zhí)行其余的初始化 * call,以及在此進(jìn)行正演計(jì)算。
請(qǐng)注意,您不必等到調(diào)用 build 來創(chuàng)建變量,您還可以在 __init__ 中創(chuàng)建變量。然而,在 build 中創(chuàng)建變量的優(yōu)勢(shì)在于它使后期的變量創(chuàng)建基于層將要操作的輸入的形狀。另一方面,在 __init__ 中創(chuàng)建變量意味著需要明確指定創(chuàng)建變量所需的形狀。
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)>] 請(qǐng)注意,您不必等到調(diào)用 build 來創(chuàng)建變量,您還可以在 __init__ 中創(chuàng)建變量。 盡可能使用標(biāo)準(zhǔn)層,則整體代碼更易于閱讀和維護(hù),其他讀者也將熟悉標(biāo)準(zhǔn)層的行為。如果你想使用 tf.keras.layers 或 tf.contrib.layers 中不存在的圖層,請(qǐng)考慮提交一份 github 問題,或者更好的是,你可以提交一個(gè) pull 請(qǐng)求。 模型:組合層 機(jī)器學(xué)習(xí)模型中許多有趣的類層事物都是通過組合現(xiàn)有的層來實(shí)現(xiàn)的。例如,resnet 中的每個(gè)剩余塊都是卷積、批處理規(guī)范化和快捷方式的組合。 在創(chuàng)建包含其他圖層的類似圖層時(shí)使用的主類是 tf.keras.Model。其實(shí)現(xiàn)是通過繼承 tf.keras.Model 來實(shí)現(xiàn)的。 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"] 然而,很多時(shí)候,由許多層組成的模型只是簡(jiǎn)單地調(diào)用一個(gè)接一個(gè)的層。這可以使用 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])) 下一步 現(xiàn)在,您可以回到之前的筆記并調(diào)整線性回歸示例,以使用更好的結(jié)構(gòu)化圖層和模型。 聲明:文章收集于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系小編及時(shí)處理,謝謝!
商業(yè)智能與數(shù)據(jù)分析群
興趣范圍包括各種讓數(shù)據(jù)產(chǎn)生價(jià)值的辦法,實(shí)際應(yīng)用案例分享與討論,分析工具,ETL工具,數(shù)據(jù)倉(cāng)庫(kù),數(shù)據(jù)挖掘工具,報(bào)表系統(tǒng)等全方位知識(shí)
QQ群:81035754
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/4856.html
摘要:由于它能用較少的數(shù)據(jù)訓(xùn)練深度神經(jīng)網(wǎng)絡(luò),這使得目前它在深度學(xué)習(xí)領(lǐng)域非常流行。這種類型的遷移學(xué)習(xí)在深度學(xué)習(xí)中最為常用。特征提取另一種方法是使用深度學(xué)習(xí)找出表述問題的最佳形式,這意味著要找到最重要的特征。 摘要: 到底是遷移學(xué)習(xí)?什么時(shí)候使用它?如何使用它? 所謂遷移學(xué)習(xí)是指針對(duì)新問題重新使用預(yù)先訓(xùn)練的模型。由于它能用較少的數(shù)據(jù)訓(xùn)練深度神經(jīng)網(wǎng)絡(luò),這使得目前它在深度學(xué)習(xí)領(lǐng)域非常流行。通過這篇文...
閱讀 674·2021-11-15 11:37
閱讀 4129·2021-09-09 09:34
閱讀 3570·2019-08-30 15:52
閱讀 2608·2019-08-29 14:03
閱讀 2850·2019-08-26 13:36
閱讀 1592·2019-08-26 12:16
閱讀 1600·2019-08-26 11:45
閱讀 3491·2019-08-23 18:41