tensorflow2 神经网络模型构建4种方法
這里寫目錄標題
- 學習目標:
- 學習內容:
- 1. 使用現有的預訓練模型
- 線下訓練,線上加載運行
- 線下訓練
- 線上加載
- 遷移學習
- 2.Keras Sequential模式建立模型(不推薦,靈活性太差)
- 3.Functional API 函數api建立模型(最常用,可構建復雜網絡)
- 4.tf構建模型Class
- 總結:
學習目標:
tensorflow2模型構建4種方法,掌握其優缺點。
順便:compile是TensorFlow2專門用來訓練模型的,很方便,避免了寫Gradenttape那種形式化結構,直觀明了,一定要掌握。
學習內容:
1、 使用現有的預訓練模型 2、 Keras Sequential模式建立模型(不推薦) 3、 Functional API 函數api建立模型(最常用,可構造復雜網絡) 4、tensorflow構建模型Class1. 使用現有的預訓練模型
使用現有模型有兩種
1、 一種是線下訓練,然后保存模型,線上加載運行。就是常規的模型部署
2、 使用別人訓練好共享出來的模型,加載到自己的業務場景中,適應性調整參數。這個過程美其名曰:遷移學習
線下訓練,線上加載運行
示例:我們線下訓練一個3層結構的全連接神經網絡,用來預測iris花的品種分類,然后保存訓練好的模型,格式為h5。然后線上部署時,把模型進行加載。
線下訓練
import tensorflow as tf import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_splitdata = load_iris() iris_data = np.float32(data.data) iris_target = (data.target) iris_target = np.float32(tf.keras.utils.to_categorical(iris_target,num_classes=3))x_train,x_test,y_train ,y_test = train_test_split(iris_data,iris_target,test_size=0.2,shuffle=True) # print(x_train) # print(y_train) train_data = tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(128) test_data = tf.data.Dataset.from_tensor_slices((x_test,y_test))input_xs = tf.keras.Input(shape=(4),name='input_xs') out = tf.keras.layers.Dense(32,activation='relu',name='dense_1')(input_xs) out = tf.keras.layers.Dense(64,activation='relu',name='dense_2')(out) logits = tf.keras.layers.Dense(3,activation='softmax',name='logits')(out) model = tf.keras.Model(inputs=input_xs,outputs = logits) opt = tf.keras.optimizers.Adam(1e-3) model.compile(optimizer=opt,loss=tf.keras.losses.categorical_crossentropy,metrics=['accuracy','mse']) model.fit(train_data,epochs=500) score = model.evaluate(x=x_test,y=y_test) print('last score:',score) model.save('./saver/the_save_models.h5')然后模型為./saver/the_save_models.h5。因此在線上部署時,我們需要把訓練好的模型加載回來。
線上加載
我們把訓練好的模型./saver/the_save_models.h5加載回來。
import tensorflow as tf import numpy as np from sklearn.datasets import load_irisdata = load_iris() iris_data = np.float32(data.data) iris_target = (data.target) iris_target = np.float32(tf.keras.utils.to_categorical(iris_target)) new_model = tf.keras.models.load_model('./saver/the_save_models.h5') new_prediction = new_model(iris_data)print(tf.argmax(new_prediction,axis=-1))遷移學習
keras.applications.vgg16.VGG16(include_top=True, weights='imagenet',input_tensor=None, input_shape=None,pooling=None,classes=1000)案例1:貓狗分類
或者:
2.Keras Sequential模式建立模型(不推薦,靈活性太差)
可以看到這里并沒有輸入x,沒法對中間計算到的變量,做一些個性化的操作。不靈活。
3.Functional API 函數api建立模型(最常用,可構建復雜網絡)
復雜情況包括:
- 多輸入模型–多個特征拼接
- 多輸出模型–多個預測結果
- 具有共享層的模型(同一層被調用多次)–電信的比如殘差網絡
- 具有非序列數據流的模型(例如,剩余連接)
這種方式就是各個層都是一個函數,有明確的輸入和輸出,可以對輸入和輸出進行個性化的操作后,送入下一層,也可以復用。
通過函數的疊加就可以實現,一般使用這種方法,將模型封裝成一個模型函數。
下面示例一個多個輸入(兩組特征值)多個輸出(兩組預測結果)的例子。
4.tf構建模型Class
也就是自定義層級結構,最靈活,當然靈活的代價是增加了代碼量,根據實際情況而定。如果Functional能滿足要求,不必非要自己構建class。
自定義層級的class,需要繼承父類Layers,TensorFlow2 自定義的層級需要實現3個函數init、buil、call。
- init --初始化所有參數,根須需要設定層中的參數,比如輸出的維度,卷積核數目和大小。
- buil(只有實現了此方法,才能用compile,否則,需要手寫Gradentape的繁瑣結構),對所有的可變參數進行定義
- call–模型的計算,全部放這里。
在書《TensorFlow 2.0 深度學習從零開始學》第98頁寫到。
這里明確一下,自定義層,class的初始化參數,是給到init中,后面的input,形狀是給到input_shape,張量是給到input_tensor。
比如Mylayer(32)(x),其中,32賦值給init函數的變量,而x.shape賦值給input_shape,而x賦值給了input_tensor。
例子:以下代碼自定義了一個卷積(conv)層預測MNIST手寫集。代碼稍微有點復雜。需要耐心
import numpy as np import tensorflow as tf mnist = tf.keras.datasets.mnist (x_train,y_train),(x_test,y_test) = mnist.load_data() x_train,x_test = x_train/255.0,x_test/255.0 x_train = tf.expand_dims(x_train,-1) y_train = np.float32(tf.keras.utils.to_categorical(y_train,num_classes=10)) x_test = tf.expand_dims(x_test,-1) y_test = np.float32(tf.keras.utils.to_categorical(y_test,num_classes=10)) batch_size = 512 train_dataset = tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(batch_size).shuffle(batch_size*10) test_dataset = tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(batch_size).shuffle(batch_size*10)#自定義層 class MyLayer(tf.keras.layers.Layer):def __init__(self,kernel_size,filter):self.filter = filterself.kernel_size = kernel_sizesuper(MyLayer,self).__init__()def build(self,input_shape):self.weight = tf.Variable(tf.random.normal([self.kernel_size,self.kernel_size,input_shape[-1],self.filter]))self.bias = tf.Variable(tf.random.normal([self.filter]))super(MyLayer,self).build(input_shape) # Be sure to call this somewhere !def call(self,input_tensor):conv = tf.nn.conv2d(input_tensor,self.weight,strides=[1,2,2,1],padding='SAME')conv = tf.nn.bias_add(conv,self.bias)out = tf.nn.relu(conv) + conv # 此處為殘差神經網絡的構造return out input_xs = tf.keras.Input(shape=[28,28,1]) conv = tf.keras.layers.Conv2D(32,3,padding="SAME",activation='relu')(input_xs) # 使用自定義層 conv = MyLayer(32,3)(conv) conv = tf.keras.layers.BatchNormalization()(conv) conv = tf.keras.layers.Conv2D(64,3,padding="SAME",activation='relu')(conv) conv = tf.keras.layers.MaxPooling2D(strides=[2,2])(conv) conv = tf.keras.layers.Dropout(0.2)(conv) conv = tf.keras.layers.Conv2D(128,3,padding='SAME',activation='relu')(conv) flat = tf.keras.layers.Flatten()(conv) dense = tf.keras.layers.Dense(512,activation='relu')(flat) logits = tf.keras.layers.Dense(10,activation='softmax')(dense) model = tf.keras.Model(inputs = input_xs,outputs = logits) print(model.summary()) model.compile(optimizer=tf.keras.optimizers.Adam(1e-3),loss=tf.keras.losses.categorical_crossentropy,metrics=['accuracy','mse']) model.fit(train_dataset,epochs=10) score = model.evaluate(test_dataset) print('score is :',score) model.save('./saver/mymodel.h5')運行結果:
總結:
重點掌握:
- 1.使用Functional的方式定義模型
- 2.使用compile的方式定義模型的優化更新
總結
以上是生活随笔為你收集整理的tensorflow2 神经网络模型构建4种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里DIN模型(深度兴趣网络)详解及理解
- 下一篇: tf.nn.dropout和tf.ker