日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 服務(wù)器 > TensorFlow入門和示例分析

TensorFlow入門和示例分析

來源:程序員人生   發(fā)布時(shí)間:2017-02-24 11:07:34 閱讀次數(shù):3847次

  本文以TensorFlow源碼中自帶的手寫數(shù)字辨認(rèn)Example為例,引出TensorFlow中的幾個(gè)主要概念。并結(jié)合Example源碼1步步分析該模型的實(shí)現(xiàn)進(jìn)程。

1、甚么是TensorFlow

  在這里,引入TensorFlow中文社區(qū)首頁中的兩段描寫。

關(guān)于 TensorFlow
TensorFlow? 是1個(gè)采取數(shù)據(jù)流圖(data flow
graphs),用于數(shù)值計(jì)算的開源軟件庫。節(jié)點(diǎn)(Nodes)在圖中表示數(shù)學(xué)操作,圖中的線(edges)則表示在節(jié)點(diǎn)間相互聯(lián)系的多維數(shù)據(jù)數(shù)組,即張量(tensor)。它靈活的架構(gòu)讓你可以在多種平臺上展開計(jì)算,例如臺式計(jì)算機(jī)中的1個(gè)或多個(gè)CPU(或GPU),服務(wù)器,移動(dòng)裝備等等。TensorFlow
最初由Google大腦小組(隸屬于Google機(jī)器智能研究機(jī)構(gòu))的研究員和工程師們開發(fā)出來,用于機(jī)器學(xué)習(xí)和深度神經(jīng)網(wǎng)絡(luò)方面的研究,但這個(gè)系統(tǒng)的通用性使其也可廣泛用于其他計(jì)算領(lǐng)域。

甚么是數(shù)據(jù)流圖(Data Flow Graph)?
數(shù)據(jù)流圖用“結(jié)點(diǎn)”(nodes)和“線”(edges)的有向圖來描寫數(shù)學(xué)計(jì)算。“節(jié)點(diǎn)”
1般用來表示施加的數(shù)學(xué)操作,但也能夠表示數(shù)據(jù)輸入(feed in)的出發(fā)點(diǎn)/輸出(push
out)的終點(diǎn),或是讀取/寫入持久變量(persistent
variable)的終點(diǎn)。“線”表示“節(jié)點(diǎn)”之間的輸入/輸出關(guān)系。這些數(shù)據(jù)“線”可以輸運(yùn)“size可動(dòng)態(tài)調(diào)劑”的多維數(shù)據(jù)數(shù)組,即“張量”(tensor)。張量從圖中流過的直觀圖象是這個(gè)工具取名為“Tensorflow”的緣由。1旦輸入真?zhèn)€所有張量準(zhǔn)備好,節(jié)點(diǎn)將被分配到各種計(jì)算裝備完成異步并行地履行運(yùn)算。

2、示例

  接下來的示例中,主要使用到以下兩個(gè)文件。

mnist.py
fully_connected_feed.py

  該示例的目的是建立1個(gè)手寫圖象辨認(rèn)模型,通過該模型,可以準(zhǔn)確辨認(rèn)輸入的28 * 28像素的手寫圖片是0~9這10個(gè)數(shù)字中的哪個(gè)。

1、運(yùn)行文件準(zhǔn)備

  需要下載好tensorflow源代碼,注意這里的源代碼版本需要與安裝的TensorFlow版本保持1致。
  在/home/mlusr/files/tensorflow/下解緊縮該文件。進(jìn)入示例文件路徑中,運(yùn)行

cd ~/files/tensorflow/tensorflow-r0.11/tensorflow/examples/tutorials/mnist
python fully_connected_feed.py

  運(yùn)行進(jìn)程中,需要聯(lián)網(wǎng)下載訓(xùn)練數(shù)據(jù),數(shù)據(jù)文件保存到~/files/tensorflow/tensorflow-r0.11/tensorflow/examples/tutorials/mnist/data路徑下,如果不能聯(lián)網(wǎng)的話,可以手動(dòng)到http://yann.lecun.com/exdb/mnist/,下載好以下4個(gè)文件,放入data目錄。

