【機器學習煉丹術】的煉丹總羣已經快滿了,要加入的快聯繫煉丹兄WX:cyx645016617python
參考目錄:
算法
以前講過了如何用tensorflow構建數據集,而後這一節課講解如何用Tensorflow2.0來建立模型。網絡
TF2.0中建立模型的API基本上都放到了它的Keras中了,Keras能夠理解爲TF的高級API,裏面封裝了不少的常見網絡層、常見損失函數等。 後續會詳細介紹keras的全面功能,本篇文章講解如何構建模型。dom
import tensorflow as tf import tensorflow.keras as keras class MyLayer(keras.layers.Layer): def __init__(self, input_dim=32, output_dim=32): super(MyLayer, self).__init__() w_init = tf.random_normal_initializer() self.weight = tf.Variable( initial_value=w_init(shape=(input_dim, output_dim), dtype=tf.float32), trainable=True) # 若是是false則是不參與梯度降低的變量 b_init = tf.zeros_initializer() self.bias = tf.Variable(initial_value=b_init( shape=(output_dim), dtype=tf.float32), trainable=True) def call(self, inputs): return tf.matmul(inputs, self.weight) + self.bias x = tf.ones((3,5)) my_layer = MyLayer(input_dim=5, output_dim=10) out = my_layer(x) print(out.shape) >>> (3, 10)
這個就是定義了一個TF的網絡層,其實能夠看出來和PyTorch定義的方式很是的相似:機器學習
tf.keras.layers.Layer
,這個pytorch中要繼承torch.nn.Module
相似;__def__
中定義,和pytorch的模型類相同;call()
和pytorch中的forward()
的相似。上面代碼中實現的是一個全鏈接層的定義,其中能夠看到使用tf.random_normal_initializer()
來做爲參數的初始化器,而後用tf.Variable
來產生網絡層中的權重變量,經過trainable=True
這個參數說明這個權重變量是一個參與梯度降低的能夠訓練的變量。ide
我經過tf.ones((3,5))
產生一個shape爲[3,5]的一個全是1的張量,這裏面第一維度的3表示有3個樣本,第二維度的5就是表示要放入全鏈接層的數據(全鏈接層的輸入是5個神經元);而後設置的全鏈接層的輸出神經元數量是10,因此最後的輸出是(3,10)。函數
import tensorflow as tf import tensorflow.keras as keras class CBR(keras.layers.Layer): def __init__(self,output_dim): super(CBR,self).__init__() self.conv = keras.layers.Conv2D(filters=output_dim, kernel_size=4, padding='same', strides=1) self.bn = keras.layers.BatchNormalization(axis=3) self.ReLU = keras.layers.ReLU() def call(self, inputs): inputs = self.conv(inputs) inputs = self.ReLU(self.bn(inputs)) return inputs class MyNet(keras.Model): def __init__ (self,input_dim=3): super(MyNet,self).__init__() self.cbr1 = CBR(16) self.maxpool1 = keras.layers.MaxPool2D(pool_size=(2,2)) self.cbr2 = CBR(32) self.maxpool2 = keras.layers.MaxPool2D(pool_size=(2,2)) def call(self, inputs): inputs = self.maxpool1(self.cbr1(inputs)) inputs = self.maxpool2(self.cbr2(inputs)) return inputs model = MyNet(3) data = tf.random.normal((16,224,224,3)) output = model(data) print(output.shape) >>> (16, 56, 56, 32)
這個是構建了一個很是簡單的卷積網絡,結構是常見的:卷積層+BN層+ReLU層。能夠發現這裏繼承的一個tf.keras.Model
這個類。學習
Model比Layer的功能更多,反過來講,Layer的功能更精簡專注。lua
.fit()
,.evaluate()
,.predict()
等方法來快速訓練。保存和加載模型也是在Model這個級別進行的。如今說一說上面的代碼和pytorch中的區別,做爲一個對比學習、也做爲一個對pytorch的回顧:spa
filters
就是卷積後的輸出特徵圖的通道數;而PyTorch的卷積層是須要輸入兩個通道數的參數,一個是輸入特徵圖的通道數,一個是輸出特徵圖的通道數;keras.layers.BatchNormalization(axis=3)
是BN層,這裏的axis=3說明第三個維度(從0開始計數)是通道數,是須要做爲批歸一化的維度(這個瞭解BN算法的朋友應該能夠理解吧,不瞭解的話去從新看我以前剖析BN層算法的那個文章吧,在文章末尾有相關連接)。pytorch的圖像的四個維度是:而tensorflow是:
總之,學了pytorch以後,再看keras的話,對照的keras的API,不少東西都直接就會了,二者的API愈來愈類似了。
上面最後輸出是(16, 56, 56, 32)
,輸入的是\(224\times 224\)的維度,而後通過兩個最大池化層,就變成了\(56\times 56\)了。
到此爲止,咱們如今應該是能夠用keras來構建模型了。