<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    Python人工智能 | 十一.Tensorflow如何保存神經網絡參數

    VSole2021-11-19 22:01:22

    一.保存變量

    通過tf.Variable()定義權重和偏置變量,然后調用tf.train.Saver()存儲變量,將數據保存至本地“my_net/save_net.ckpt”文件中。

    # -*- coding: utf-8 -*-
    """
    Created on Thu Jan  2 20:04:57 2020
    @author: xiuzhang Eastmount CSDN
    """
    import tensorflow as tf
    import numpy as np
    #---------------------------------------保存文件---------------------------------------
    W = tf.Variable([[1,2,3], [3,4,5]], dtype=tf.float32, name='weights') #2行3列的數據
    b = tf.Variable([[1,2,3]], dtype=tf.float32, name='biases')
    # 初始化
    init = tf.initialize_all_variables()
    # 定義saver 存儲各種變量
    saver = tf.train.Saver()
    # 使用Session運行初始化
    with tf.Session() as sess:
        sess.run(init)
        # 保存 官方保存格式為ckpt
        save_path = saver.save(sess, "my_net/save_net.ckpt")
        print("Save to path:", save_path)
    

    “Save to path: my_net/save_net.ckpt”保存成功如下圖所示:

    打開內容如下圖所示:

    接著定義標記變量train,通過Restore操作使用我們保存好的變量。注意,在Restore時需要定義相同的dtype和shape,不需要再定義init。最后直接通過 saver.restore(sess, “my_net/save_net.ckpt”) 提取保存的變量并輸出即可。

    # -*- coding: utf-8 -*-
    """
    Created on Thu Jan  2 20:04:57 2020
    @author: xiuzhang Eastmount CSDN
    """
    import tensorflow as tf
    import numpy as np
    # 標記變量
    train = False
    #---------------------------------------保存文件---------------------------------------
    # Save
    if train==True:
        # 定義變量
        W = tf.Variable([[1,2,3], [3,4,5]], dtype=tf.float32, name='weights') #2行3列的數據
        b = tf.Variable([[1,2,3]], dtype=tf.float32, name='biases')
        # 初始化
        init = tf.global_variables_initializer()
        
        # 定義saver 存儲各種變量
        saver = tf.train.Saver()
        
        # 使用Session運行初始化
        with tf.Session() as sess:
            sess.run(init)
            # 保存 官方保存格式為ckpt
            save_path = saver.save(sess, "my_net/save_net.ckpt")
            print("Save to path:", save_path)
    #---------------------------------------Restore變量-------------------------------------
    # Restore
    if train==False:
        # 記住在Restore時定義相同的dtype和shape
        # redefine the same shape and same type for your variables
        W = tf.Variable(np.arange(6).reshape((2,3)), dtype=tf.float32, name='weights') #空變量
        b = tf.Variable(np.arange(3).reshape((1,3)), dtype=tf.float32, name='biases') #空變量
        
        # Restore不需要定義init
        saver = tf.train.Saver()
        with tf.Session() as sess:
            # 提取保存的變量
            saver.restore(sess, "my_net/save_net.ckpt")
            # 尋找相同名字和標識的變量并存儲在W和b中
            print("weights", sess.run(W))
            print("biases", sess.run(b))
    

    最后輸出之前所保存的變量,weights為 [[1,2,3], [3,4,5]],偏置為 [[1,2,3]]。

    二.保存神經網絡

    那么,TensorFlow如何保存我們的神經網絡框架呢?我們需要把整個網絡訓練好再進行保存,其方法和上面類似,完整代碼如下:

    """
    Created on Sun Dec 29 19:21:08 2019
    @author: xiuzhang Eastmount CSDN
    """
    import os
    import glob
    import cv2
    import numpy as np
    import tensorflow as tf
    # 定義圖片路徑
    path = 'photo/'
    #---------------------------------第一步 讀取圖像-----------------------------------
    def read_img(path):
        cate = [path + x for x in os.listdir(path) if os.path.isdir(path + x)]
        imgs = []
        labels = []
        fpath = []
        for idx, folder in enumerate(cate):
            # 遍歷整個目錄判斷每個文件是不是符合
            for im in glob.glob(folder + '/*.jpg'):
                #print('reading the images:%s' % (im))
                img = cv2.imread(im)             #調用opencv庫讀取像素點
                img = cv2.resize(img, (32, 32))  #圖像像素大小一致
                imgs.append(img)                 #圖像數據
                labels.append(idx)               #圖像類標
                fpath.append(path+im)            #圖像路徑名
                #print(path+im, idx)
                
        return np.asarray(fpath, np.string_), np.asarray(imgs, np.float32), np.asarray(labels, np.int32)
    # 讀取圖像
    fpaths, data, label = read_img(path)
    print(data.shape)  # (1000, 256, 256, 3)
    # 計算有多少類圖片
    num_classes = len(set(label))
    print(num_classes)
    # 生成等差數列隨機調整圖像順序
    num_example = data.shape[0]
    arr = np.arange(num_example)
    np.random.shuffle(arr)
    data = data[arr]
    label = label[arr]
    fpaths = fpaths[arr]
    # 拆分訓練集和測試集 80%訓練集 20%測試集
    ratio = 0.8
    s = np.int(num_example * ratio)
    x_train = data[:s]
    y_train = label[:s]
    fpaths_train = fpaths[:s] 
    x_val = data[s:]
    y_val = label[s:]
    fpaths_test = fpaths[s:] 
    print(len(x_train),len(y_train),len(x_val),len(y_val)) #800 800 200 200
    print(y_val)
    #---------------------------------第二步 建立神經網絡-----------------------------------
    # 定義Placeholder
    xs = tf.placeholder(tf.float32, [None, 32, 32, 3])  #每張圖片32*32*3個點
    ys = tf.placeholder(tf.int32, [None])               #每個樣本有1個輸出
    # 存放DropOut參數的容器 
    drop = tf.placeholder(tf.float32)                   #訓練時為0.25 測試時為0
    # 定義卷積層 conv0
    conv0 = tf.layers.conv2d(xs, 20, 5, activation=tf.nn.relu)    #20個卷積核 卷積核大小為5 Relu激活
    # 定義max-pooling層 pool0
    pool0 = tf.layers.max_pooling2d(conv0, [2, 2], [2, 2])        #pooling窗口為2x2 步長為2x2
    print("Layer0:", conv0, pool0)
     
    # 定義卷積層 conv1
    conv1 = tf.layers.conv2d(pool0, 40, 4, activation=tf.nn.relu) #40個卷積核 卷積核大小為4 Relu激活
    # 定義max-pooling層 pool1
    pool1 = tf.layers.max_pooling2d(conv1, [2, 2], [2, 2])        #pooling窗口為2x2 步長為2x2
    print("Layer1:", conv1, pool1)
    # 將3維特征轉換為1維向量
    flatten = tf.layers.flatten(pool1)
    # 全連接層 轉換為長度為400的特征向量
    fc = tf.layers.dense(flatten, 400, activation=tf.nn.relu)
    print("Layer2:", fc)
    # 加上DropOut防止過擬合
    dropout_fc = tf.layers.dropout(fc, drop)
    # 未激活的輸出層
    logits = tf.layers.dense(dropout_fc, num_classes)
    print("Output:", logits)
    # 定義輸出結果
    predicted_labels = tf.arg_max(logits, 1)
    #---------------------------------第三步 定義損失函數和優化器---------------------------------
    # 利用交叉熵定義損失
    losses = tf.nn.softmax_cross_entropy_with_logits(
            labels = tf.one_hot(ys, num_classes),       #將input轉化為one-hot類型數據輸出
            logits = logits)
    # 平均損失
    mean_loss = tf.reduce_mean(losses)
    # 定義優化器 學習效率設置為0.0001
    optimizer = tf.train.AdamOptimizer(learning_rate=1e-4).minimize(losses)
    #------------------------------------第四步 模型訓練和預測-----------------------------------
    # 用于保存和載入模型
    saver = tf.train.Saver()
    # 訓練或預測
    train = False
    # 模型文件路徑
    model_path = "model/image_model"
    with tf.Session() as sess:
        if train:
            print("訓練模式")
            # 訓練初始化參數
            sess.run(tf.global_variables_initializer())
            # 定義輸入和Label以填充容器 訓練時dropout為0.25
            train_feed_dict = {
                    xs: x_train,
                    ys: y_train,
                    drop: 0.25
            }
            # 訓練學習1000次
            for step in range(1000):
                _, mean_loss_val = sess.run([optimizer, mean_loss], feed_dict=train_feed_dict)
                if step % 50 == 0:  #每隔50次輸出一次結果
                    print("step = {}\t mean loss = {}".format(step, mean_loss_val))
            # 保存模型
            saver.save(sess, model_path)
            print("訓練結束,保存模型到{}".format(model_path))
        else:
            print("測試模式")
            # 測試載入參數
            saver.restore(sess, model_path)
            print("從{}載入模型".format(model_path))
            # label和名稱的對照關系
            label_name_dict = {
                0: "人類",
                1: "沙灘",
                2: "建筑",
                3: "公交",
                4: "恐龍",
                5: "大象",
                6: "花朵",
                7: "野馬",
                8: "雪山",
                9: "美食"
            }
            # 定義輸入和Label以填充容器 測試時dropout為0
            test_feed_dict = {
                xs: x_val,
                ys: y_val,
                drop: 0
            }
            
            # 真實label與模型預測label
            predicted_labels_val = sess.run(predicted_labels, feed_dict=test_feed_dict)
            for fpath, real_label, predicted_label in zip(fpaths_test, y_val, predicted_labels_val):
                # 將label id轉換為label名
                real_label_name = label_name_dict[real_label]
                predicted_label_name = label_name_dict[predicted_label]
                print("{}\t{} => {}".format(fpath, real_label_name, predicted_label_name))
            # 評價結果
            print("正確預測個數:", sum(y_val==predicted_labels_val))
            print("準確度為:", 1.0*sum(y_val==predicted_labels_val) / len(y_val))
    

    核心步驟為:

    saver = tf.train.Saver()
    model_path = "model/image_model"
    with tf.Session() as sess:
        if train:
        	#保存神經網絡
        	sess.run(tf.global_variables_initializer())
        	for step in range(1000):
                _, mean_loss_val = sess.run([optimizer, mean_loss], feed_dict=train_feed_dict)
                if step % 50 == 0:
                    print("step = {}\t mean loss = {}".format(step, mean_loss_val))
            saver.save(sess, model_path)
        else:
        	#載入神經網絡
        	saver.restore(sess, model_path)
            predicted_labels_val = sess.run(predicted_labels, feed_dict=test_feed_dict)
            for fpath, real_label, predicted_label in zip(fpaths_test, y_val, predicted_labels_val):
                real_label_name = label_name_dict[real_label]
                predicted_label_name = label_name_dict[predicted_label]
                print("{}\t{} => {}".format(fpath, real_label_name, predicted_label_name))	
    

    預測輸出結果如下圖所示,最終預測正確181張圖片,準確度為0.905。相比之前機器學習KNN的0.500有非常高的提升。

    測試模式
    INFO:tensorflow:Restoring parameters from model/image_model
    從model/image_model載入模型
    b'photo/photo/3\\335.jpg'       公交 => 公交
    b'photo/photo/1\\129.jpg'       沙灘 => 沙灘
    b'photo/photo/7\\740.jpg'       野馬 => 野馬
    b'photo/photo/5\\564.jpg'       大象 => 大象
    ...
    b'photo/photo/9\\974.jpg'       美食 => 美食
    b'photo/photo/2\\220.jpg'       建筑 => 公交
    b'photo/photo/9\\912.jpg'       美食 => 美食
    b'photo/photo/4\\459.jpg'       恐龍 => 恐龍
    b'photo/photo/5\\525.jpg'       大象 => 大象
    b'photo/photo/0\\44.jpg'        人類 => 人類
    正確預測個數: 181
    準確度為: 0.905
    

    三.總結

    寫到這里,這篇文章就講解完畢,更多TensorFlow深度學習文章會繼續分享,接下來我們會分享RNN、LSTM、文本識別等內容。如果讀者有什么想學習的,也可以私聊我,我去學習并應用到你的領域。

    最后,希望這篇基礎性文章對您有所幫助,如果文章中存在錯誤或不足之處,還請海涵~作為人工智能的菜鳥,我希望自己能不斷進步并深入,后續將它應用于圖像識別、網絡安全、對抗樣本等領域,指導大家撰寫簡單的學術論文,一起加油!

    感恩有你,一路同行。

    python函數tensorflow
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    Python人工智能第11篇文章介紹如何保存神經網絡參數
    評價神經網絡的方法和評價機器學習的方法大同小異,常見的包括誤差、準確率、R2 score、F值等。
    Python人工智能第17篇實現經典得MNIST分類案例
    Python人工智能第10篇介紹TF實現CNN圖像分類任務
    從本專欄開始,作者正式研究Python深度學習、神經網絡及人工智能相關知識。一.RNN文本分類1.RNN循環神經網絡英文是Recurrent Neural Networks,簡稱RNN。假設有一組數據data0、data1、data2、data3,使用同一個神經網絡預測它們,得到對應的結果。RNN常用于自然語言處理、機器翻譯、語音識別、圖像識別等領域。本文將采用詞向量、TFIDF兩種方式進行實驗。
    卷積神經網絡的英文是Convolutional Neural Network,簡稱CNN。近幾年神經網絡飛速發展,其中一個很重要的原因就是CNN卷積神經網絡的提出,這也是計算機視覺處理的飛躍提升。
    搭建過程詳見這篇文章:二.TensorFlow環境搭建、學習路線及入門案例安裝如下圖所示:安裝成功之后,我們嘗試一個簡單的代碼。打開Anaconda,然后選擇已經搭建好的“tensorflow”環境,運行Spyder。
    Python人工智能第9篇文章詳細介紹卷積神經網絡基礎知識
    美團安全部的供應鏈檢測系統近期檢測出PyPI源遭多次投毒攻擊,這些惡意包在安裝時會自動下載運行含有惡意行為的程序。
    實體對齊尋求在不同的知識圖譜(KG)中找到引用同一真實世界對象的實體。KG嵌入的最新進展推動了基于嵌入的實體對齊的出現,它在一個連續的嵌入空間中對實體進行編碼,并基于學習到的嵌入來測量實體的相似性。本文對這一新興領域進行了全面的實驗研究。團隊調查了最近23種基于嵌入的實體對齊方法,并根據它們的技術和特點對它們進行了分類。此外團隊還提出了一種新的KG抽樣算法,通過該算法生成了一組具有各種異質性和分布
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类