tensorflow学习笔记(3): 使用load_modeld载入的keras模型是随机的

● 问题描述:

在一个二分类任务上,我训练好的keras模型的准确率是0.9。但是,当我用tf.keras.models.load_modeld重新加载该模型后,它的准确率却变成了0.5(显然是因为网络的参数变成随机值了)。

● 问题原因:

导致该问题的原因是,我的模型用到了自建的keras layer,但是我的自建layer写错了。错误点是,我在自建layer里调用了其它layer。该错误会导致用load_modeld重载权重时,其它layer的权重不会被载入,而会被随机初始化。(详细原因可查阅tf.keras.models.load_modeld的源码)

● 解决方法:

自建层里需要保存的参数,都需要使用add_weight来注册。

● 举例说明:

下面通过一个例子,来进一步说明该错误以及其解决方法。

错误写法:

下面这段代码自建了一个keras layer,实现的是dense layer的功能。这个错误例子里,我是通过调用keras的Dense来实现该功能的。

import tensorflow as tf
class MyLayer(tf.keras.layers.Layer):
    def __init__(self,**config):
        super(MyLayer, self).__init__(config)

    def build(self,input_shape):
        self.detector_layer_dense = tf.keras.layers.Dense(20, activation='sigmoid')
        super(MyLayer,self).build(input_shape)

    def call(self,input):
        output = self.detector_layer_dense_1(merged_feature_of_each_steps)
        return output

正确写法:

首先要build()函数中用add_weight创建一个dense kernel,然后在call()函数中用矩阵相乘实现dense layer.

import tensorflow as tf
class MyLayer(tf.keras.layers.Layer):
    def __init__(self,**config):
        super(MyLayer, self).__init__(config)

    def build(self,input_shape):
        self.dense_kernel = add_weight(shape=[20,1],name='kernel')
        super(MyLayer,self).build(input_shape)

    def call(self,input):
        output = tf.matmul(input,self.dense_kernel)
        return output

你可能感兴趣的:(机器学习)