計(jì)算機(jī)視覺學(xué)習(xí)——tensorflow認(rèn)識(shí)

一直焙、tensorflow初體驗(yàn)
tensorflow與原生python語(yǔ)言不太相同,tensorflow將每個(gè)對(duì)象都封裝成一個(gè)tensor類型

a = tf.constant(10.0)
print(a)

輸入結(jié)果:


結(jié)果.png

python原生語(yǔ)言實(shí)現(xiàn)加法 VS tensorflow實(shí)現(xiàn)加法:

import tensorflow as tf

# 1. python實(shí)現(xiàn)加法
a_py = 10.0
b_py = 10.0
c_py = a_py + b_py
print('python原生語(yǔ)言計(jì)算a+b={}'.format(c_py))
# 2. tensorflow實(shí)現(xiàn)加法
a = tf.constant(10.0)
b = tf.constant(20.0)
c = tf.add(a, b)
with tf.Session() as sess:# 打印出tensor對(duì)象的值必須在會(huì)話中打印
    print('tensorflow計(jì)算a+b={}'.format(sess.run(c)))
結(jié)果一.png

結(jié)果二.png

二、tensorflow結(jié)構(gòu)分析
tensorflow程序結(jié)構(gòu)就是一個(gè)數(shù)據(jù)流的執(zhí)行 過程,在tensorflow中數(shù)據(jù)會(huì)被看做一個(gè)個(gè)張量,操作會(huì)被看做一個(gè)個(gè)節(jié)點(diǎn)滔岳,tensorflow把這些操作和節(jié)點(diǎn)看構(gòu)建成一個(gè)圖,然后執(zhí)行這個(gè)圖挽牢。


tensorflow結(jié)構(gòu)分析.png

1.認(rèn)識(shí)tensorflow中的圖

圖包含了一組tf.Operation代表的計(jì)算單元對(duì)象和tf.Tensor代表的計(jì)算單元之間流動(dòng)的數(shù)據(jù)谱煤。
2.圖的相關(guān)操作
(1)默認(rèn)圖tensorflow會(huì)為我們的程序創(chuàng)建一張默認(rèn)的圖:tf.get_default_graph()

import tensorflow as tf
a = tf.constant(10.0)
b = tf.constant(20.0)
c = tf.add(a, b)
graph = tf.get_default_graph()

print("graph:", graph)
print("a_graph:", a.graph)
print("b_graph:", b.graph)
print("c_graph:", c.graph)

with tf.Session() as sess:
    res = sess.run(c)
    print("sess_graph:", sess.graph)
    print(res)

查看打印結(jié)果可以發(fā)現(xiàn),所有的節(jié)點(diǎn)操作會(huì)話的地址都和默認(rèn)圖的地址是一樣的


結(jié)果.png

(2)創(chuàng)建圖:tf.Graph()

def graph_demo():
    # 圖的演示
    a_t = tf.constant(10)
    b_t = tf.constant(20)
    # 不提倡直接運(yùn)用這種符號(hào)運(yùn)算符進(jìn)行計(jì)算
    # 更常用tensorflow提供的函數(shù)進(jìn)行計(jì)算
    # c_t = a_t + b_t
    c_t = tf.add(a_t, b_t)
    print("tensorflow實(shí)現(xiàn)加法運(yùn)算:\n", c_t)

    # 獲取默認(rèn)圖
    default_g = tf.get_default_graph()
    print("獲取默認(rèn)圖:\n", default_g)

    # 數(shù)據(jù)的圖屬性
    print("a_t的graph:\n", a_t.graph)
    print("b_t的graph:\n", b_t.graph)
    # 操作的圖屬性
    print("c_t的graph:\n", c_t.graph)

    # 自定義圖
    new_g = tf.Graph()
    print("自定義圖:\n", new_g)
    # 在自定義圖中去定義數(shù)據(jù)和操作
    with new_g.as_default():
        new_a = tf.constant(30)
        new_b = tf.constant(40)
        new_c = tf.add(new_a, new_b)

    # 數(shù)據(jù)的圖屬性
    print("new_a的graph:\n", new_a.graph)
    print("new_b的graph:\n", new_b.graph)
    # 操作的圖屬性
    print("new_c的graph:\n", new_c.graph)

    # 開啟會(huì)話
    with tf.Session() as sess:
        sum_t = sess.run(c_t)
        print("在sess當(dāng)中的sum_t:\n", sum_t)
        # 會(huì)話的圖屬性
        print("會(huì)話的圖屬性:\n", sess.graph)
        # 不同的圖之間不能互相訪問
        # sum_new = sess.run(new_c)
        # print("在sess當(dāng)中的sum_new:\n", sum_new)

    with tf.Session(graph=new_g) as sess2:
        sum_new = sess2.run(new_c)
        print("在sess2當(dāng)中的sum_new:\n", sum_new)
        print("會(huì)話的圖屬性:\n", sess2.graph)

    # 很少會(huì)同時(shí)開啟不同的圖禽拔,一般用默認(rèn)的圖就夠了
    return None

