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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tensorflow编程入门笔记之一

發(fā)布時(shí)間:2025/5/22 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tensorflow编程入门笔记之一 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基本上每一個(gè)語言或者工具都有自己的“hello world” demo,那么學(xué)習(xí)它們一般都會(huì)從這個(gè)“hello world”開始。今天我們就來看看tensorflow的“hello world”(非官網(wǎng))。
在開始編寫“hello world”之前我們先看看tensorflow的編程模型。

一. tensorflow編程模型簡介

這部分的一個(gè)很好的教程是官網(wǎng)上的Basic Usage,講解的還是很清晰的。

Tensorflow中的計(jì)算可以表示為一個(gè)有向圖(directed graph),或稱計(jì)算圖(computation graph),其中每一個(gè)運(yùn)算操作將作為一個(gè)節(jié)點(diǎn)(node),節(jié)點(diǎn)與節(jié)點(diǎn)之間的連接成為邊(edge),而在計(jì)算圖的邊中流動(dòng)(flow)的數(shù)據(jù)被稱為張量(tensor),所以形象的看整個(gè)操作就好像數(shù)據(jù)(tensor)在計(jì)算圖(computation graphy)中沿著邊(edge)流過(flow)一個(gè)個(gè)節(jié)點(diǎn)(node),這就是tensorflow名字的由來的。

計(jì)算圖中的每個(gè)節(jié)點(diǎn)可以有任意多個(gè)輸入和任意多個(gè)輸出,每個(gè)節(jié)點(diǎn)描述了一種運(yùn)算操作(operation, op),節(jié)點(diǎn)可以算作運(yùn)算操作的實(shí)例化(instance)。計(jì)算圖描述了數(shù)據(jù)的計(jì)算流程,它也負(fù)責(zé)維護(hù)和更新狀態(tài),用戶可以對(duì)計(jì)算圖的分支進(jìn)行條件控制或循環(huán)操作。用戶可以使用pyton、C++、Go、Java等語言設(shè)計(jì)計(jì)算圖。tensorflow通過計(jì)算圖將所有的運(yùn)算操作全部運(yùn)行在python外面,比如通過c++運(yùn)行在cpu或通過cuda運(yùn)行在gpu 上,所以實(shí)際上python只是一種接口,真正的核心計(jì)算過程還是在底層采用c++或cuda在cpu或gpu上運(yùn)行。

一個(gè) TensorFlow圖描述了計(jì)算的過程. 為了進(jìn)行計(jì)算, 圖必須在會(huì)話(session)里被啟動(dòng). 會(huì)話將圖的op分發(fā)到諸如CPU或GPU之的備上, 同時(shí)提供執(zhí)行op的方法. 這些方法執(zhí)行后, 將產(chǎn)生的tensor返回. 在Python語言中, 返回的tensor是numpy ndarray對(duì)象; 在C和C++語言中, 返回的tensor是tensorflow::Tensor實(shí)例。

從上面的描述中我們可以看到,tensorflow的幾個(gè)比較重要的概念:tensor, computation graphy, node, session。正如前面所說,整個(gè)操作就好像數(shù)據(jù)(tensor)在計(jì)算圖(computation graphy)中沿著邊(edge)流過(flow)一個(gè)個(gè)節(jié)點(diǎn)(node),然后通過會(huì)話(session)啟動(dòng)計(jì)算。所以簡單來說,要完成這整個(gè)過程,我們需要的東西是要定義數(shù)據(jù)、計(jì)算圖和計(jì)算圖上的節(jié)點(diǎn),以及啟動(dòng)計(jì)算的會(huì)話。所以在實(shí)際使用中我們要做的大部分工作應(yīng)該就是定義這些內(nèi)容了。

二. tensorflow基本使用

正如官方教程里所說:

To use TensorFlow you need to understand how TensorFlow:

  • Represents computations as graphs.
  • Executes graphs in the context of Sessions.
  • Represents data as tensors.
  • Maintains state with Variables.
  • Uses feeds and fetches to get data into and out of arbitrary operations.

我們只有理解了這些概念,明白它們分別是做什么的,才能掌握tensorflow的使用方法。下面簡單介紹下這些概念及使用。

  • 計(jì)算圖(computation graphy)
    計(jì)算圖是由一個(gè)個(gè)節(jié)點(diǎn)和連接各個(gè)節(jié)點(diǎn)的邊組成,因此要定義一個(gè)計(jì)算圖,只需要定義好各個(gè)節(jié)點(diǎn)以及節(jié)點(diǎn)的輸入輸出(對(duì)應(yīng)計(jì)算圖的邊)。節(jié)點(diǎn)代表各種操作,如加法、乘法、卷積運(yùn)算等等,輸入輸出主要是各種數(shù)據(jù)(tensor)。下面是一個(gè)簡單的計(jì)算圖定義方法示例(來自官網(wǎng)):