t10k-images-idx3-ubyte.gz
t10k-labels-idx1-ubyte.gz
train-images-idx3-ubyte.gz
train-labels-idx1-ubyte.gz

2、運(yùn)行

  直接運(yùn)行fully_connected_feed.py文件。

python fully_connected_feed.py

  輸出信息以下:

Extracting data/train-images-idx3-ubyte.gz
Extracting data/train-labels-idx1-ubyte.gz
Extracting data/t10k-images-idx3-ubyte.gz
Extracting data/t10k-labels-idx1-ubyte.gz
Step 0: loss = 2.30 (0.007 sec)
Step 100: loss = 2.13 (0.005 sec)
Step 200: loss = 1.87 (0.004 sec)
Step 300: loss = 1.55 (0.004 sec)
Step 400: loss = 1.26 (0.004 sec)
Step 500: loss = 0.87 (0.004 sec)
Step 600: loss = 0.87 (0.004 sec)
Step 700: loss = 0.65 (0.005 sec)
Step 800: loss = 0.43 (0.004 sec)
Step 900: loss = 0.65 (0.005 sec)
Training Data Eval:
  Num examples: 55000  Num correct: 47184  Precision @ 1: 0.8579
Validation Data Eval:
  Num examples: 5000  Num correct: 4349  Precision @ 1: 0.8698
Test Data Eval:
  Num examples: 10000  Num correct: 8663  Precision @ 1: 0.8663
Step 1000: loss = 0.47 (0.006 sec)
Step 1100: loss = 0.40 (0.051 sec)
Step 1200: loss = 0.55 (0.005 sec)
Step 1300: loss = 0.43 (0.004 sec)
Step 1400: loss = 0.39 (0.004 sec)
Step 1500: loss = 0.57 (0.005 sec)
Step 1600: loss = 0.50 (0.004 sec)
Step 1700: loss = 0.37 (0.005 sec)
Step 1800: loss = 0.38 (0.006 sec)
Step 1900: loss = 0.35 (0.004 sec)
Training Data Eval:
  Num examples: 55000  Num correct: 49292  Precision @ 1: 0.8962
Validation Data Eval:
  Num examples: 5000  Num correct: 4525  Precision @ 1: 0.9050
Test Data Eval:
  Num examples: 10000  Num correct: 9027  Precision @ 1: 0.9027

3、啟動(dòng)TensorBoard并查看

  在啟動(dòng)TensorBoard時(shí)注意指定輸出log文件路徑,在本例中啟動(dòng)命令以下

tensorboard --logdir /home/mlusr/files/tensorflow/tensorflow-r0.11/tensorflow/examples/tutorials/mnist/data

  啟動(dòng)輸出信息以下所示:

