日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

4.6 TF常用功能模块

發布時間:2023/12/10 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 4.6 TF常用功能模块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

4.6 TF常用功能模塊

學習目標

  • 目標
    • 掌握Checkpoint使用
    • 掌握TensorBoard使用
    • 掌握data模塊使用
    • 掌握ImageDataGenerator的使用
  • 應用

4.6.1 fit的callbacks詳解

回調是在訓練過程的給定階段應用的一組函數。可以使用回調來獲取培訓期間內部狀態和模型統計信息的視圖。您可以將回調列表(作為關鍵字參數callbacks)傳遞給或類的fit()方法。然后將在訓練的每個階段調用回調的相關方法。

  • 定制化保存模型
  • 保存events文件

4.6.1.1 ModelCheckpoint

from tensorflow.python.keras.callbacks import ModelCheckpoint

  • keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', save_best_only=False, save_weights_only=False, mode='auto', period=1)
    • Save the model after every epoch:每隔多少次迭代保存模型
    • filepath: 保存模型字符串
      • 如果設置 weights.{epoch:02d}-{val_loss:.2f}.hdf5格式,將會每隔epoch number數量并且將驗證集的損失保存在該位置
      • 如果設置weights.{epoch:02d}-{val_acc:.2f}.hdf5,將會按照val_acc的值進行保存模型
    • monitor: quantity to monitor.設置為'val_acc'或者'val_loss'
    • save_best_only: if save_best_only=True, 只保留比上次模型更好的結果
    • save_weights_only: if True, 只保存去那種(model.save_weights(filepath)), else the full model is saved (model.save(filepath)).
    • mode: one of {auto, min, max}. 如果save_best_only=True, 對于val_acc, 要設置max, 對于val_loss要設置min
    • period: 迭代保存checkpoints的間隔
check = ModelCheckpoint('./ckpt/singlenn_{epoch:02d}-{val_acc:.2f}.h5',monitor='val_acc',save_best_only=True,save_weights_only=True,mode='auto',period=1)SingleNN.model.fit(self.train, self.train_label, epochs=5, callbacks=[check], validation_data=(x, y))

注意:

1、使用ModelCheckpoint一定要在fit當中指定驗證集才能使用,否則報錯誤。

2、其中val_acc還是val_accuracy需要在這里指定

model.compile(optimizer=tf.keras.optimizers.Adam(),loss=tf.keras.losses.sparse_categorical_crossentropy,metrics=['accuracy'])model.compile(optimizer=tf.keras.optimizers.Adam(),loss=tf.keras.losses.sparse_categorical_crossentropy,metrics=['acc'])

4.6.1.2 Tensorboard

  • 添加Tensorboard觀察損失等情況
  • keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=0, batch_size=32, write_graph=True, write_grads=False, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None, embeddings_data=None, update_freq='epoch')
    • log_dir:保存事件文件目錄
    • write_graph=True:是否顯示圖結構
    • write_images=False:是否顯示圖片
    • write_grads=True:是否顯示梯度histogram_freq?必須大于0
# 添加tensoboard觀察tensorboard = keras.callbacks.TensorBoard(log_dir='./graph', histogram_freq=1,write_graph=True, write_images=True)SingleNN.model.fit(self.train, self.train_label, epochs=5, callbacks=[tensorboard])
  • 打開終端查看:
# 指定存在文件的目錄,打開下面命令 tensorboard --logdir="./"

這是CNN mnist100案例中的效果:

  • 目的:貓狗圖片二分類任務為示例
    • 使用 tf.data 結合 tf.io 和 tf.image 建立Dataset 數據集
    • 數據集可取這里下載:https://www.floydhub.com/fastai/datasets/cats-vs-dogs
  • 步驟:
    • 1、數據集的獲取和構建
    • 2、模型構建和封裝
    • 3、訓練以及測試過程實現

1、數據集的獲取和構建

