基於Tensorflow平台的2D FCN圖像分割學習


基於Tensorflow平台的2D FCN圖像分割學習

1.基礎知識准備

1.1網絡構建相關的函數准備 

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
參數
input:指需要做卷積的輸入圖像,它要求是一個Tensor,具有[batch, in_height, in_width, in_channels]這樣的shape,
    注意這是一個4維的Tensor,要求類型為float32和float64其中之一
filter:相當於CNN中的卷積核,它要求是一個Tensor,具有[filter_height, filter_width, in_channels, out_channels]這樣的shape,
     求類型與參數input相同,有一個地方需要注意,第三維in_channels,就是參數input的第四維
strides:卷積時在圖像每一維的步長,這是一個一維的向量,[1, stride, stride, 1]長度4
padding:string類型的量,只能是"SAME","VALID"其中之一,這個值決定了不同的卷積方式
use_cudnn_on_gpu:bool類型,是否使用cudnn加速,默認為true
結果返回一個Tensor,這個輸出,就是我們常說的feature map, 在padding 為"SAME"的情況下[batch, in_height, in_width, out_channels]

tf.conv2d_transpose(value, filter, output_shape, strides, padding="SAME", data_format="NHWC", name=None)
參數
value:
指需要做反卷積的輸入圖像,它要求是一個Tensor
filter:卷積核,它要求是一個Tensor,具有[filter_height, filter_width, out_channels, in_channels]這樣的shape,
    具體含義是[卷積核的高度,卷積核的寬度,卷積核個數,圖像通道數]
output_shape:反卷積操作輸出的shape,細心的同學會發現卷積操作是沒有這個參數的.
strides:反卷積時在圖像每一維的步長,這是一個一維的向量,長度4
padding:string類型的量,只能是"SAME","VALID"其中之一,這個值決定了不同的卷積方式
data_format:string類型的量,'NHWC'和'NCHW'其中之一,這是tensorflow新版本中新加的參數,它說明了value參數的數據格式。
       'NHWC'指tensorflow標准的數據格式[batch, height, width, in_channels],
       'NCHW'指Theano的數據格式,[batch, in_channels,height, width],當然默認值是'NHWC'

tf.add(x, y, name=None)
功能:是使x,和y兩個參數的元素相加,返回的tensor數據類型和x的數據類型相同(參數想x, y的類型必須相同, Must be one of the following types:
   `half`, `float32`, `float64`, `uint8`, `int8`, `int16`, `int32`, `int64`, `complex64`, `complex128`, `string`.)

tf.argmax(input, axis=None, name=None, dimension=None):
功能:返回的是vector中的最大值的索引號,如果vector是一個向量,那就返回一個值。如果是一個矩陣,那就返回一個向量,
   這個向量的每一個維度都是相對應矩陣行的最大值元素的索引號。

tf.Variable.init(initial_value, trainable=True, collections=None, validate_shape=True, name=None)
參數:
initial_value:變量的初始值,【必須的】
trainable: 如果為True,會把它加入到GraphKeys.TRAINABLE_VARIABLES,才能對它使用Optimizer
collection:指定該圖變量的類型、默認為[GraphKeys.GLOBAL_VARIABLES]
validate_shape:
如果為False,則不進行類型和維度檢查
name:變量的名稱,如果沒有指定則系統會自動分配一個唯一的值

tf.get_variable跟tf.Variable都可以用來定義圖變量,但是前者的必需參數(即第一個參數)並不是圖變量的初始值,而是圖變量的名稱。

tf.Variable的用法要更豐富一點,當指定名稱的圖變量已經存在時表示獲取它,當指定名稱的圖變量不存在時表示定義它。

scope如何划分命名空間

tf.variable_scope:當使用tf.get_variable定義變量時,如果出現同名的情況將會引起報錯,而對於tf.Variable來說,卻可以定義“同名”變量

tf.name_scope:當tf.get_variable遇上tf.name_scope,它定義的變量的最終完整名稱將不受這個tf.name_scope的影響