Starting TensorBoard 29 on port 6006
(You can navigate to http://192.168.1.100:6006)

  閱讀器訪問頁面指定ip和端口:
  這里寫圖片描述

  在TensorBoard中還可以查看該模型的更多信息。
  
  本文接下來的部份,將以mnist.pyfully_connected_feed.py兩個(gè)文件中的內(nèi)容

2、數(shù)據(jù)下載和輸入

  MNIST的數(shù)據(jù)主要分成以下3個(gè)部份,
  

數(shù)據(jù)集 作用
data_sets.train 55000條image和label數(shù)據(jù),主要用于訓(xùn)練模型
data_sets.validation 5000條image和label數(shù)據(jù),用于在迭代進(jìn)程中肯定模型準(zhǔn)確率
data_sets.test 10000條image和label數(shù)據(jù),用于終究評估模型的準(zhǔn)確率

1、概念1:Placeholder

  Placeholder的更多描寫,請看這里。使用Placeholder的地方,在構(gòu)造Graph時(shí)其實(shí)不包括實(shí)際的數(shù)據(jù),只是在利用運(yùn)行時(shí)才會(huì)動(dòng)態(tài)的用數(shù)據(jù)來替換。

  在fully_connected_feed.py文件中的placeholder_inputs方法中,通過調(diào)用tf.placeholder方法分別生成了代表imageslabelsplaceholder

IMAGE_SIZE = 28
IMAGE_PIXELS = IMAGE_SIZE * IMAGE_SIZE

images_placeholder = tf.placeholder(tf.float32, shape=(batch_size, mnist.IMAGE_PIXELS))
labels_placeholder = tf.placeholder(tf.int32, shape=(batch_size))

  在生成placeholder時(shí),只需要指定其中的數(shù)據(jù)類型,和維度。上面images_placeholder中的元素為float類型,維度為batch_size * IMAGE_PIXELSlagels_placeholder中的元素為int類型,維度為batch_sizebatch_size參數(shù)在程序調(diào)用placeholder_inputs時(shí)指定。

  看到這里可以發(fā)現(xiàn)images_placeholder和labels_placeholder僅僅只是指定了其中元素的類型和shape,具體數(shù)值是在后續(xù)程序運(yùn)行時(shí)才會(huì)填充進(jìn)來的。所以叫做Placeholder。在這里這兩個(gè)Placeholder代表了輸入的兩個(gè)數(shù)據(jù)源。

3、概念2:Graph

  
  Graph是TensorFlow中又1個(gè)重要概念。Graph可以理解成TensorFlow中的1個(gè)調(diào)劑好參數(shù)的履行計(jì)劃。構(gòu)建好這個(gè)Graph以后,所有輸入數(shù)據(jù),中間轉(zhuǎn)換進(jìn)程,和輸出數(shù)據(jù)的流程和格式便固定下來,數(shù)據(jù)進(jìn)入Graph后依照特定的結(jié)構(gòu)和參數(shù),就可以得到對應(yīng)的輸出結(jié)果。以下圖所示:
  這里寫圖片描述

  構(gòu)建1個(gè)Graph主要分成以下3步。

1、肯定Graph結(jié)構(gòu)

  inference方法,以images_placeholder作為輸入,連接到維度為(28 * 28, 128)的隱層1,隱層1連接到維度為(128, 32)的隱層2,最后的輸出層logits為10個(gè)節(jié)點(diǎn)。各層之間的激活函數(shù)為Relu
  
  下面代碼中使用到的常量

IMAGE_SIZE = 28
IMAGE_PIXELS = IMAGE_SIZE * IMAGE_SIZE
flags.DEFINE_integer('hidden1', 128, 'Number of units in hidden layer 1.')
flags.DEFINE_integer('hidden2', 32, 'Number of units in hidden layer 2.')
NUM_CLASSES = 10

  構(gòu)建隱層1,

with tf.name_scope('hidden1'):
 weights = tf.Variable(tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
                       stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))),
                       name='weights')
 biases = tf.Variable(tf.zeros([hidden1_units]),
                      name='biases')

  上面定義了兩個(gè)Variableweights表示連接權(quán)重,biases表示偏置量。
  biases比較簡單,定義了1個(gè)名為biases的元素全為0的變量,其長度為hiden1_units,默許為128
  weights的維度為IMAGE_PIXELS * hidden1_units,其中的初始值為標(biāo)準(zhǔn)差為1 / math.sqrt(float(IMAGE_PIXELS)的截?cái)嗾龖B(tài)散布值。

  構(gòu)建隱層2,

with tf.name_scope('hidden2'):
  weights = tf.Variable(tf.truncated_normal([hidden1_units, hidden2_units],
                        stddev =1.0 / math.sqrt(float(hidden1_units))),
                        name = 'weights')
  biases = tf.Variable(tf.zeros([hidden2_units]),
                       name ='biases')

  構(gòu)建輸出層,