3.圖的可視化學(xué)習(xí):tensorbroad的使用
首先需要下載好tensorbroad刘离,在虛擬環(huán)境中選擇pip安裝即可。
使用tf.summary.Filewriter(arg1,arg2);第一個(gè)參數(shù)傳保存位置睹栖,第二個(gè)參數(shù)傳遞指定的圖

import tensorflow as tf
a = tf.constant(10.0)
b = tf.constant(20.0)
c = tf.add(a, b)
graph = tf.get_default_graph()

print("graph:", graph)
print("a_graph:", a.graph)
print("b_graph:", b.graph)
print("c_graph:", c.graph)

with tf.Session() as sess:
    res = sess.run(c)
    print("sess_graph:", sess.graph)
    tf.summary.FileWriter('./tmp/summary/', graph=sess.graph)
    print(res)
可視化操作.png

運(yùn)行之后可以發(fā)現(xiàn)在指定的目錄下多了個(gè)文件硫惕,我們進(jìn)入該目錄下執(zhí)行


可視化命令.png

進(jìn)入指定的端口:


可視化結(jié)果.png

三、tensorflow幾個(gè)名詞
1.會(huì)話:會(huì)話是用來執(zhí)行定義好的運(yùn)算野来,會(huì)話擁有并管理TensorFlow程序運(yùn)行時(shí)的所有資源恼除,所有計(jì)算完成之后需要關(guān)閉會(huì)話來幫助系統(tǒng)回收資源,否則就可能出現(xiàn)資源泄露的問題曼氛,所以我們常用上下文with來使用會(huì)話如:
with tf.Session() as sess:
    """開啟會(huì)話使用資源"""

ps:會(huì)話的run()方法可以傳入一個(gè)數(shù)組進(jìn)去豁辉,一次執(zhí)行很多的計(jì)算結(jié)果

import tensorflow as tf
a = tf.constant(10.0)
b = tf.constant(20.0)
c = tf.add(a, b)
graph = tf.get_default_graph()
with tf.Session() as sess:
    sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True,
                                            log_device_placement=True))#打印出設(shè)備信息
    a_res,b_res,c_res = sess.run([a,b,c])
    print("sess_graph:", sess.graph)
    tf.summary.FileWriter('./tmp/summary/', graph=sess.graph)
    print(f"a:{a_res},b:{b_res},c:{c_res}")

同時(shí)我們可以使用placeholder占位符,一開始不給對(duì)象設(shè)置舀患,在會(huì)話內(nèi)執(zhí)行的時(shí)候設(shè)值:

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
c = tf.add(a, b)
with tf.Session() as sess:
    sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True,
                                            log_device_placement=True))
    res = sess.run(c, feed_dict={a: 10.0, b: 20.0})
    print(res)

2.張量:TensorFlow用張量這種數(shù)據(jù)結(jié)構(gòu)來表示所有的數(shù)據(jù).你可以把一個(gè)張量想象成一個(gè)n維的數(shù)組或列表.一個(gè)張量有一個(gè)靜態(tài)類型和動(dòng)態(tài)類型的維數(shù).張量可以在圖中的節(jié)點(diǎn)之間流通.其實(shí)張量更代表的就是一種多位數(shù)組徽级。
利用placeholder傳入數(shù)組進(jìn)行加法

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
c = tf.add(a, b)
with tf.Session() as sess:
    sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True,
                                            log_device_placement=True))
    res = sess.run(c, feed_dict={a: [10.0, 20.0], b: [20.0, 30.0]})
    print(res)

這里不做過多的贅述,只學(xué)習(xí)幾個(gè)創(chuàng)建張量的指令:
(1)tf.ones(shape,dtype,name):創(chuàng)建一個(gè)所有元素均為一的張量
(2)tf.zeros(shape,dtype,name):創(chuàng)建一個(gè)所有元素均為零的張量
(3)tf.constant(value,dtype,name):創(chuàng)建一個(gè)所有常數(shù)的張量
(4)tf.random_normal(shape,mean,stdddv,dtype,seed,name):創(chuàng)建一個(gè)隨機(jī)張量
3.變量op:TensorFlow變量是表示程序處理的共享持久狀態(tài)的最佳方法聊浅。變量通過 tf.Variable OP類以及tf.get_variable()類進(jìn)行操作餐抢。ps變量需要顯式初始化,才能運(yùn)行值

a = tf.Variable(initial_value=10.0, trainable=True)
b = tf.Variable(initial_value=20.0, trainable=True)
c = tf.add(a, b)
# 一定要顯示的初始化
init = tf.global_variables_initializer()
with tf.Session() as sess:
    res = sess.run(init)
    print(res)

四低匙、案例一:使用tensorflow訓(xùn)練一個(gè)簡(jiǎn)單的邏輯回歸旷痕,并使用tensorbroad展示出來
首先定義一個(gè)類,然后隨機(jī)初始化一組數(shù)據(jù)努咐,并按照某種線性規(guī)則生成一組真實(shí)值:

import tensorflow as tf


class MyLinearRegression(object):
    """手動(dòng)實(shí)現(xiàn)邏輯回歸"""
    def __init__(self):
        pass;
    def input(self):
        # 自己先手動(dòng)輸入一組數(shù)據(jù)
        x_train = tf.random_normal(shape=[100,1],mean=0,stddev=1,dtype=tf.float32,name="x_train");
        y_true = tf.matmul(x_train,[[0.7]]) + 0.8

        return x_train,y_true

給定輸入計(jì)算出預(yù)測(cè)值:

    def run(self, x_data):
        """為給定的輸入與輸出擬合出w和b"""
        # 1.首先隨機(jī)生成一個(gè)w
        self.weight = tf.Variable(tf.random_normal(shape=[1, 1], mean=0, stddev=1), name="weight")
        self.bias = tf.Variable(tf.random_normal(shape=[1, 1], mean=0, stddev=1), name="bias")
        # 2.計(jì)算預(yù)測(cè)值
        y_pre = tf.matmul(x_data,self.weight) + self.bias

        return y_pre

將每一次計(jì)算的w苦蒿,b和loss收集起來,方便我們?cè)趖ensorbroad中顯示

    def merge_summary(self,loss):
        """收集張量值"""
        tf.summary.scalar("losses",loss)
        tf.summary.histogram("w", self.weight)
        tf.summary.histogram("b", self.bias)

        # 收集了之后記得合并
        merged = tf.summary.merge_all()

        return merged

使用梯度下降優(yōu)化一次

    def sgd_op(self,loss):
        """使用梯度下降來訓(xùn)練"""
        optimizer = tf.train.GradientDescentOptimizer(0.1).minimize(loss)# 0.1是學(xué)習(xí)率
        return optimizer

開始迭代訓(xùn)練

      def train(self):
        """訓(xùn)練模型"""
        # 1.獲得默認(rèn)圖
        g = tf.get_default_graph()
        with g.as_default():
            # 隨機(jī)生成一組數(shù)
            x_data, y_true = self.input()
            # 計(jì)算出預(yù)測(cè)值
            y_pre = self.run(x_data)
            # 計(jì)算損失
            loss = self.loss(y_pre=y_pre, y_true=y_true)
            # 最優(yōu)化一次
            train_op = self.sgd_op(loss)
            # 收集結(jié)果
            merged = self.merge_summary(loss)
            # 保存參數(shù)
            saver = tf.train.Saver()
            # 開啟會(huì)話
            with tf.Session() as sess:
                # 初始化變量op
                init = tf.global_variables_initializer()
                sess.run(init)
                #print("初始化的權(quán)重:%f, 偏置:%f" % (self.weight.eval(), self.bias.eval()))
                # 開啟訓(xùn)練
                for i in range(100):
                    sess.run(train_op)
                    # print("訓(xùn)練第%d步之后的損失:%f, 權(quán)重:%f, 偏置:%f" % (
                    #     i,
                    #     loss.eval(),
                    #     self.weight.eval(),
                    #     self.bias.eval()))
                    file_writer = tf.summary.FileWriter("./tmp/summary/", graph=sess.graph)
                    # 收集計(jì)算結(jié)果
                    summary = sess.run(merged)
                    # 添加到文件
                    file_writer.add_summary(summary, i)

運(yùn)行程序后在tensorboard中查看損失的變化


loss.png

程序流圖.png

w&b.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渗稍,一起剝皮案震驚了整個(gè)濱河市佩迟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌竿屹,老刑警劉巖报强,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拱燃,居然都是意外死亡秉溉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來召嘶,“玉大人父晶,你說我怎么就攤上這事∨” “怎么了甲喝?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)铛只。 經(jīng)常有香客問我埠胖,道長(zhǎng),這世上最難降的妖魔是什么淳玩? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任直撤,我火速辦了婚禮,結(jié)果婚禮上蜕着,老公的妹妹穿的比我還像新娘谋竖。我一直安慰自己,他們只是感情好侮东,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布圈盔。 她就那樣靜靜地躺著豹芯,像睡著了一般悄雅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铁蹈,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天宽闲,我揣著相機(jī)與錄音,去河邊找鬼握牧。 笑死容诬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沿腰。 我是一名探鬼主播览徒,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼颂龙!你這毒婦竟也來了习蓬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤措嵌,失蹤者是張志新(化名)和其女友劉穎躲叼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體企巢,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枫慷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片或听。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡探孝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出誉裆,到底是詐尸還是另有隱情再姑,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布找御,位于F島的核電站元镀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏霎桅。R本人自食惡果不足惜栖疑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滔驶。 院中可真熱鬧遇革,春花似錦、人聲如沸揭糕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)著角。三九已至揪漩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吏口,已是汗流浹背奄容。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留产徊,地道東北人昂勒。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像舟铜,于是被迫代替她去往敵國(guó)和親戈盈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容