Batch Normalization
在 training 和 testing 的时候,BatchNormalization (BN) 层的表现将有所不同。在 training 时,BN将根据指定的 axis 对当前 batch 的数据进行归一化即 x = (x - mean) / tf.sqrt(var + epsilon) 其中 mean, var = tf.nn.moments( x, axes, keepdims=False)
。但是在 testing 的时候这个 mean 和 var 将不是来自 testing 用的数据,而是来自 BN层训练完成后得到的整个数据集的 mean 和 var 即 pop_mean 和 pop_var,通过tf.assign(pop_mean, pop_mean * decay + batch_mean * (1 - decay)) 和 tf.assign(pop_var, pop_var * decay + batch_var * (1 - decay))
计算得到,这里decay一般接近1。
调用 train_on_batch 得到的loss是网络未经过梯度更新的loss,网络将根据这个loss来梯度更新参数。
binary_crossentropy
计算公式为 − P t u r e l o g ( P p r e d ) − ( 1 − P t r u e ) l o g ( 1 − P p r e d ) -P_{ture}log(P_{pred})-(1-P_{true})log(1-P_{pred}) −Pturelog(Ppred)−(1−Ptrue)log(1−Ppred)(这里的P是指属于其中一种类别的概率,总共为两种类别,概率和为1)。例如真标签为[1,0], 预测标签为[0.9, 0.1],则 l o s s = − 1 ∗ l o g ( 0.9 ) − ( 1 − 1 ) ∗ l o g ( 1 − 0.9 ) = − l o g 0.9 loss = -1*log(0.9)-(1-1)*log(1-0.9) = -log0.9 loss=−1∗log(0.9)−(1−1)∗log(1−0.9)=−log0.9。