with tf.name_scope('softmax_linear'):
  weights = tf.Variable(tf.truncated_normal([hidden2_units, NUM_CLASSES] ,
                        stddev =1.0 / math.sqrt(float(hidden2_units))) ,
                        name = 'weights')
  biases = tf.Variable(tf.zeros([NUM_CLASSES]),
                       name ='biases')

  基于上面的權(quán)重和偏置量值,使用relu激活函數(shù)連接各層,

hidden1 = tf.nn.relu(tf.matmul(images, weights) + biases)
hidden2 = tf.nn.relu(tf.matmul(hidden1, weights) + biases)
logits = tf.matmul(hidden2, weights) + biases

  前面的3組weightsbiases變量名都相同,辨別的辦法是前面的with tf.name_scope('hidden1')。在hidden1命名空間下的wiehts參數(shù)的完全表示為"hidden1/weights"

2、肯定損失函數(shù)

  上1步肯定好模型各層結(jié)構(gòu)和參數(shù)后,接下來需要定義1個(gè)損失函數(shù)的計(jì)算邏輯。
  在mnist.py文件中有1個(gè)loss()方法,輸入兩個(gè)參數(shù),第1個(gè)為上面模型的輸出結(jié)果logits,第2個(gè)為images對應(yīng)的實(shí)際labels,在調(diào)用該方法時(shí),傳入的是前面定義的labels_placeholder
  

def loss(logits, labels):
  labels = tf.to_int64(labels)
  cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
      logits, labels , name = 'xentropy')
  loss = tf.reduce_mean(cross_entropy, name ='xentropy_mean')
  return loss

  上面的tf.nn.sparse_softmax_cross_entropy_with_logits會(huì)根據(jù)labels的內(nèi)容自動(dòng)生成1-hot編碼,并且計(jì)算與輸出logits的1-hot編碼的交叉熵[cross entropy][http://blog.csdn.net/rtygbwwwerr/article/details/50778098])
  最后,調(diào)用reduce_mean方法,計(jì)算交叉熵的平均值。

3、參數(shù)訓(xùn)練

  
  調(diào)用training方法的調(diào)用情勢為,傳入上面的損失值和學(xué)習(xí)率。

train_op = mnist.training(loss, FLAGS.learning_rate)

  接下來,mnist.py文件中的training方法,將使用梯度降落法來計(jì)算使得損失值最小的模型參數(shù)。首先將損失值loss傳入tf.scala_summary中,這個(gè)操作主要是用于在后面使用SummaryWriter時(shí)向events file中生成求和值,將每次得到的損失值寫出到事件文tf.scalar_summary(loss.op.name, loss)后,調(diào)用tf.train.GradientDesecentOptimizer按指定的學(xué)習(xí)率實(shí)現(xiàn)梯度降落算法。
  

# Create the gradient descent optimizer with the given learning rate.
optimizer = tf.train.GradientDescentOptimizer(learning_rate)

  最后,使用1個(gè)名為global_stepvariable來記錄每次訓(xùn)練的步長。optimizer.minimize操作用于更新系統(tǒng)的權(quán)重,同時(shí)增加步長。

# Create a variable to track the global step.
global_step = tf.Variable(0, name = 'global_step', trainable =False)
# Use the optimizer to apply the gradients that minimize the loss
# (and also increment the global step counter) as a single training step.
train_op = optimizer.minimize(loss, global_step=global_step)

4、訓(xùn)練模型

  當(dāng)?shù)?步中的Graph構(gòu)造完成以后,就能夠迭代的訓(xùn)練和評估模型了。

1、Graph

  在run_training()方法的最前面,使用1個(gè)with命令表明所有的操作都要與tf.Graph的默許全局graph相干聯(lián)。

with tf.Graph().as_default():

  tf.Graph表示需要在1起運(yùn)行的操作集合。在大多數(shù)情況下,TensorFlow使用1個(gè)默許的graph就已夠用了。

