tensorflow学习笔记(3): 使用load_modeld载入的keras模型是随机的
tensorflow
一个面向所有人的开源机器学习框架
项目地址:https://gitcode.com/gh_mirrors/te/tensorflow

·
● 问题描述:
在一个二分类任务上,我训练好的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




一个面向所有人的开源机器学习框架
最近提交(Master分支:2 个月前 )
4f64a3d5
Instead, check for this case in `ResolveUsers` and `ResolveOperand`, by querying whether the `fused_expression_root` is part of the `HloFusionAdaptor`.
This prevents us from stepping into nested fusions.
PiperOrigin-RevId: 724311958
2 个月前
aa7e952e
Fix a bug in handling negative strides, and add a test case that exposes it.
We can have negative strides that are not just -1, e.g. with a combining
reshape.
PiperOrigin-RevId: 724293790
2 个月前
更多推荐
所有评论(0)