tf.nn.top_k(input, k, name=None)
解释:这个函数的作用是返回 input 中每行最大的 k 个数,并且返回它们所在位置的索引。values和indices。
KL.TimeDistributed
作用是将一个操作,如KL.Conv2d弄成一个时间分布式的对象。
输入至少为3D张量,下标为1的维度将被认为是时间维。
Keras编写自己的层
- build(input_shape): 这是你定义权重的地方。这个方法必须设self.built = True,可以通过调用super([Layer], self).build()完成。
- call(x): 这里是编写层的功能逻辑的地方。你只需要关注传入call的第一个参数:输入张量,除非你希望你的层支持masking。
- compute_output_shape(input_shape): 如果你的层更改了输入张量的形状,你应该在这里定义形状变化的逻辑,这让Keras能够自动推断各层的形状。
from keras import backend as K
from keras.engine.topology import Layer
import numpy as np
class MyLayer(Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyLayer, self).__init__(**kwargs)
def build(self, input_shape):
# Create a trainable weight variable for this layer.
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
super(MyLayer, self).build(input_shape) # Be sure to call this somewhere!
def call(self, x):
return K.dot(x, self.kernel)
def compute_output_shape(self, input_shape):
return (input_shape[0], self.output_dim)
tf.gather和tf.gather_nd
tf.gather 获取一维索引的值
tf.gather_nd 获取n维索引的值
tf.multiply和tf.matmul区别
解析:
(1)tf.multiply是点乘,即Returns x * y element-wise.
(2)tf.matmul是矩阵乘法,即Multiplies matrix a by matrix b, producing a * b.
Keras测试时重复通过某些层
测试时构建计算图时,先将要重复的层(或者函数)进行复制,进行命名,注意不能和原来的一致,然后正常加载权重(by_name = True),新增加的层没有使用训练好的权重,因为没有名字与该层对应,接着使用layer.get_weights()和layer.set_weights()方法对新复制的层进行权重赋值。例子:
model.load_weights(MIRROR_MODEL_PATH, by_name=True)
mapping = dict()
mapping["fusion_class_conv1_second"] = "fusion_class_conv1" # _second后缀代表第二次重复经过的层
mapping["fusion_class_conv2_second"] = "fusion_class_conv2"
mapping["fusion_class_conv3_second"] = "fusion_class_conv3"
mapping["fusion_class_conv4_second"] = "fusion_class_conv4"
for layer in model.keras_model.layers:
if layer.name in mapping:
weight_name = mapping[layer.name]
layer.set_weights(model.keras_model.get_layer(weight_name).get_weights())
tf.log()的底数是e
sigmoid_cross_entropy_with_logits实现
For brevity, let x = logits
, z = labels
. The logistic loss is
z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x))
= z * -log(1 / (1 + exp(-x))) + (1 - z) * -log(exp(-x) / (1 + exp(-x)))
= z * log(1 + exp(-x)) + (1 - z) * (-log(exp(-x)) + log(1 + exp(-x)))
= z * log(1 + exp(-x)) + (1 - z) * (x + log(1 + exp(-x))
= (1 - z) * x + log(1 + exp(-x))
= x - x * z + log(1 + exp(-x))
For x < 0, to avoid overflow in exp(-x), we reformulate the above
x - x * z + log(1 + exp(-x))
= log(exp(x)) - x * z + log(1 + exp(-x))
= - x * z + log(1 + exp(x))
Hence, to ensure stability and avoid overflow, the implementation uses this
equivalent formulation
max(x, 0) - x * z + log(1 + exp(-abs(x)))
logits
and labels
must have the same type and shape.
logits和probability的关系
假设probability的值为p
logit = log(p/(1-p)) logit函数将0-1的概率值转换为负无穷到正无穷的值
sigmoid = 1/(1-e[-x]) sigmoid函数将负无穷到正无穷的值转换为0-1的概率值