TensorFlow遇到的問題彙總(持續更新...)

1、損失函數的loss值一直維持在0.69?

首先0.69是個什麼數?

一般採用的都是cross entropy loss value,定義如下:

發現就是網絡預測給出的二類概率向量爲[0.5,0.5],也就是a和1-a都是0.5,不管y取值0/1,整個的平均loss就是-ln(0.5)=0.69.

 a的值是softmax的輸出,在二分類的情況下爲0.5,表明輸入softmax的值x是(近似)相等的。

 出現這個情況,往往是因爲relu導致的大量神經元壞死,或者是tanh導致的梯度消失,可以嘗試換一個損失函數(relu換成tanh,或者tanh換成relu),如果還是不行,可以嘗試leak_relu。

2、激活函數relu與tanh的區別?分別適用於哪種情況?

我整理了tensorflow中的損失函數及其優缺點,可以看這個文章

3、tf.nn.in_top_k(predictions, targets, k, name=None)

其中,prediction就是表示預測的結果,大小就是預測樣本的數量乘以輸出的維度,類型是tf.float32等。

target就是實際樣本類別的標籤,大小就是樣本數量的個數。

k表示每個樣本的預測結果的前K個最大的數裏面是否含有target中的值。一般都是取1。

(返回一個bool類型的張量)。

4、損失函數維持在一定值上下跳動

如果在剛開始訓練的時候損失值比較大,迭代幾次後維持在一定值左右不變時,可以考慮將BATCH_SIZE降低一些,可以取得比較好的效果。

5、如何使用np.random.shuffle打亂二維數組

np.random.shuffle(train_sample[0])

np.random.shuffle(train_sample[1])

使用上述兩條語句可以分別打亂train_sample的第一行和第二行;

例如[1 2 3 4;1 2 3 4]可以被打亂爲[2 1 3 4;4 1 3 2]。但是如果想要將兩行按照同樣的順序打亂怎麼辦呢?

state = np.random.get_state()

np.random.shuffle(train_sample[0])

np.random.set_state(state)

np.random.shuffle(train_sample[1])

通過get_state()保存狀態,set_state()重新載入狀態,可以使得train_sample[0],train_sample[1]能夠在保證對應關係不變的情況下,完成隨機打亂。

6、tf.contrib.layers函數

def convolution(inputs,
                num_outputs,
                kernel_size,
                stride=1,
                padding='SAME',
                data_format=None,
                rate=1,
                activation_fn=nn.relu,
                normalizer_fn=None,
                normalizer_params=None,
                weights_initializer=initializers.xavier_initializer(),
                weights_regularizer=None,
                biases_initializer=init_ops.zeros_initializer(),
                biases_regularizer=None,
                reuse=None,
                variables_collections=None,
                outputs_collections=None,
                trainable=True,
                scope=None):

常用的參數說明如下:

  • inputs:形狀爲[batch_size, height, width, channels]的輸入。
  • num_outputs:代表輸出幾個channel。這裏不需要再指定輸入的channel了,因爲函數會自動根據inpus的shpe去判斷。
  • kernel_size:卷積核大小,不需要帶上batch和channel,只需要輸入尺寸即可。[5,5]就代表5x5的卷積核,如果長和寬都一樣,也可以只寫一個數5.
  • stride:步長,默認是長寬都相等的步長。卷積時,一般都用1,所以默認值也是1.如果長和寬都不相等,也可以用一個數組[1,2]。
  • padding:填充方式,'SAME'或者'VALID'。
  • activation_fn:激活函數。默認是ReLU。也可以設置爲None
  • weights_initializer:權重的初始化,默認爲initializers.xavier_initializer()函數。
  • weights_regularizer:權重正則化項,可以加入正則函數。biases_initializer:偏置的初始化,默認爲init_ops.zeros_initializer()函數。
  • biases_regularizer:偏置正則化項,可以加入正則函數。
  • trainable:是否可訓練,如作爲訓練節點,必須設置爲True,默認即可。如果我們是微調網絡,有時候需要凍結某一層的參數,則設置爲False。

 

def max_pool2d(inputs,
               kernel_size,
               stride=2,
               padding='VALID',
               data_format=DATA_FORMAT_NHWC,
               outputs_collections=None,
               scope=None):

參數說明如下:

  • inputs: A 4-D tensor of shape `[batch_size, height, width, channels]` if`data_format` is `NHWC`, and `[batch_size, channels, height, width]` if `data_format` is `NCHW`.

  • kernel_size: A list of length 2: [kernel_height, kernel_width] of the pooling kernel over which the op is computed. Can be an int if both values are the same.

  • stride: A list of length 2: [stride_height, stride_width].Can be an int if both strides are the same. Note that presently both strides must have the same value.

  • padding: The padding method, either 'VALID' or 'SAME'.

  • data_format: A string. `NHWC` (default) and `NCHW` are supported.

  • outputs_collections: The collections to which the outputs are added.

  • scope: Optional scope for name_scope.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章