import tensorflow as tf# Create a Constant op that produces a 1x2 matrix. The op is # added as a node to the default graph. # # The value returned by the constructor represents the output # of the Constant op. matrix1 = tf.constant([[3., 3.]])# Create another Constant that produces a 2x1 matrix. matrix2 = tf.constant([[2.],[2.]])# Create a Matmul op that takes 'matrix1' and 'matrix2' as inputs. # The returned value, 'product', represents the result of the matrix # multiplication. product = tf.matmul(matrix1, matrix2)

當(dāng)然,我們也可以添加更多更復(fù)雜的操作(operation)的節(jié)點(diǎn)(node)到計(jì)算圖(computation graphy)中,如果增加一些卷積網(wǎng)絡(luò)節(jié)點(diǎn)、全連接網(wǎng)絡(luò)節(jié)點(diǎn)等等就可以組建一個(gè)神經(jīng)網(wǎng)絡(luò)計(jì)算圖了。

  • 節(jié)點(diǎn)(node)
    計(jì)算圖中的每個(gè)節(jié)點(diǎn)可以有任意多個(gè)輸入和任意多個(gè)輸出,每個(gè)節(jié)點(diǎn)描述了一種運(yùn)算操作(operation, op),節(jié)點(diǎn)可以算作運(yùn)算操作的實(shí)例化(instance)。一種運(yùn)算操作代表了一種類型的抽象運(yùn)算,比如矩陣乘法貨響亮加法。tensorflow內(nèi)建了很多種運(yùn)算操作,如下表所示:
類型示例
標(biāo)量運(yùn)算Add、Sub、Mul、Div、Exp、Log、Greater、Less、Equal
向量運(yùn)算Concat、Slice、Splot、Constant、Rank、Shape、Shuffle
矩陣運(yùn)算Matmul、MatrixInverse、MatrixDeterminant
帶狀態(tài)的運(yùn)算Variable、Assign、AssignAdd
神經(jīng)網(wǎng)絡(luò)組件SoftMax、Sigmoid、ReLU、Convolution2D、MaxPooling
存儲(chǔ)、恢復(fù)Save、Restore
隊(duì)列及同步運(yùn)算Enqueue、Dequeue、MutexAcquire、MutexRelease
控制流Merge、Switch、Enter、Leave、NextIteration

在tensorflow中,也可以通過注冊(cè)機(jī)制加入新的運(yùn)算操作或者運(yùn)算核,這和torch上的注冊(cè)機(jī)制類似。

  • 會(huì)話(session)
    正如我們前面所說,計(jì)算圖里描述的計(jì)算并沒有真正執(zhí)行,只是進(jìn)行了定義和描述,要實(shí)際執(zhí)行我們就需要在會(huì)話(session)里被啟動(dòng). 這時(shí)session才會(huì)將計(jì)算圖上的節(jié)點(diǎn)操作op分發(fā)到諸如CPU或GPU之類的設(shè)備上, 同時(shí)提供執(zhí)行op的方法. 這些方法執(zhí)行后,將產(chǎn)生的tensor返回.
    要啟動(dòng)計(jì)算圖,我們收下需要定義一個(gè)session對(duì)象:
sess = tf.Session()

啟動(dòng)操作,最簡單的就是調(diào)用函數(shù)run:

result = sess.run(product)

tensorflow還支持分布式session,將計(jì)算圖布置到多個(gè)機(jī)器上進(jìn)行計(jì)算。由于我這邊不具備該環(huán)境,就不介紹這部分內(nèi)容了。
另外tensorflow還支持交互環(huán)境下采用InteractiveSession定義一個(gè)交互session,然后所有的操作都默認(rèn)在該session上運(yùn)行,可以直接調(diào)用Tensor.eval()和Operation.run()兩個(gè)方法,如:

# Enter an interactive TensorFlow Session. import tensorflow as tf sess = tf.InteractiveSession()x = tf.Variable([1.0, 2.0]) a = tf.constant([3.0, 3.0])# Initialize 'x' using the run() method of its initializer op. x.initializer.run()# Add an op to subtract 'a' from 'x'. Run it and print the result sub = tf.sub(x, a) print(sub.eval()) # ==> [-2. -1.]# Close the Session when we're done. sess.close()
  • 數(shù)據(jù)(tensor)
    TensorFlow程序使用tensor數(shù)據(jù)結(jié)構(gòu)來代表所有的數(shù)據(jù), 計(jì)算圖中的節(jié)點(diǎn)間傳遞的數(shù)據(jù)都是tensor. 你可以把TensorFlow tensor看作是一個(gè)n維的數(shù)組或列表. 一個(gè) tensor包含一個(gè)靜態(tài)類型rank, 和一個(gè)shape。
  • 變量(Variable)
    在tensorflow里有一類數(shù)據(jù)比較特殊,那就是我們需要在整個(gè)計(jì)算圖執(zhí)行過程中需要保存的狀態(tài)。比如我們?cè)谶M(jìn)行神經(jīng)網(wǎng)絡(luò)訓(xùn)練時(shí)要時(shí)刻保存并更新的網(wǎng)絡(luò)參數(shù),這時(shí)我們就需要用到Varibale來保存這些參數(shù)。其實(shí),我們?cè)谇懊娴氖纠幸呀?jīng)用到了變量的定義了,它的定義關(guān)鍵字為Variable,如上面的x = tf.Variable([1.0, 2.0])。
  • feed & fetch
    我們都知道,進(jìn)行機(jī)器學(xué)習(xí)或者神經(jīng)網(wǎng)絡(luò)訓(xùn)練時(shí),都需要大量的訓(xùn)練數(shù)據(jù)。細(xì)心的朋友可能注意到,我們前面一直沒講到訓(xùn)練數(shù)據(jù)怎么定義,怎么輸入到網(wǎng)絡(luò)里。實(shí)際上,tensorflow提供了一個(gè)feed機(jī)制來將tensor直接放置到計(jì)算圖的任意節(jié)點(diǎn)操作上去。“feed”這個(gè)詞用的很形象啊,就像我們?cè)谏险n學(xué)習(xí)時(shí),老師拿課本里的各種例子、習(xí)題往我們腦子里喂。那么,這個(gè)利用這個(gè)feed機(jī)制我們就可以把訓(xùn)練數(shù)據(jù)“喂”到計(jì)算圖的輸入中去。一般我們采用placeholder來指定一個(gè)feed操作,這個(gè)placeholder就像是一個(gè)容器一樣來接收訓(xùn)練數(shù)據(jù),然后在最終進(jìn)行計(jì)算時(shí)只需要用placehoder里的數(shù)據(jù)替換計(jì)算圖的輸入量就可以了。一個(gè)簡單的例子:
input1 = tf.placeholder(tf.float32) input2 = tf.placeholder(tf.float32) output = tf.mul(input1, input2)with tf.Session() as sess:print(sess.run([output], feed_dict={input1:[7.], input2:[2.]}))

采用兩個(gè)placeholder操作來定義兩個(gè)輸入,在后面的see.run()里采用feed_dict替換成真正的訓(xùn)練數(shù)據(jù),feed_dict里的才是真正的數(shù)據(jù)。一般情況,placeholder和feed_dict是搭配使用的。
fetch,正如其字面意思,就是取回?cái)?shù)據(jù)的意思。我們將計(jì)算圖部署到session上進(jìn)行計(jì)算后,需要將計(jì)算結(jié)果取回,這就是一個(gè)fetch。下面是取回多個(gè)tensor的例子:

input1 = tf.constant(3.0) input2 = tf.constant(2.0) input3 = tf.constant(5.0) intermed = tf.add(input2, input3) mul = tf.mul(input1, intermed) with tf.Session() as sess:result = sess.run([mul, intermed])print result

上面就是tensorflow編程模型的一些基本概念和內(nèi)容。通過上面的介紹,我們可以用一句話來總結(jié)tensorflow的一個(gè)工作流程:

那么我們也可以簡單總結(jié)出tensorflow編程的一個(gè)基本步驟:

  • 定義數(shù)據(jù)
  • 定義計(jì)算圖與變量
  • 定義會(huì)話
  • 進(jìn)行計(jì)算
  • 三. 用tensorflow搭建神經(jīng)網(wǎng)絡(luò)“hello world”

    按照我們上一節(jié)介紹的tensorflow編程的基本步驟,我們來搭建我們的第一個(gè)神經(jīng)網(wǎng)絡(luò)——基于mnist數(shù)據(jù)集的手寫數(shù)字識(shí)別,即基于圖片的10分類問題。
    此部分可以參考官網(wǎng)教程MNIST For ML Beginners。
    MNIST是一個(gè)簡單的機(jī)器視覺數(shù)據(jù)集,如下圖所示,它有幾萬張28×28像素的手寫數(shù)字組成,這些圖片只包含灰度信息,我們的任務(wù)就是對(duì)這些手寫數(shù)字進(jìn)行分類,轉(zhuǎn)成0~9一共10類。

    1.定義數(shù)據(jù)
    在神經(jīng)網(wǎng)絡(luò)里我們需要定義的數(shù)據(jù)就是輸入訓(xùn)練/測試數(shù)據(jù),而變量用來存儲(chǔ)網(wǎng)絡(luò)模型里的各種參數(shù)。如:

    # 輸入數(shù)據(jù)(包括訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)) x = tf.placeholder( tf.float32, [None, 784] ) y_ = tf.placeholder( tf.float32, [None, 10] )

    這里我們把圖片的2828個(gè)像素展開成一維列向量(2828-784)
    2.定義計(jì)算圖與變量
    對(duì)于神經(jīng)網(wǎng)絡(luò)來說,涉及到的操作主要有三部分:網(wǎng)絡(luò)模型定義,損失函數(shù)定義、訓(xùn)練/優(yōu)化方法定義。那么我們的計(jì)算圖基本也由這三部分的定義組成。(當(dāng)然還可能包括其它部分,如輸入數(shù)據(jù)初始化操作,網(wǎng)絡(luò)參數(shù)初始化等等,這里我們不討論)

    • 網(wǎng)絡(luò)模型定義
      這里我們定義一個(gè)最簡單的單層全連接網(wǎng)絡(luò),計(jì)算公式為:y=Wx+b,然后利用softmax來計(jì)算預(yù)測概率,預(yù)測概率最大的對(duì)應(yīng)預(yù)測的分類。我需要定義兩個(gè)變量來保存網(wǎng)絡(luò)參數(shù)W和b的狀態(tài)。
    W = tf.Variable( tf.zeros([784,10]) ) b = tf.Variable( tf.zeros([10]) ) y = tf.nn.softmax( tf.matmul(x,W) + b )
    • 損失函數(shù)定義
      采用cross-entropy作為損失函數(shù),它的公式為:$H_{y'}\left(y\right)=-\underset{i}{{\textstyle \sum}}y'{i}\log\left(y{i}\right)$。(才發(fā)現(xiàn)簡書竟然不支持Latex,尷尬。。。)
    cross_entropy = tf.reduce_mean( -tf.reduce_sum( y_*tf.log(y), reduction_indices=[1] ) )
    • 訓(xùn)練/優(yōu)化方法定義
      神經(jīng)網(wǎng)絡(luò)常采用SGD(Stochastic Gradient Descent)進(jìn)行網(wǎng)絡(luò)的優(yōu)化訓(xùn)練。tensorflow會(huì)自動(dòng)根據(jù)前面定義的計(jì)算圖進(jìn)行forward和backward計(jì)算并更新參數(shù)。
    train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

    3.定義會(huì)話
    按照前面的方法,定義一個(gè)session即可。但是還要記住對(duì)所有的變量進(jìn)行全局初始化。

    sess = tf.InteractiveSession() tf.global_variables_initializer().run() #由于是InteractiveSession可以直接run

    或者

    sess = tf.Session() init = tf.global_variables_initializer() sess.run()

    4.進(jìn)行計(jì)算
    對(duì)于神經(jīng)網(wǎng)絡(luò)來說,就是要開始迭代進(jìn)行訓(xùn)練和評(píng)估,降低損失函數(shù)。

    # training for i in range(10000):batch_xs, batch_ys = mnist.train.next_batch(100)train_step.run( {x:batch_xs, y_:batch_ys} ) #InteractiveSession # sess.run(train_step, feed_dict={x:batch_xs, y_:batch_ys}) #非InteractiveSession # eval correct_prediction = tf.equal( tf.argmax(y,1), tf.argmax(y_,1) ) accuracy = tf.reduce_mean( tf.cast(correct_prediction, tf.float32) ) print(accuracy.eval( {x:mnist.test.images, y_:mnist.test.labels} )) #InteractiveSession print(sess.run(accuracy, feed_dict={x:mnist.test.images, y_:mnist.test.labels})#非InteractiveSession

    以上就是整個(gè)神經(jīng)網(wǎng)絡(luò)的搭建過程。這里只采用的單層全連接網(wǎng)絡(luò),但是準(zhǔn)確率依然達(dá)到了92%左右,如果我們采用卷積神經(jīng)網(wǎng)絡(luò)等更復(fù)雜的網(wǎng)絡(luò),可以將準(zhǔn)確率提高到99%。
    以上只是搭建一個(gè)神經(jīng)網(wǎng)絡(luò)的基本框架,當(dāng)然實(shí)際中還是數(shù)據(jù)預(yù)處理、參數(shù)初始化、超參數(shù)設(shè)置等問題,這些就需要在實(shí)際使用過程中慢慢學(xué)習(xí)了。
    以下是該網(wǎng)絡(luò)的全部代碼:

    import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)x = tf.placeholder( tf.float32, [None, 784] ) y_ = tf.placeholder( tf.float32, [None, 10] )W = tf.Variable( tf.zeros([784,10]) ) b = tf.Variable( tf.zeros([10]) ) y = tf.nn.softmax( tf.matmul(x,W) + b )cross_entropy = tf.reduce_mean( -tf.reduce_sum( y_*tf.log(y), reduction_indices=[1] ) )train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)session = tf.InteractiveSession() tf.global_variables_initializer().run()for i in range(1000):batch_xs, batch_ys = mnist.train.next_batch(100)train_step.run( {x:batch_xs, y_:batch_ys} )# print(i)correct_prediction = tf.equal( tf.argmax(y,1), tf.argmax(y_,1) ) accuracy = tf.reduce_mean( tf.cast(correct_prediction, tf.float32) ) print(accuracy.eval( {x:mnist.test.images, y_:mnist.test.labels} ))

    作者:mac在路上
    鏈接:https://www.jianshu.com/p/87581c7082ba
    來源:簡書
    著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
    《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的tensorflow编程入门笔记之一的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 在线观看日韩av | 亚洲在线第一页 | 蜜桃香蕉视频 | 多毛的亚洲人毛茸茸 | 高h视频在线免费观看 | 一级特黄aa大片 | 亚洲国产综合一区 | 国产二区视频 | 久久亚洲精品石原莉奈 | 亚洲精品视频在线观看视频 | 免费观看黄一级视频 | 自拍偷拍亚洲区 | 高h校园不许穿内裤h调教 | 伊人久久久久久久久久久 | 国产精品蜜臀av | 午夜嘿嘿 | 亚洲欧美电影 | 人人爽人人爽人人爽人人爽 | 色婷婷综合久久久久中文 | 男人添女人荫蒂国产 | 大地资源在线观看免费高清版粤语 | 99riav国产 | 老熟妇仑乱一区二区视频 | 毛片在线视频 | 国产区福利 | 国产乱欲视频 | 99久久久无码国产精品衣服 | 欧美a级黄色片 | 久久精品无码毛片 | 久久亚洲日本 | 超碰免费在线97 | 美日韩av在线 | 午夜激情网址 | 日韩精品免费一区二区三区竹菊 | 青青色在线观看 | 青娱乐激情 | 天天视频国产 | av在线免费观看不卡 | 91亚洲国产精品 | 欧美三级手机在线观看 | 三女同志亚洲人狂欢 | 波多野结衣精品在线 | 我要操av | 中文字幕一区二区三区日韩精品 | 亚洲国产精品综合久久久 | 久久久噜噜噜久久中文字幕色伊伊 | 女人被狂躁60分钟视频 | 欧美丰满老熟妇xxxxx性 | 动漫av一区 | 国产欧美综合在线 | 激情高潮呻吟抽搐喷水 | 久操福利在线 | 免费av在线播放网址 | 看一级大片 | 中文字幕www | 黄色激情小说视频 | 国产精一区 | 一级特黄bbbbb免费观看 | 色呦呦视频在线 | 亚洲不卡中文字幕无码 | 神马午夜视频 | 五十路av在线 | 国产成人精品视频ⅴa片软件竹菊 | 国产无套粉嫩白浆内谢 | 91一区视频 | 欧美第二区 | 人妻少妇精品无码专区二区 | 婷婷色在线 | 精品久久综合 | 免费播放毛片精品视频 | 国产精品123| 一级做a爱片久久 | 丰满少妇在线观看网站 | 激情综合色 | 国产日批视频在线观看 | 国产乱码精品一区二区三区不卡 | 亚洲乱码一区二区三区 | 在线观看的av网址 | 亚洲国产精品久久AV | 日本黄a三级三级三级 | 亚洲精品无码成人 | 亚洲网在线观看 | 屁屁影院国产第一页 | 国产视频精品自拍 | 最新福利视频 | 欧美午夜精品久久久 | 亚洲第一区在线播放 | 播放男人添女人下边视频 | 久久99网 | 欧美成人视屏 | 国产成人精品123区免费视频 | 人妻少妇精品中文字幕av蜜桃 | 日韩欧美卡一卡二 | 国产美女网站视频 | 美女福利片| 黄色三级小视频 | 好吊妞视频在线观看 | 蜜桃臀av | 免费日韩网站 |