class CatOrDog(object):"""貓狗分類"""num_epochs = 1batch_size = 32learning_rate = 0.001# 訓練目錄train_cats_dir = '/root/cv_project/tf_example/cats_vs_dogs/train/cats/'train_dogs_dir = '/root/cv_project/tf_example/cats_vs_dogs/train/dogs/'# 驗證目錄test_cats_dir = '/root/cv_project/tf_example/cats_vs_dogs/valid/cats/'test_dogs_dir = '/root/cv_project/tf_example/cats_vs_dogs/valid/dogs/'def __init__(self):# 1、讀取訓練集的貓狗文件self.train_cat_filenames = tf.constant([CatOrDog.train_cats_dir + filenamefor filename in os.listdir(CatOrDog.train_cats_dir)])self.train_dog_filenames = tf.constant([CatOrDog.train_dogs_dir + filenamefor filename in os.listdir(CatOrDog.train_dogs_dir)])# 2、貓狗文件列表合并,并且初始化貓狗的目標值,0為貓,1為狗self.train_filenames = tf.concat([self.train_cat_filenames, self.train_dog_filenames], axis=-1)self.train_labels = tf.concat([tf.zeros(self.train_cat_filenames.shape, dtype=tf.int32),tf.ones(self.train_dog_filenames.shape, dtype=tf.int32)],axis=-1)

定義數據的獲取方法,通過tf.data指定

def get_batch(self):"""獲取dataset批次數據:return:"""train_dataset = tf.data.Dataset.from_tensor_slices((self.train_filenames, self.train_labels))# 進行數據的map, 隨機,批次和預存儲train_dataset = train_dataset.map(map_func=_decode_and_resize,num_parallel_calls=tf.data.experimental.AUTOTUNE)train_dataset = train_dataset.shuffle(buffer_size=20000)train_dataset = train_dataset.batch(CatOrDog.batch_size)train_dataset = train_dataset.prefetch(tf.data.experimental.AUTOTUNE)return train_dataset# 圖片處理函數,讀取,解碼并且進行輸入形狀修改 def _decode_and_resize(filename, label):image_string = tf.io.read_file(filename)image_decoded = tf.image.decode_jpeg(image_string)image_resized = tf.image.resize(image_decoded, [256, 256]) / 255.0return image_resized, label

2、模型構建和封裝

通過構造兩層卷積+兩個全連接層的網絡

self.model = tf.keras.Sequential([tf.keras.layers.Conv2D(32, 3, activation='relu', input_shape=(256, 256, 3)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(32, 5, activation='relu'),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Flatten(),tf.keras.layers.Dense(64, activation='relu'),tf.keras.layers.Dense(2, activation='softmax')])

3、訓練以及測試過程實現

模型訓練過程,這里就免去指定ckpt以及tensorboard的callbacks了,可以自己去指定實驗

def train(self, train_dataset):"""訓練過程:return:"""self.model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=CatOrDog.learning_rate),loss=tf.keras.losses.sparse_categorical_crossentropy,metrics=[tf.keras.metrics.sparse_categorical_accuracy])self.model.fit(train_dataset, epochs=CatOrDog.num_epochs)self.model.save_weights("./ckpt/cat_or_dogs.h5")

測試過程

  • 1、需要提供一個讀取測試數據及的dataset數據集
  • 2、進行model的預測,可以先進行模型保存之后,再次讀取進行預測
def test(self):# 1、構建測試數據集test_cat_filenames = tf.constant([CatOrDog.test_cats_dir + filenamefor filename in os.listdir(CatOrDog.test_cats_dir)])test_dog_filenames = tf.constant([CatOrDog.test_dogs_dir + filenamefor filename in os.listdir(CatOrDog.test_dogs_dir)])test_filenames = tf.concat([test_cat_filenames, test_dog_filenames], axis=-1)test_labels = tf.concat([tf.zeros(test_cat_filenames.shape, dtype=tf.int32),tf.ones(test_dog_filenames.shape, dtype=tf.int32)],axis=-1)# 2、構建datasettest_dataset = tf.data.Dataset.from_tensor_slices((test_filenames, test_labels))test_dataset = test_dataset.map(_decode_and_resize)test_dataset = test_dataset.batch(batch_size)# 3、加載模型進行評估if os.path.exists("./ckpt/cat_or_dogs.h5"):self.model.load_weights("./ckpt/cat_or_dogs.h5")print(self.model.metrics_names)print(self.model.evaluate(test_dataset))

4.6.6 ImageDataGenerator介紹

當我們需要做數據增強的時候,我們需要通過實時數據增強生成張量圖像數據批次。數據將不斷循環(按批次)。下面就介紹一個強大的工具,能夠對于提供過來的本地圖片讀取的數據還是其他工具讀取的圖片數據進行在線數據怎強。

1、訓練的時候讀取本地圖片以及類別

