ble55ing的技术专栏 code analysis ,fuzzing technique and ctf

Keras使用

2019-06-05
ble55ing


Keras 部分功能

这次算是与Keras和tensorflow打了一次交道了。。虽然最后并没有怎么用上。

自定义损失函数

损失函数的自定义用于实现一些目的的模型计算 。注意损失函数是模型训练的目的,而不属于模型之中。

def my_bin(y_true, y_pred):
    return K.binary_crossentropy(y_true,y_pred);

这样的方式就可以重新写一个损失函数了。当然也是可以有额外的损失函数的参数的,就是需要去定义预设值

自定义层

这里给出官方的说明文档,最后没用上所以可没有具体的写

class MyLayer(Layer):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = 1
        super(MyLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        assert isinstance(input_shape, list)
        # 为该层创建一个可训练的权重
        self.kernel = self.add_weight(name='kernel',
                                      shape=(input_shape[0][1], self.output_dim),
                                      initializer='uniform',
                                      trainable=True)
        super(MyLayer, self).build(input_shape)  # 一定要在最后调用它

    def call(self, x):
        assert isinstance(x, list)
        a, b = x
        return [K.dot(a, self.kernel) + b, K.mean(b, axis=-1)]

    def compute_output_shape(self, input_shape):
        assert isinstance(input_shape, list)
        shape_a, shape_b = input_shape
        return [(shape_a[0], self.output_dim), shape_b[:-1]]

官方文档的网址:https://keras.io/zh/layers/writing-your-own-keras-layers/,很多时候比个人写的blog有用的多

模型模拟

很有意思的想法,用一个新的模型根据之前的模型进行简化的模拟,然后可以对这个模型进行操作,也不会影响到之前的模型了。

还可以通过模型的predict来预测某个输入对应模型输出(当然是用model.predict([x])的方法也是可以的得到模型输出的,这两种得到的其实是一样的,就是新建立模型可以在上面做一些动作)。

dense1_layer_model = Model(inputs=model.input,outputs=model.get_layer('activation_2').output)
dense1_output = dense1_layer_model.predict([x])
print dense1_output[0]

关于计算模型梯度

loss = layer_list[-2][1].output[:,f]#分片,选择了第f个神经元的输出与输入之间的关系是个Tensor,shape(?,)。原先是shape(?,45)。
grads = K.gradients(loss,model.input)[0]
iterate = K.function([model.input], [loss, grads])
loss_value, grads_value = iterate([x])

最终得到的就是损失函数计算值和各输入字节的梯度


Similar Posts

Content