2、Session

  接下來就需要為利用運(yùn)行準(zhǔn)備環(huán)境了。在TensorFlow中使用的是Session

sess = tf.Session()

  另外,除按上面這行代碼生成sess對象外,還可使用with命令生成,以下所示,

with tf.Session() as sess:

  在取得sess對象后,首先可以將之前定義的variable進(jìn)行初始化,

init = tf.initialize_all_variables()
sess.run(init)

3、循環(huán)訓(xùn)練

  初始化以后就能夠開始循環(huán)訓(xùn)練模型了。
  可以通過以下代碼實(shí)現(xiàn)1個(gè)最簡單的訓(xùn)練循環(huán),在這個(gè)循環(huán)中可以控制每次循環(huán)的步長。

for step in xrange(FLAGS.max_steps):
    sess.run(train_op)

  但是在本教程中的例子比較復(fù)雜。這是由于必須把輸入的數(shù)據(jù)根據(jù)每步的情況進(jìn)行切分,替換到之前的placeholder處。具體可以繼續(xù)看以下部份。

4、向Graph輸入數(shù)據(jù)

  TensorFlow的feed機(jī)制可以在利用運(yùn)行時(shí)向Graph輸入數(shù)據(jù)。在每步訓(xùn)練進(jìn)程中,首先會(huì)根據(jù)訓(xùn)練數(shù)據(jù)生成1個(gè)feed dictionary,這里面會(huì)包括本次循環(huán)中使用到的訓(xùn)練數(shù)據(jù)集。

feed_dict = fill_feed_dict(data_sets.train,
                           images_placeholder,
                           labels_placeholder)

  fill_feed_dict方法以下,每次從訓(xùn)練數(shù)據(jù)集中根據(jù)batch_size取出指定數(shù)量的images_feedlabels_feed,然后以images_pllabels_plkey存入字典中。

def fill_feed_dict (data_set, images_pl, labels_pl):
  images_feed, labels_feed = data_set.next_batch(FLAGS.batch_size,
                                                 FLAGS.fake_data)
  feed_dict = {
      images_pl: images_feed,
      labels_pl: labels_feed,
  }
  return feed_dict

5、檢查狀態(tài)

  接下來以上面獲得到的每一個(gè)batch的數(shù)據(jù)開始履行訓(xùn)練進(jìn)程。

for step in xrange(FLAGS.max_steps):
    feed_dict = fill_feed_dict(data_sets.train,
                              images_placeholder,
                              labels_placeholder)
    _, loss_value = sess.run([train_op, loss],
                            feed_dict=feed_dict)

  在這里傳入train_oploss后,sess.run方法返回1個(gè)包括兩個(gè)Tensortuple對象。由于train_op并沒有返回值,所以只記錄loss的返回值loss_value

  假定訓(xùn)練進(jìn)程很正常,那末每過100次訓(xùn)練將會(huì)打印1次當(dāng)前的loss值,

if step % 100 == 0 :
  print ('Step %d: loss = %.2f (%.3f sec)' % (step, loss_value, duration))

6、狀態(tài)可視化

  在上面每隔100次打印1次loss值以外,還有兩個(gè)操作將當(dāng)前的loss值寫入到事件文件中,供TensorBoard作展現(xiàn)用。

  summary_str = sess.run(summary, feed_dict=feed_dict)
  summary_writer.add_summary(summary_str, step)
  summary_writer.flush()

7、設(shè)置檢查點(diǎn)

  在TensorFlow中使用tf.train.Saver將訓(xùn)練好的模型進(jìn)行保存。

saver = tf.train.Saver()

  在循環(huán)訓(xùn)練進(jìn)程中,saver.save()方法會(huì)定期履行,用于將模型當(dāng)前狀態(tài)寫入到檢查點(diǎn)文件中。