tf.keras.preprocessing.image.ImageDataGenerator(featurewise_center=False, samplewise_center=False,featurewise_std_normalization=False, samplewise_std_normalization=False,zca_whitening=False, zca_epsilon=1e-06, rotation_range=0, width_shift_range=0.0,height_shift_range=0.0, brightness_range=None, shear_range=0.0, zoom_range=0.0,channel_shift_range=0.0, fill_mode='nearest', cval=0.0, horizontal_flip=False,vertical_flip=False, rescale=None, preprocessing_function=None,data_format=None, validation_split=0.0, dtype=None )
  • 完整參數介紹參考TensorFlow官網文檔:https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator#view-aliases

  • train_generator = ImageDataGenerator()

    • 生產圖片的批次張量值并且提供數據增強功能
    • rescale=1.0 / 255,:標準化
    • zca_whitening=False: # zca白化的作用是針對圖片進行PCA降維操作,減少圖片的冗余信息
    • rotation_range=20:默認0, 旋轉角度,在這個角度范圍隨機生成一個值
    • width_shift_range=0.2,:默認0,水平平移
    • height_shift_range=0.2:默認0, 垂直平移
    • shear_range=0.2:# 平移變換
    • horizontal_flip=True:水平翻轉
    • zoom_range:隨機縮放的范圍

2、使用方法介紹

  • 使用flow(x, y, batch_size)