In [1]: import tensorflow as tf
In [2]: with tf.variable_scope('v_scope'):
   ...:     with tf.name_scope('n_scope'):
   ...:         x = tf.Variable([1], name='x')
   ...:         y = tf.get_variable('x', shape=[1], dtype=tf.int32)
   ...:         z = x + y
   ...:
In [3]: x.name, y.name, z.name
Out[3]: ('v_scope/n_scope/x:0', 'v_scope/x:0', 'v_scope/n_scope/add:0')
View Code

圖表的復用(常在RNN中用到)

1.2 模型優化相關的函數

1.2.1 損失函數

(1)交叉熵(crossentropy)

 給定兩個概率分布p和q,交叉熵刻畫的是兩個概率分布之間的距離:

tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)

是TensorFlow提供的集成交叉熵函數。該操作應該施加在未經過Softmax處理的logits上,否則會產生錯誤結果;labels為期望輸出,且必須采用labels=y_,  logits=y3的形式將參數傳入。

(1)這個操作的輸入logits是未經縮放的,該操作內部會對logits使用softmax操作;

(2) 參數labels,logits必須有相同的形狀 [batch_size, num_classes] 和相同的類型(float16, float32,float64)中的一種。

該函數具體的執行過程分兩步:首先對logits做一個Softmax,

第二步就是將第一步的輸出與樣本的實際標簽labels做一個交叉熵。

這個函數的返回值並不是一個數,而是一個向量,如果要求交叉熵,我們要再做一步tf.reduce_sum操作,就是對向量里面所有元素求和,最后才得到交叉熵,

如果求loss,則要做一步tf.reduce_mean操作,對向量求均值!

tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None)

功能:計算logits 和 labels 之間的稀疏softmax 交叉熵

參數:

1.2.2 優化器

 

https://blog.csdn.net/xierhacker/article/details/53174558

 

(1) class tf.train.GradientDescentOptimizer

 

__init__(learning_rate, use_locking=False,name=’GradientDescent’)

作用:創建一個梯度下降優化器對象 
參數: 
learning_rate: A Tensor or a floating point value. 要使用的學習率 
use_locking: 要是True的話,就對於更新操作(update operations.)使用鎖 
name: 名字,可選,默認是”GradientDescent”.

 compute_gradients(loss,var_list=None,gate_gradients=GATE_OP,aggregation_method=None,colocate_gradients_with_ops=False,grad_loss=None)

作用:對於在變量列表(var_list)中的變量計算對於損失函數的梯度,這個函數返回一個(梯度,變量)對的列表,其中梯度就是相對應變量的梯度了。這是minimize()函數的第一個部分, 
參數: 
loss: 待減小的值 
var_list: 默認是在GraphKey.TRAINABLE_VARIABLES. 
gate_gradients: How to gate the computation of gradients. Can be GATE_NONE, GATE_OP, or GATE_GRAPH. 
aggregation_method: Specifies the method used to combine gradient terms. Valid values are defined in the class AggregationMethod. 
colocate_gradients_with_ops: If True, try colocating gradients with the corresponding op. 
grad_loss: Optional. A Tensor holding the gradient computed for loss.

apply_gradients(grads_and_vars,global_step=None,name=None)

作用:把梯度“應用”(Apply)到變量上面去。其實就是按照梯度下降的方式加到上面去。這是minimize()函數的第二個步驟。 返回一個應用的操作。 
參數
grads_and_vars: compute_gradients()函數返回的(gradient, variable)對的列表 
global_step: Optional Variable to increment by one after the variables have been updated. 
name: 可選,名字

minimize(loss,global_step=None,var_list=None, gate_gradients=GATE_OP, aggregation_method=None, colocate_gradients_with_ops=False, name=None, grad_loss=None)

作用:非常常用的一個函數 通過更新var_list來減小loss,這個函數就是前面compute_gradients() 和apply_gradients().的結合

 

 

 

 

 

 

 

 

 

 

 

validate_shape


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM