2.5 tensorflow運(yùn)作方式入門的筆記
輸入與占位符:
定義傳入圖表的參數(shù)shape,后續(xù)訓(xùn)練過(guò)程中使用feed_dict參數(shù),將數(shù)據(jù)傳入session.run()函數(shù)
tf.placeholder(tf.int32, shape=(batch_size)) ??
構(gòu)建圖表:推理、損失和訓(xùn)練
推理:盡可能地構(gòu)建圖表,做到返回包含了預(yù)測(cè)結(jié)果(output prediction)的Tensor
1.定義權(quán)重和偏差并初始化操作
2.定義模型層次構(gòu)成
損失:函數(shù)通過(guò)添加所需的損失操作,進(jìn)一步構(gòu)建圖表。
1.首先將標(biāo)簽轉(zhuǎn)換為one-hot形式
batch_size = tf.size(labels) ? ? ? ?#返回tensor labels的形狀
labels = tf.expand_dims(labels,1) ?#張量在1維上增加~ shape[n,1]
indices = tf.expand_dims(tf.range(0, batch_size,1),1) ?#與label一一對(duì)應(yīng)的index
concated = tf.concat( [indices, labels],1) ?#數(shù)據(jù)組合
onehot_labels = tf.sparse_to_dense( concated, tf.pack([batch_size, NUM_CLASSES]),1.0,0.0) ?#就是講矩陣concated變?yōu)橐粋€(gè)batch_size*NUM_CLASSES的矩陣,其中concated中每一行有兩列,第一個(gè)數(shù)表示行號(hào),第二個(gè)數(shù)表示label的類別,變?yōu)槌砻芫仃囈院?,設(shè)第i行中l(wèi)abel值為3,則稠密矩陣的第i行中第3列為1,該行其他列數(shù)值為0
attension:!tensorflow后面版本把pack更新為stack()函數(shù)!
? ? ? ? ? ? ? ? ? ? ? ?。f.concat函數(shù)版本不同參數(shù)設(shè)置不同,新版本的維度在后,value在前!!
???????????????????????。?!tensorflow中只有經(jīng)過(guò)Session后才能看到運(yùn)行的結(jié)果,不可以直接 print?。?!
詳解函數(shù):
?tf.concat(values,concat_dim ) ?函數(shù)用來(lái)連接兩個(gè)tensor.
????參數(shù):values:表示兩個(gè)或者一組待連接的tensor.
????concat_dim:表示在哪一維上連接,必須是一個(gè)數(shù).如果concat_dim=0,表示在第一個(gè)維度上連,相當(dāng)于疊放到列上;
????如果concat_dim是1,表示在第二個(gè)維度上連
!如果要連接兩個(gè)向量,必須要調(diào)用tf.expand_dims()函數(shù)來(lái)擴(kuò)維,這就是在調(diào)用tf.concat()函數(shù)前先調(diào)用tf.expand_dims()函數(shù)的原因。
?tf.sparse_to_dense(sparse_indices, output_shape, sparse_values, default_value)可以用來(lái)生成稀疏矩陣.
????參數(shù):sparse_indices:稀疏矩陣中那些個(gè)別元素對(duì)應(yīng)的索引值。
? ? 有三種情況:?
????sparse_indices是個(gè)數(shù),那么它只能指定一維矩陣的某一個(gè)元素.?
????sparse_indices是個(gè)向量,那么它可以指定一維矩陣的多個(gè)元素.?
????sparse_indices是個(gè)矩陣,那么它可以指定二維矩陣的多個(gè)元素.
????output_shape:輸出的稀疏矩陣的shape.
????sparse_values:個(gè)別元素的值,即第一個(gè)參數(shù)選中的位置的值.
????分為兩種情況:?sparse_values是個(gè)數(shù),那么所有索引指定的位置都用這個(gè)數(shù).
? sparse_values是個(gè)向量,那么輸出矩陣的某一行向量里某一行對(duì)應(yīng)的數(shù)(因此這里向量的長(zhǎng)度應(yīng)該和輸出矩陣的行數(shù)應(yīng)該對(duì)應(yīng),不然會(huì)報(bào)錯(cuò)).
????default_value:未指定元素的默認(rèn)值,如果是稀疏矩陣,則應(yīng)該為0.
? ? ?tf.stack(values, axis=0)函數(shù)將一系列rank-R的tensor打包為一個(gè)rank-(R+1)的tensor
測(cè)試實(shí)驗(yàn)結(jié)果如下:
label = [3,5]
print (tf.shape(label))
index = tf.range(0,2)
print (tf.shape(index))
labels = tf.expand_dims(label,1)
indexs = tf.expand_dims(index,1)
print (tf.shape(labels))
print (tf.shape(indexs))
concated = tf.concat([indexs,labels],1)
one_hot = tf.sparse_to_dense(concated,tf.stack([2,10]),1.0,0.0)
with tf.Session() as sess:
? ? result = sess.run(one_hot)
? ? print (result)
結(jié)果如下:

2.計(jì)算交叉熵來(lái)比較inference()函數(shù)與所生成標(biāo)簽的輸出logits tensor。
?cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits, onehot_labels, name='xentropy')
參數(shù):
logits:神經(jīng)網(wǎng)絡(luò)最后一層的輸出,如果有batch的話,它的大小就是[batchsize,num_classes],單樣本的話,大小就是num_classes
labels:實(shí)際的標(biāo)簽,大小同上
返回值:一維向量,長(zhǎng)度為batch_size.
然后計(jì)算batch維度下的交叉熵平均值為loss:
?loss = tf.reduce_mean(cross_entropy, name='xentropy_mean')
訓(xùn)練:添加通過(guò)梯度下降(gradient descent)將損失最小化所需的操作
1.獲取損失loss tensor
tf.scalar_summary(loss.op.name, loss)
2.實(shí)例化梯度下降器
optimizer = tf.train.GradientDescentOptimizer(FLAGS.learning_rate)
3.生成一個(gè)保存全局訓(xùn)練步驟的數(shù)值,使用minimize()函數(shù)更新權(quán)重
global_step = tf.Variable(0, name='global_step', trainable=False)
train_op = optimizer.minimize(loss, global_step=global_step)
狀態(tài)可視化:
1.將所有即時(shí)數(shù)據(jù)在圖表構(gòu)建階段合并至一個(gè)操作中
summary_op = tf.merge_all_summaries()
2.實(shí)例化事件文件
summary_writer = tf.train.SummaryWriter(FLAGS.train_dir,graph_def=sess.graph_def)
summary_str = sess.run(summary_op, feed_dict=feed_dict)
summary_writer.add_summary(summary_str, step)
保存檢查點(diǎn):用于恢復(fù)模型來(lái)進(jìn)一步訓(xùn)練或評(píng)估
1.實(shí)例化tf.train.Saver
2.saver.save
3.saver.restore