Tensorflow笔记

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的概率值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值