日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 网站一级片| 天堂欧美城网站 | 久久一二区 | 亚洲视频一区在线观看 | 日韩欧美高清一区 | 日本免费一区二区视频 | 亚洲欧美精品一区二区三区 | 徐锦江一级淫片免费看 | 污片免费在线观看 | 夜夜狠 | 小明成人免费视频 | 日韩综合中文字幕 | 国产做爰全免费的视频软件 | 黄色中文字幕在线观看 | 向日葵视频在线播放 | 日韩在线资源 | 青青草原国产在线 | 青青草视频播放器 | 人人爽爽爽 | a天堂资源| 曰批女人视频在线观看 | 国产在线欧美 | 日韩福利一区 | xxxwww18| 99视频久 | 成人区人妻精品一区二 | 成人午夜视频免费观看 | 国产在线视频一区 | 亚洲视频一区在线播放 | 国产一区二区三区三州 | 500部大龄熟乱视频 亚洲乱码精品 | 日韩av电影网 | 久草福利在线 | 亚洲欧美精品午睡沙发 | 黑人一级 | 国产一级爽片 | 特黄三级| 伊人伊人鲁 | 午夜少妇av | 男女插插插视频 | 日本黄色免费 | 黄色网址你懂的 | 亚洲欧美激情小说另类 | 免费看成人aa片无码视频羞羞网 | 三级网站免费观看 | 不卡一区二区三区四区 | 亚洲图片综合区 | 精品久久久久久久中文字幕 | 粉嫩av一区 | 欧美大片在线免费观看 | 特级做a爰片毛片免费69 | 艳妇乳肉豪妇荡乳 | 波多野结衣爱爱 | 久久精品天天中文字幕人妻 | 亚洲精品aaaa | 亚洲国产毛片aaaaa无费看 | 天堂在线免费观看 | 波多野结衣黄色网址 | 伊人艹| 欧美高清视频一区二区 | 国产三级国产精品国产国在线观看 | 一级a毛片免费观看久久精品 | 乱中年女人伦 | 日日夜夜av | 欧美色香蕉 | 亚洲午夜精品视频 | 日韩欧美视频在线免费观看 | 免费国产精品视频 | 久草免费新视频 | 国产精品视频无码 | 黄色av成人 | 欧美 丝袜 自拍 制服 另类 | 山村大伦淫第1部分阅读小说 | 操模特| 中国女人内96xxxxx | 免费看欧美黑人毛片 | 91香蕉在线视频 | 99精品毛片| 色诱久久av | 少妇视频一区二区三区 | 91免费福利视频 | 性av免费 | 丰满熟妇人妻中文字幕 | 永久视频在线 | 污视频免费在线 | 色播放| 亚欧洲精品视频 | 激情xxx| 国产福利小视频在线 | 久色婷婷| 激情视频久久 | 久久国产乱子伦免费精品 | 久久麻豆av | 中国免费毛片 | 久草视频精品在线 | 超碰免费公开 | 麻豆传媒一区二区三区 | 国产a级网站 | 国产成人在线视频网站 |