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.