checkpoint_file = os.path.join(FLAGS.log_dir , 'model.ckpt')
saver.save(sess, checkpoint_file, global_step =step)

  如果需要使用到該檢查點(diǎn)文件中保存的模型時(shí),可使用saver.restore()方法進(jìn)行加載,

saver.restore(sess, FLAGS.train_dir)

5、評估模型

  在每次保存檢查點(diǎn)文件時(shí),會(huì)同時(shí)計(jì)算此時(shí)模型在訓(xùn)練數(shù)據(jù)集,檢驗(yàn)數(shù)據(jù)集和測試數(shù)據(jù)集上的誤差。

print('Training Data Eval:')
do_eval(sess,
        eval_correct,
        images_placeholder,
        labels_placeholder,
        data_sets.train)
# Evaluate against the validation set.
print ('Validation Data Eval:')
do_eval(sess,
        eval_correct,
        images_placeholder,
        labels_placeholder,
        data_sets.validation)
# Evaluate against the test set.
print ('Test Data Eval:')
do_eval(sess,
        eval_correct,
        images_placeholder,
        labels_placeholder,
        data_sets.test)

1、建立評估Graph

  注意上面代碼中的do_eval方法,和該方法的eval_correct參數(shù)。eval_correct操作是在循環(huán)開始前就已定義好了的。

eval_correct = mnist.evaluation(logits, labels_placeholder)

  這個(gè)evaluation從參數(shù)上看是用于比較預(yù)測值與真實(shí)值直接的差異。

def evaluation (logits, labels):
  correct = tf.nn.in_top_k(logits, labels, 1)
  return tf.reduce_sum(tf.cast(correct, tf.int32))

  返回1個(gè)長度為batch_sizetensor,如果預(yù)測值與真實(shí)值相同則為true,否則為false

2、評估模型輸出

  最后,在do_eval方法中,處理該誤差并輸出。類似于模型訓(xùn)練進(jìn)程中,這里也創(chuàng)建1個(gè)feed_dict對象,在給定的數(shù)據(jù)集上調(diào)用sess.run方法,計(jì)算預(yù)測值中有多少與實(shí)際值相1致。

for step in xrange(steps_per_epoch):
  feed_dict = fill_feed_dict(data_set,
                             images_placeholder,
                             labels_placeholder)
  true_count += sess.run(eval_correct, feed_dict =feed_dict)

  最后,將預(yù)測正確的記錄數(shù)與當(dāng)前的總數(shù)據(jù)數(shù)進(jìn)行比較,得到本次的預(yù)測精度。

precision = float(true_count) / num_examples
print ('Num examples: %d Num correct: %d Precision @ 1: %0.04f' %
      (num_examples, true_count, precision))
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 日韩一区二区欧美 | 久久综合99 | av亚洲在线 | 国产一二三区在线 | 亚洲性综合网 | 91cn在线观看 | 日韩精品福利视频 | 免费在线观看av网站 | 国产剧情精品一区 | 成人国产综合 | a级片一区二区三区 | 久久国产亚洲精品 | 一区二区三区在线视频免费观看 | 久久国产精品一区二区 | 久久99精品久久久久久久久久久久 | 亚洲美女性视频 | 亚洲一级一级 | av一区在线 | 亚洲成人中文字幕 | 成人福利免费在线观看 | 久久久久精 | 成人免费在线电影 | 欧美一a一片一级一片 | 日韩一级免费 | 99国产精品国产精品久久 | 国产精品久久久久久影视 | 精品国产乱码久久久久久图片 | 久久久www成人免费精品张筱雨 | 精品国产一二三区 | 亚洲一区二区三区四区五区六 | 欧美视频日韩 | 草久色 | 免费福利在线视频 | 性视频网| 国产麻豆乱码精品一区二区三区 | 中文字幕亚洲国产 | 国产成人a亚洲精品 | 午夜久久av | 丁香婷婷综合网 | 中文字幕一区二区三区四区不卡 | 日日爱668 |