国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

tensorflow之自定義神經網絡層實例

2020-02-15 21:19:35
字體:
來源:轉載
供稿:網友

如下所示:

import tensorflow as tftfe = tf.contrib.eagertf.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])            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 易门县| 新民市| 夏邑县| 海兴县| 汉阴县| 会东县| 博兴县| 竹北市| 宁德市| 自治县| 句容市| 阿拉尔市| 保康县| 托克逊县| 海口市| 乐平市| 蚌埠市| 介休市| 水城县| 新沂市| 鸡泽县| 平塘县| 平陆县| 汉沽区| 正定县| 电白县| 鄂托克旗| 马龙县| 响水县| 永德县| 镇远县| 邢台县| 毕节市| 旺苍县| 永平县| 义乌市| 泾阳县| 清原| 集贤县| 枣强县| 易门县|