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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Win10:tensorflow学习笔记(4)

發布時間:2025/3/15 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Win10:tensorflow学习笔记(4) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

學以致用,以學促用。輸出檢驗,完整閉環。
經過前段時間的努力,已經在電腦上搭好了深度學習系統,接下來就要開始跑程序了,將AI落地了。
安裝win10下tensforlow 可以參照之前的例子:win10+gpu安裝
在使用gpu版本中一些特別的問題,可以參照這篇:win10+tensorflow+gpu
在運行過程中遇到的一些錯誤,可以參照這篇::tensorflow 錯誤
tensorflow的一些基礎概念,可以參見這篇:tensorflow學習筆記(1)
tensorflow的發展故事,可以參見這篇:tensorfow學習筆記(2)
tensorflow的第一個上手應用,可以參見這篇:tensoeflow學習筆記(3)

怕什么真理無窮,進一寸有一寸的歡喜——胡適

目錄:

  • 前言
  • Tensorflow實現自編碼器(autoencoder)
    • 1自編碼器(AutoEncoder)
      • 1.1自編碼器起源
      • 1.2自編碼器
      • 1.3DBN(深度信念網絡)
      • 1.4自編碼器實現
        • 1.4.2參數初始化方法
        • 1.4.3定義自編碼器類
      • 1.5性能測試
  • 數據載入

Tensorflow實現自編碼器(autoencoder)

hello-world項目已經實現,現在可以開始進行下一階段了。
基本的神經元實現后,接下來將是一很基本但很有用的網絡吧。

1自編碼器(AutoEncoder)

傳統機器學習任務很大程度上依賴于特征工程,比如說體重和身高的比值,直徑和周長的比值,要想提取到合適的特征,需要工程師對領域背景有很深的認知與了解。而深度學習則可以解決人工難以提取有效的特征的問題,它可以緩解機器學習模型對特征的依賴。也因此深度學習在早期被認為是一種無監督的特征學習,模仿了人腦對特征逐層抽象提取的過程。
這里面有兩點很重要:

  • 無監督學習,不需要對數據進行標注,事實上標注好的數據集,是非常寶貴的資源,深度學習,學習到的是數據內容組織形式的學習,提取的是頻繁出現的特征。

  • 逐層抽象,特征是需要不斷抽象的,就像我們對概念的學習,總是從簡單的開始。

舉個例子,你是怎么認出一個人的?
光從圖片上去看,是看不出結果的,所以你對圖片上的東西進行分類,這是鼻子,這是耳朵,這是嘴巴,這整體是我的小伙伴。
基本概念講到這里,下面引入自編碼器。

1.1自編碼器起源

在之前研究稀疏編碼(sparse coding)時,學者們收集了大量黑白風景照,并從中提取了許多16像素*16像素的圖像碎片。在對圖像碎片研究后,發現幾乎所有的圖像碎片都可以由64種正交的邊組合得到,在對其他數據進行研究的時候也發現了。而這就是特征的稀疏表達,使用少量的基本特征組合拼裝得到更高些抽象層的特征。
通常我們也需要多層的神經網絡,對每一層神經網絡來說,前一層的輸出都是未加工的像素,而這一層則是對像素進行加工組織成更高階的特征(即前面提到的將邊組合成圖像碎片)。

特征邊。

1.2自編碼器

無監督自編碼器,使用自身的高階特征編碼自己。自編碼器是一種特殊的神經網絡,它的輸入和輸出是一致的,它借助稀疏編碼的思想,目標是使用稀疏的一些高階特征重新組合來重構自己。因此,它的特點是非常明顯:第一,期望輸入/輸出一致;第二,希望使用高階特征來重構自己,而不只是復制像素點。
Hinton教授在SCIENCE發表文章,講解了使用自編碼器對數據進行降維的方法。Hinton還提出了基于深度信念網絡(DBN)可使用無監督的逐層訓練的貪心算法,為訓練很深的網絡結構提供了一個可行的方案:
我們可能很難直接訓練極深的網絡,但是可以用無監督的逐層訓練提取特征,將網絡的權重初始化到一個比較好的位置,輔助后面的監督訓練。
無監督的逐層訓練,其思想和自編碼器(autoencoder)非常相似。后者的目標是讓神經網絡的輸出能和原始輸入一致,相當于學習一個恒等式x=y,如圖4-3所示。自編碼器的輸入節點和輸出節點是一致的,但如果只是單純地逐個復制輸入節點則沒有意義,像前面提到的,自編碼器通常希望使用少量稀疏的高階特征來重構輸入,所以我們可以加入幾種限制:

  • 如果限制中間隱含層節點的數量,則可以實現降維,學習到最重要的特征。如果再加一個l1正則化約束,那學習到的就更是最主要最重要的特征了。
  • 如果給數據加入噪聲,那么就是Denoising Autoencoder,去噪自編碼器,將學習到更主要的特征

    對于噪聲的設置也是一個trick,不同的噪聲有不同的優點,需要具體體會。

    1.3DBN(深度信念網絡)

    如果自編碼器的隱含層只有一層,那么其原理類似于主成分分析(PCA)。hinton提出的DBN模型有多個隱含層,每個隱含層都是限制性玻爾茲曼機(RBM,一種具有特殊連接分布的神經網絡)。
    DBN訓練時,需要先對每兩層間進行無監督的預訓練,這個過程就相當于一個多層的自編碼器,可以將整個網絡的權重初始化到一個理想的分布。最后,通過反向傳播算法調整模型權重,這個步驟會使用經過標注的信息來做監督性的分類訓練。當年DBN給訓練深層深層的神經網絡帶來了可能性,它能解決網絡過深帶來的梯度彌散(gradient vanishment)問題,讓訓練變得容易。簡單地說,HInton的思路就是先用自編碼器的方法進行無監督的預訓練,提取特征并初始化權重,然后使用標注信息進行監督式的訓練。當然自編碼器的作用不僅局限于給監督訓練做預訓練,直接使用自編碼器進行特征提取和分析也是可以的。現實中數據最多的還是未標注的數據,因此自編碼器擁有許多用武之地。

1.4自編碼器實現

下面我們就開始實現最具代表性的去噪自編碼器。去噪自編碼器的使用范圍最廣也最通用。而其它幾種自編碼器,讀者可以對代碼加以修改自行實現,其中無噪聲的自編碼器只需要去掉噪聲,并保證隱含層節點小于輸入層節點:Masking Noise的自編碼器只需要將高斯噪聲改為隨機遮擋噪聲;variationl autoencoder 則相對復雜,VAE對中間分布的節點由強假設,擁有額外的損失項,且會使用特殊的SGVB算法進行訓練。目前VAE還在生成模型中發揮了很大的作用。
####1.4.1導入常用庫
首先導入數值處理,numpy庫,接著導入scikit-learn的preprocessing 模塊,最后依舊是mnist數據集

import numpy as np
import sklearn.preprocessing as prep
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

1.4.2參數初始化方法

參數的初始化對于神經網絡的訓練至關重要,這次實驗我們選擇xavier initialization方法,該方法會根據某一層網絡的輸入,輸出節點數量自動調整最合適的分布。具體可以參見yoshua benigo的那篇論文。

def xavier_init(fan_in,fan_out,constant=1):
low=-constant*np.sqrt(6.0/(fan_in+fan_out))
high=constant*np.sqrt(6.0/(fan_in+fan_out))
return tf.random_uniform((fan_in,fan_out),
minval=low,maxval=high,
dtype=tf.float32
)

1.4.3定義自編碼器類

構建函數,構建函數包含這樣幾個輸入,n_input,n_hidden,transfer_function,optimizer,scale,這個自編碼器只做了一個隱含層。

#the an autoencoder
class AdditiveGaussianNoiseAutoencoder(object):
def __init__(self,n_input,n_hidden,transfer_function=tf.nn.softplus,
optimizer=tf.train.AdamOptimizer(),scale=0.1):
self.n_input=n_input
self.n_hidden=n_hidden
self.transfer=transfer_function
self.scale=tf.placeholder(tf.float32)
self.training_scale=scale
network_weights=self._initialize_weights()
self.weights=network_weights

然后是定義網絡結構,我們為輸入創建一個維度為n_input的placeholder。然后建立一個能提取特征的隱含層,最后再把提取的結果輸出去。

##the structure of networkself.x=tf.placeholder(tf.float32,[None,self.n_input])self.hidden=self.transfer(tf.add(tf.matmul(self.x+scale*tf.random_normal((n_input,)),self.weights['w1']),self.weights['b1']))self.reconstruction=tf.add(tf.matmul(self.hidden,self.weights['w2']),self.weights['b2'])

接下來定義自編碼器額損失函數,這里直接使用平方誤差(Squared error)作為cost,即tf.subtract計算輸出于輸入之差,再使用tf.pow求差的平方,最后使用tf.reduce_sum求和即可得到平方誤差。最后創建session,并初始化自編碼器的全部模型參數。

# the definition of cost function
self.cost=0.5*tf.reduce_sum(tf.pow(tf.subtract(self.reconstruction,self.x)
,2.0))
self.optimizer=optimizer.minimize(self.cost)
init=tf.global_variables_initializer()
self.sess=tf.Session()
self.sess.run(init)

下面來看一下參數初始化函數——initialize_weights,先創建一個名為all_weights的字典dict,然后將w1,b1,w2,b2全部存入其中,最后返回all_weights.

##initialization parameters
def _initialize_weights(self):
all_weights=dict()
all_weights['w1']=tf.Variable(xavier_init(self.n_input,
self.n_hidden))
all_weights['b1']=tf.Variable(tf.zeros([self.n_hidden],
dtype=tf.float32))
all_weights['w2']=tf.Variable(tf.zeros([self.n_hidden,self.n_input],
dtype=tf.float32
))
all_weights['b2']=tf.Variable(tf.zeros([self.n_input],dtype=tf.float32
))
return all_weights

下面我們定義計算損失cost及執行一步訓練的函數partial_fit.

> ##calculate the cost and ons step train > def partial_fit(self,X): > cost,opt=self.sess.run((self.cost,self.optimizer), > feed_dict={self.x:X,self.scale:self.training_scale}) > return cost

我們也需要一個只求損失的函數

> ##only cost > def calc_total_cost(self,X): > return self.sess.run(self.cost,feed_dict={self.x:X,self.scale:self.training_scale > }) >

定義一個transform函數,返回自編碼器的輸出結果。提供一個接口,返回抽象后的特征。

> ##transform function > def transform(self,X): > return self.sess.run(self.hidden,feed_dict={self.x:X,self.scale:self.training_scale > })

再定義generate函數,它將隱含層的輸出結果作為輸入,通過之后的重建層將提取到的高階特征復原為原始數據。

> def generate(self,hidden=None): > if hidden is None: > hidden=np.random.normal(size=self.weights["b1"]) > return self.sess.run(self.reconstruction,feed_dict={self.hidden:hidden})

接下來再定義reconstruct函數,他將整體運行一次復原過程,包括提取高階特征和通過高階特征復原數據,既包括transform和generate兩塊。

##reconstruct function
def reconstruct(self,X):
return self.sess.run(self.reconstruction,feed_dict={self.x:X,self.scale:self.training_scale
})
獲得隱含層的權重w1
##getWeights function get the hidden layer w1
def getWeights(self):
return self.sess.run(self.weights[‘w1’])
獲取隱含層的偏置系數b1
##getBiases function get the hidden b1
def getBiases(self):
return self.sess.run(self.weights[‘b1’])
實現完成,現在測試性能:

1.5性能測試

數據載入

mnist=input_data.read_data_sets('MNIST_data',one_hot=True) #數據標準化 def standard_scale(X_train,X_test):preprocessor=prep.StandardScaler().fit(X_train)X_train=preprocessor.transform(X_train)X_test=preprocessor.transform(X_test)return X_train,X_test隨機獲取訓練集 ##define a function to get random block data def get_random_block_from_data(data,batch_size):start_index=np.random.randint(0,len(data)-batch_size)return data[start_index:(start_index+batch_size)]#開始訓練 ## let's go X_train,X_test=standard_scale(mnist.train.images,mnist.test.images) #參數初始化 ##definition of parameters n_samples=int(mnist.train.num_examples) training_epochs=20 batch_size=128 display_step=1 #實例化一個autoencoder #generate a instance of agn autoencoder=AdditiveGaussianNoiseAutoencoder(n_input=784,n_hidden=200,transfer_function=tf.nn.softplus,optimizer=tf.train.AdamOptimizer(learning_rate=0.001),scale=0.01) for epoch in range(training_epochs):avg_cost=0;total_batch=int(n_samples/batch_size)for i in range(total_batch):batch_xs=get_random_block_from_data(X_train,batch_size)cost=autoencoder.partial_fit(batch_xs)avg_cost+=cost/n_samples*batch_sizeif epoch % display_step==0:print("Epoch:",'%04d'%(epoch+1),"cost=","{:.9f}".format(avg_cost))print("Total cost:"+str(autoencoder.calc_total_cost(X_test)))

測試結果:

Epoch: 0001 cost= 19257.268114773
Epoch: 0002 cost= 12260.724660227
Epoch: 0003 cost= 10765.586961364
Epoch: 0004 cost= 9036.303831250
Epoch: 0005 cost= 10057.622447727
Epoch: 0006 cost= 9045.839046591
Epoch: 0007 cost= 10273.095478409
Epoch: 0008 cost= 8417.097377841
Epoch: 0009 cost= 9292.796898295
Epoch: 0010 cost= 9096.705695455
Epoch: 0011 cost= 8969.315593750
Epoch: 0012 cost= 8124.126701705
Epoch: 0013 cost= 8896.797426136
Epoch: 0014 cost= 7948.233773864
Epoch: 0015 cost= 8706.865909091
Epoch: 0016 cost= 8403.629502841
Epoch: 0017 cost= 8873.035804545
Epoch: 0018 cost= 7940.911138068
Epoch: 0019 cost= 7758.856397159
Epoch: 0020 cost= 7933.486597159
Total cost:680984.0


參考:tensorflow實戰

總結

以上是生活随笔為你收集整理的Win10:tensorflow学习笔记(4)的全部內容,希望文章能夠幫你解決所遇到的問題。

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