必須走如下步驟:
sess=tf.Session()
sess.run(result)
sess.close()
才能執行運算。
With tf.Session() as sess:
Sess.run()
通過會話計算結果:
with sess.as_default():
print(result.eval()) 表示輸出result的值
生成一個權重矩陣:
tf.Variable(tf.random_normal([2,3],stddev=2)) 通過滿足正態分佈的隨機數來初始化神經網絡中的參數是一個常用方法。
init_op=tf.global_variables_initializer() 初始化變量
變量類型在賦值後不能再改變,維度可以發生變化。
通過激活函數實現去線性化。
image.png
深層網絡有組合特徵提取的功能。
decayed_learning_rate爲每一輪優化時使用的學習率 learning_rate爲事先設定好的初始學習率;decay_rate爲衰減係數,decay_steps爲衰減速度。
每完整地過完一遍訓練數據,學習率就減小一次,這使得數據集中所有數據對模型訓練有相等的作用。
image.png
每次都乘0.9 每50輪減小一次。
既可以加快訓練初期的訓練速度,同時後期又不會出現損失函數在極小值周圍徘徊往返的情況。
過擬合與正則化:
V1*v2 對應相乘
Matmul(v1,v2)矩陣相乘
交叉熵:cross_entropy=tf.nn.sparse_softmax_cross_entropy_with_logits(y,y_)
Mse=tf.reduce_mean(tf.square(y_-y)) y_標籤值,y爲預測值
Tf.greater 選擇出較大值。
Tf.select tf.select(tf.greater(v1,v2),v1,v2) 並且複製
L1正則化會讓參數變的更稀疏(有更多的參數變爲0),計算公式不可導;L2不會。L1可用於特徵選擇。
L2正則化優化會比較簡潔,防止模型過擬合,有助於減小方差,構造模型參數較小,使得抗擾動能力強。
定義L2正則化損失函數:
loss=tf.reduce_mean(tf.square(y_-y))+tf.contrib.layers.l2_regularizer(lambda)(w)
L2 正則化
def get_weight(shape,lambda1):
var=tf.Variable(tf.random_normal(shape),dtype=tf.float32) tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(lambda1)(var)) return var
x=tf.placeholder(tf.float32,shape=(None,2))
y_=tf.placeholder(tf.float32,shape=(None,1))
batch_size=8
每一層節點數
layer_dimension=[2,10,10,10,1]
網絡層數
n_layers=len(layer_dimension)
cur_layer=x
in_dimension=layer_dimension[0]
for i in range(1,n_layers):
out_dimension=layer_dimension[i] weight=get_weight([in_dimension,out_dimension],0.001) bias=tf.Variable(tf.constant(0.1,shape=[out_dimension])) cur_layer=tf.nn,relu(tf.matmul(cur_layer,weight)+bias) in_dimension=layer_dimension[i]
mse_loss=tf.reduce_mean(tf.square(y_-cur_layer))
tf.add_to_collection('losses',mse_loss)
loss=tf.add_n(tf.get_collection('losses'))
滑動平均模型:
tf.train.ExponentialMovingAverage 會維護一個影子變量
image.png
MNIST 數據集 60000(55000+5000驗證集)+10000 28*28
在模型參數調整的過程中,不應當依賴測試集的準確率來確定參數(要儘量使得測試集是不可見的)爲的是擬合未知數據的能力。所以在訓練集中劃分出驗證集對參數進行評估和選取。
tf.variable_scope
模型保存:saver=tf.train.Saver()
Saver.save(sess,”….ckpt”)
直接加載:saver=tf.train.import_meta_graph(“/ckpt.meta”)
卷積與池化:
卷積:
1.stride [1,2,2,1] 卷積步長爲2, 第1\4參數爲1.分別表示batch和channel
VALID:without padding(僅丟棄下面或右邊最多的行/列)
SAME:with zero padding 左奇右偶,在左邊補一個0,右邊補2個0
weight_variable:
第一二參數值得卷積核尺寸大小,即patch=5*5,第三個參數是圖像通道數=1,第四個參數是卷積核的數目=32,代表會出現多少個卷積特徵圖像;
W_conv1 = weight_variable([5, 5, 1, 32])
對於每一個卷積核都有一個對應的偏置量。
b_conv1 = bias_variable([32])
圖片乘以卷積核,並加上偏執量,卷積結果28x28x32
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
池化:
ksize [1,2,2,1] 池化窗口大小2*2 第1\4參數爲1.
池化結果14x14x32 卷積結果乘以池化卷積核
h_pool1 = max_pool_2x2(h_conv1)
第二層卷積操作
32通道卷積,卷積出64個特徵
w_conv2 = weight_variable([5,5,32,64])
64個偏執數據
b_conv2 = bias_variable([64])
注意h_pool1是上一層的池化結果,#卷積結果14x14x64
h_conv2 = tf.nn.relu(conv2d(h_pool1,w_conv2)+b_conv2)
全連接層:
二維張量,第一個參數7764的patch,也可以認爲是隻有一行7764個數據的卷積,第二個參數代表卷積個數共1024個
W_fc1 = weight_variable([7764, 1024])
1024個偏置數據
b_fc1 = bias_variable([1024])
tf.cats:轉換數據類型
tf.round() 舍入最近的整數
tf.reduce_sum(x,1/0):按某一維度以求和方式降維 0縱向求和,1橫向求和,不填默認爲所有元素求和
tf.reduce_mean(x,1/0):按某一維度以求和方式降維 同上
np.shuffle(a):對矩陣進行洗牌,原矩陣改變.無返回值
定義初始化變量。但是這裏仍然不會立即執行。需要通過sess來將數據流動起來 。
切記:所有的運算都應在在session中進行:
with tf.Session() as sess:
此處自動開啓一個sessionsess.run(init)
對變量進行初始化,執行(run)init語句
feed_dict:
step_loss = sess.run([loss], feed_dict={X: train_X, Y: train_Y})#feed_dict的作用是給使用placeholder創建出來的tensor賦值。其實,他的作用更加廣泛:feed 使用一個 值臨時替換一個 op 的輸出結果. 你可以提供 feed 數據作爲 run() 調用的參數. feed 只在調用它的方法內有效, 方法結束, feed 就會消失.train_X替換X,train_Y替換Y
sess.run(b)只會計算和b有關的流程