(x_train, y_train), (x_test, y_test) = cifar10.load_data()datagen = ImageDataGenerator(featurewise_center=True,featurewise_std_normalization=True,rotation_range=20,width_shift_range=0.2,height_shift_range=0.2,horizontal_flip=True)for e in range(epochs):print('Epoch', e)batches = 0for x_batch, y_batch in datagen.flow(x_train, y_train, batch_size=32):model.fit(x_batch, y_batch)
  • 使用train_generator.flow_from_directory(

    • directory=path,# 讀取目錄

    • target_size=(h,w),# 目標形狀

    • batch_size=size,# 批數量大小

    • class_mode='binary', # 目標值格式,One of "categorical", "binary", "sparse",

      • "categorical" :2D one-hot encoded labels
      • "binary" will be 1D binary labels
    • shuffle=True

    • 這個API固定了讀取的目錄格式,參考:

    • data/train/dogs/dog001.jpgdog002.jpg...cats/cat001.jpgcat002.jpg...validation/dogs/dog001.jpgdog002.jpg...cats/cat001.jpgcat002.jpg...

4.6.7 案例:ImageDataGenerator與遷移學習結合(基于VGG)

4.6.7.1 案例效果

??正在上傳…重新上傳取消

Epoch 1/21/13 [=>............................] - ETA: 3:20 - loss: 1.6811 - acc: 0.15622/13 [===>..........................] - ETA: 3:01 - loss: 1.5769 - acc: 0.25003/13 [=====>........................] - ETA: 2:44 - loss: 1.4728 - acc: 0.39584/13 [========>.....................] - ETA: 2:27 - loss: 1.3843 - acc: 0.45315/13 [==========>...................] - ETA: 2:14 - loss: 1.3045 - acc: 0.49386/13 [============>.................] - ETA: 1:58 - loss: 1.2557 - acc: 0.51567/13 [===============>..............] - ETA: 1:33 - loss: 1.1790 - acc: 0.57598/13 [=================>............] - ETA: 1:18 - loss: 1.1153 - acc: 0.62119/13 [===================>..........] - ETA: 1:02 - loss: 1.0567 - acc: 0.6562 10/13 [======================>.......] - ETA: 46s - loss: 1.0043 - acc: 0.6875 11/13 [========================>.....] - ETA: 31s - loss: 0.9580 - acc: 0.7159 12/13 [==========================>...] - ETA: 15s - loss: 0.9146 - acc: 0.7344 13/13 [==============================] - 249s 19s/step - loss: 0.8743 - acc: 0.7519 - val_loss: 0.3906 - val_acc: 0.9000 Epoch 2/21/13 [=>............................] - ETA: 2:56 - loss: 0.3862 - acc: 1.00002/13 [===>..........................] - ETA: 2:44 - loss: 0.3019 - acc: 1.00003/13 [=====>........................] - ETA: 2:35 - loss: 0.2613 - acc: 1.00004/13 [========>.....................] - ETA: 2:01 - loss: 0.2419 - acc: 0.98445/13 [==========>...................] - ETA: 1:49 - loss: 0.2644 - acc: 0.96886/13 [============>.................] - ETA: 1:36 - loss: 0.2494 - acc: 0.96887/13 [===============>..............] - ETA: 1:24 - loss: 0.2362 - acc: 0.97328/13 [=================>............] - ETA: 1:10 - loss: 0.2234 - acc: 0.97669/13 [===================>..........] - ETA: 58s - loss: 0.2154 - acc: 0.9757 10/13 [======================>.......] - ETA: 44s - loss: 0.2062 - acc: 0.9781 11/13 [========================>.....] - ETA: 29s - loss: 0.2007 - acc: 0.9801 12/13 [==========================>...] - ETA: 14s - loss: 0.1990 - acc: 0.979213/13 [==============================] - 243s 19s/step - loss: 0.1923 - acc: 0.9809 - val_loss: 0.1929 - val_acc: 0.9300

4.6.7.2 數據集以及遷移需求

數據集是某場景下5個類別圖片的識別

?

我們利用現有的VGG模型去進行微調

4.6.7.3 思路和步驟

  • 讀取本地的圖片數據以及類別
    • keras.preprocessing.image import ImageDataGenerator提供了讀取轉換功能
  • 模型的結構修改(添加我們自定的分類層)
  • freeze掉原始VGG模型
  • 編譯以及訓練和保存模型方式
  • 輸入數據進行預測

4.6.7.4 訓練的時候讀取本地圖片以及類別

  • 基于上面工具的讀取代碼
train_datagen = ImageDataGenerator(rescale=1./255,shear_range=0.2,zoom_range=0.2,horizontal_flip=True)test_datagen = ImageDataGenerator(rescale=1./255)train_generator = train_datagen.flow_from_directory('data/train',target_size=(150, 150),batch_size=32,class_mode='binary')validation_generator = test_datagen.flow_from_directory('data/validation',target_size=(150, 150),batch_size=32,class_mode='binary') # 使用fit_generator model.fit_generator( train_generator, steps_per_epoch=2000, epochs=50, validation_data=validation_generator, validation_steps=800)

代碼:

首先導入包

import tensorflow as tf from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.applications.vgg16 import VGG16 import numpy as np import os os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"

我們定義一個遷移學習的類,然后進行相關屬性設置和讀取代碼

class TransferModel(object):def __init__(self):# 定義訓練和測試圖片的變化方法,標準化以及數據增強self.train_generator = ImageDataGenerator(rescale=1.0 / 255.0,shear_range=0.2,zoom_range=0.2,horizontal_flip=True)self.test_generator = ImageDataGenerator(rescale=1.0 / 255.0)# 指定訓練數據和測試數據的目錄self.train_dir = "./data/train"self.test_dir = "./data/test"# 定義圖片訓練相關網絡參數self.image_size = (224, 224)self.batch_size = 32def read_img_to_generator(self):"""讀取本地圖片以及類別:return:訓練數據和測試數據迭代器"""train_gen = self.train_generator.flow_from_directory(directory=self.train_dir,target_size=self.model_size,batch_size=self.batch_size,class_mode='binary',shuffle=True)test_gen = self.test_generator.flow_from_directory(directory=self.test_dir,target_size=self.model_size,batch_size=self.batch_size,class_mode='binary',shuffle=True)return train_gen, test_gen

打印結果為

<keras_preprocessing.image.DirectoryIterator object at 0x12f52cf28>

4.6.7.5 VGG模型的修改添加全連接層-GlobalAveragePooling2D

  • notop模型:
    • 是否包含最后的3個全連接層(whether to include the 3 fully-connected layers at the top of the network)。用來做fine-tuning專用,專門開源了這類模型。

‘weights='imagenet'’,意思是VGG在imagenet比賽中預訓練的權重,使用resnet訓練

# 在__init__中添加 self.base_model = VGG16(weights='imagenet', include_top=False)

base_model會有相關屬性,模型的輸入結構:inputs,模型的輸出結構,我們修改需要得到已有VGG的輸入和自定義模型的輸出構建成一個新的模型。

模型源碼:

if include_top:# Classification blockx = layers.Flatten(name='flatten')(x)x = layers.Dense(4096, activation='relu', name='fc1')(x)x = layers.Dense(4096, activation='relu', name='fc2')(x)x = layers.Dense(classes, activation='softmax', name='predictions')(x)else:if pooling == 'avg':x = layers.GlobalAveragePooling2D()(x)elif pooling == 'max':x = layers.GlobalMaxPooling2D()(x)
  • 一個GlobalAveragePooling2D + 兩個全連接層
    • 在圖像分類任務中,模型經過最后CNN層后的尺寸為[bath_size, img_width, img_height, channels],通常的做法是:接一個flatten layer,將尺寸變為[batch_size, w?h?channels]再至少接一個FC layer,這樣做的最大問題是:模型參數多,且容易過擬合。
    • 利用pooling layer來替代最后的FC layer
    • ?

解釋如下:

from keras.layers import Dense, Input, Conv2D from keras.layers import MaxPooling2D, GlobalAveragePooling2Dx = Input(shape=[8, 8, 2048]) # 假定最后一層CNN的層輸出為(None, 8, 8, 2048) x = GlobalAveragePooling2D(name='avg_pool')(x) # shape=(?, 2048) # 取每一個特征圖的平均值作為輸出,用以替代全連接層 x = Dense(1000, activation='softmax', name='predictions')(x) # shape=(?, 1000) # 1000為類別
  • 5類圖片識別模型修改

我們需要拿到基礎VGG模型,并且VGG提供所有層參數訓練好的模型和沒有全連接層參數的模型notop模型

from tensorflow.keras import Model def refine_base_model(self):"""微調VGG結構,5blocks后面+全局平均池化(減少遷移學習的參數數量)+兩個全連接層:return:"""# 1、獲取原notop模型得出# [?, ?, ?, 512]x = self.base_model.outputs[0]# 2、在輸出后面增加我們結構# [?, ?, ?, 512]---->[?, 1 * 1 * 512]x = tf.keras.layers.GlobalAveragePooling2D()(x)# 3、定義新的遷移模型x = tf.keras.layers.Dense(1024, activation=tf.nn.relu)(x)y_predict = tf.keras.layers.Dense(5, activation=tf.nn.softmax)(x)# model定義新模型# VGG 模型的輸入, 輸出:y_predicttransfer_model = tf.keras.models.Model(inputs=self.base_model.inputs, outputs=y_predict)return transfer_model

4.6.7.6 freeze VGG模型結構

目的:讓VGG結構當中的權重參數不參與訓練,只訓練我們添加的最后兩層全連接網絡的權重參數

  • 通過使用每一層的layer.trainable=False
def freeze_vgg_model(self):"""freeze掉VGG的結構:return:"""for layer in self.base_model.layers:layer.trainable = False

4.6.7.7 編譯和訓練

  • 編譯

同樣還是進行編譯, 在遷移學習中算法:學習率初始化較小的值,0.001,0.0001,因為已經在已訓練好的模型基礎之上更新,所以不需要太大學習率去學習

def compile(self, model):"""編譯模型:return:"""model.compile(optimizer=tf.keras.optimizers.Adam(),loss=tf.keras.losses.sparse_categorical_crossentropy,metrics=['accuracy'])return Nonedef fit_generator(self, model, train_gen, test_gen):"""訓練模型,model.fit_generator()不是選擇model.fit():return:"""# 每一次迭代準確率記錄的h5文件modelckpt = tf.keras.callbacks.ModelCheckpoint('./ckpt/transfer_{epoch:02d}-{val_accuracy:.2f}.h5',monitor='val_accuracy',save_best_only=True,save_weights_only=False,mode='auto',period=1)model.fit_generator(train_gen, epochs=3, validation_data=test_gen, callbacks=[modelckpt])return None
  • main函數
if __name__ == '__main__':tm = TransferModel()train_gen, test_gen = tm.read_img_to_generator()model = tm.refine_vgg_model()tm.freeze_vgg_model()tm.compile(model)tm.fit(model, train_gen, test_gen)

4.6.7.8 進行預測

預測的步驟就是讀取圖片以及處理到模型中預測,加載我們訓練的模型

def predict(self, model):"""預測輸入圖片的類別:return:"""# 1、加載模型訓練好的權重model.load_weights("./ckpt/transfer_01-0.84.h5")# 2、讀取圖片處理圖片數據,形狀,數據歸一化image = tf.io.read_file("./data/test/dinosaurs/402.jpg")image_decoded = tf.image.decode_jpeg(image)image_resized = tf.image.resize(image_decoded, [224, 224]) / 255.0# 3維-->4維的形狀改變img = tf.reshape(image_resized, (1, image_resized.shape[0], image_resized.shape[1], image_resized.shape[2]))print("修改之后的形狀:", img.shape)# 3、輸入數據做預測y_predict = model.predict(img)index = np.argmax(y_predict, axis=1)print(self.label_dict[str(index[0])])return None

建立圖片類別的字典

self.label_dict = {'0': 'bus','1': 'dinosaurs','2': 'elephants','3': 'flowers','4': 'horse'}

4.6.6 總結

  • Checkpoint使用
  • TensorBoard使用
  • tf.data模塊使用
  • ImageDataGenerator的使用

總結

以上是生活随笔為你收集整理的4.6 TF常用功能模块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。