Python 忽略。。。在“%uuuu init”中具有参数的层必须重写“get\u config”`
我正在使用以下课程定义的残差单元训练卷积神经网络(根据Aurelian Geron的“使用Scikit Learn、Keras和Tensorflow进行机器学习的实践”第478页) 创建类时没有错误,创建模型体系结构(使用该类)时没有错误:Python 忽略。。。在“%uuuu init”中具有参数的层必须重写“get\u config”`,python,tensorflow,keras,deep-learning,conv-neural-network,Python,Tensorflow,Keras,Deep Learning,Conv Neural Network,我正在使用以下课程定义的残差单元训练卷积神经网络(根据Aurelian Geron的“使用Scikit Learn、Keras和Tensorflow进行机器学习的实践”第478页) 创建类时没有错误,创建模型体系结构(使用该类)时没有错误: ResNet_model = tf.keras.models.Sequential() ResNet_model.add(tf.keras.layers.Conv2D(64, 3, strides=2, input_shape=num_pixels_and
ResNet_model = tf.keras.models.Sequential()
ResNet_model.add(tf.keras.layers.Conv2D(64, 3, strides=2, input_shape=num_pixels_and_channels,
padding="same", use_bias=False))
ResNet_model.add(tf.keras.layers.BatchNormalization())
ResNet_model.add(tf.keras.layers.Activation("relu"))
ResNet_model.add(tf.keras.layers.MaxPool2D(pool_size=3, strides=2, padding="same"))
prev_filters=64
for filters in [64] * 1 + [128] * 1 + [256] * 1 + [512] * 1:
strides = 1 if filters == prev_filters else 2
ResNet_model.add(ResidualUnit(filters, strides=strides))
prev_filters=filters
ResNet_model.add(tf.keras.layers.GlobalAvgPool2D())
ResNet_model.add(tf.keras.layers.Flatten())
ResNet_model.add(tf.keras.layers.Dense(257, activation="softmax"))
…但当我训练模型时,训练一开始就会显示警告:
警告:tensorflow:模型未能序列化为JSON。忽略。。。在\uuuu init\uuuu
中具有参数的层必须覆盖get\u config
模型在第一个历元中进行训练,然后停止
什么是错误的,我需要在我的代码中更改什么来修复这个问题
我正在CPU上的Jupyter笔记本中运行tensorflow 2.1.0版。我在我的layer类中跳过了get_config()函数,如下所示,它似乎解决了这个问题:
def get_config(self):
cfg = super().get_config()
return cfg
更具体地说:
class AttentionBlock(tf.keras.layers.Layer):
def __init__(self,units = 32,**kwargs):
super(AttentionBlock, self).__init__(**kwargs)
self.units = units
self.conv2d = tf.keras.layers.SeparableConv2D(self.units, 1, padding='same',
use_bias=True,
kernel_initializer=tf.keras.initializers.VarianceScaling(), bias_initializer='zeros',
bias_regularizer=None)
self.relu = tf.keras.layers.Activation('swish')
self.batchnorm = tf.keras.layers.BatchNormalization()
def get_config(self):
cfg = super().get_config()
return cfg
def call(self,inputs):
if type(inputs) is not list or len(inputs) <= 1:
raise Exception('Merge must be called on a list of tensors '
'(at least 2). Got: ' + str(inputs))
else:
x,y = inputs
w = self.conv2d(x)
v = self.conv2d(y)
out = self.relu(w + v)
out = self.batchnorm(out)
out = tf.nn.sigmoid(out)
return out
class AttentionBlock(tf.keras.layers.Layer):
定义初始值(自身,单位=32,**kwargs):
超级(注意块,自我)。\uuuuu初始化(**kwargs)
self.units=单位
self.conv2d=tf.keras.layers.SeparableConv2D(self.units,1,padding='same',
使用_bias=True,
kernel_initializer=tf.keras.initializers.VarianceScaling(),bias_initializer='zeros',
偏差(正则化器=无)
self.relu=tf.keras.layers.Activation('swish')
self.batchnorm=tf.keras.layers.BatchNormalization()
def get_配置(自身):
cfg=super()
返回cfg
def呼叫(自我,输入):
如果类型(输入)不是list或len(输入),我实际上也面临类似的问题!我会试试看它是否适合我。我还没有机会再试试。我现在正在做另一个项目(我在两个月前发布了这个问题),刚刚在mo开始了一个新的工作,时间和空间都太短了。当我尝试你的答案时,我会在这里发表评论,如果它有效的话,我会接受它。
class AttentionBlock(tf.keras.layers.Layer):
def __init__(self,units = 32,**kwargs):
super(AttentionBlock, self).__init__(**kwargs)
self.units = units
self.conv2d = tf.keras.layers.SeparableConv2D(self.units, 1, padding='same',
use_bias=True,
kernel_initializer=tf.keras.initializers.VarianceScaling(), bias_initializer='zeros',
bias_regularizer=None)
self.relu = tf.keras.layers.Activation('swish')
self.batchnorm = tf.keras.layers.BatchNormalization()
def get_config(self):
cfg = super().get_config()
return cfg
def call(self,inputs):
if type(inputs) is not list or len(inputs) <= 1:
raise Exception('Merge must be called on a list of tensors '
'(at least 2). Got: ' + str(inputs))
else:
x,y = inputs
w = self.conv2d(x)
v = self.conv2d(y)
out = self.relu(w + v)
out = self.batchnorm(out)
out = tf.nn.sigmoid(out)
return out