Keras 模型保存时 NotImplementedError 的可能原因

tf version'2.7.0'

原因1 使用Sequential模型,但第一层没有指定inputshape

解决方法:见其他博文,已有讨论

原因2 使用Functional模型,但是内嵌Sequential模型

解决方法:把Sequential模型改写为Functional模型

改写前(子类+Sequential定义)

class MultiScaleConvModel(Model):
    
    def __init__(self, first_layer_shape):
        super(MultiScaleConvModel, self).__init__()
        self.layer_1 =   Sequential(layers=[layers.Conv1D(filters=16, kernel_size=64, strides=16, padding='valid',input_shape = first_layer_shape),
                                            layers.BatchNormalization(),
                                            layers.Activation('relu'),
                                            layers.MaxPooling1D(2,strides=2,padding='valid'),
                                            layers.Conv1D(filters=32, kernel_size=3, strides=1, padding='valid'),
                                            layers.BatchNormalization(),
                                            layers.Activation('relu'),
                                            layers.MaxPooling1D(2,strides=2,padding='valid')])

        self.layer_2 =   Sequential(layers=[layers.Conv1D(filters=16, kernel_size=64, strides=16, padding='valid',input_shape = first_layer_shape),
                                            layers.BatchNormalization(),
                                            layers.Activation('relu'),
                                            layers.MaxPooling1D(2,strides=2,padding='valid'),
                                            layers.Conv1D(filters=32, kernel_size=3, strides=1, padding='valid'),
                                            layers.BatchNormalization(),
                                            layers.Activation('relu'),
                                            layers.MaxPooling1D(2,strides=2,padding='valid')])

        self.layer_3 =   Sequential(layers=[layers.Conv1D(filters=16, kernel_size=64, strides=16, padding='valid',input_shape = first_layer_shape),
                                            layers.BatchNormalization(),
                                            layers.Activation('relu'),
                                            layers.MaxPooling1D(2,strides=2,padding='valid'),
                                            layers.Conv1D(filters=32, kernel_size=3, strides=1, padding='valid'),
                                            layers.BatchNormalization(),
                                            layers.Activation('relu'),
                                            layers.MaxPooling1D(2,strides=2,padding='valid')])

        self.layer_4 =   Sequential(layers=[layers.Conv1D(filters=16, kernel_size=64, strides=16, padding='valid',input_shape = first_layer_shape),
                                            layers.BatchNormalization(),
                                            layers.Activation('relu'),
                                            layers.MaxPooling1D(2,strides=2,padding='valid'),
                                            layers.Conv1D(filters=32, kernel_size=3, strides=1, padding='valid'),
                                            layers.BatchNormalization(),
                                            layers.Activation('relu'),
                                            layers.MaxPooling1D(2,strides=2,padding='valid')])

    def call(self, inputs):
        scale_1 = self.layer_1(inputs)
        scale_2 = self.layer_2(inputs)
        scale_3 = self.layer_3(inputs)
        scale_4 = self.layer_4(inputs)
        x = Concatenate()([scale_1, scale_2 , scale_3 , scale_4])
        return x

改写后(直接对Tensor处理)

def Conv_one_scale(input_channel,kernel_size):
    x = layers.Conv1D(filters=16, kernel_size=kernel_size, strides=16, padding='valid')(input_channel)
    x = layers.BatchNormalization()(x)
    x = layers.Activation('relu')(x)
    x=  layers.MaxPooling1D(2,strides=2,padding='valid')(x)
    x= layers.Conv1D(filters=32, kernel_size=3, strides=1, padding='valid')(x)
    x= layers.BatchNormalization()(x)
    x= layers.Activation('relu')(x)
    x=  layers.MaxPooling1D(2,strides=2,padding='valid')(x)
    return x


def MultiScaleConvModel_2(input_channel):

    scale_1 = Conv_one_scale(input_channel,kernel_size=64)
    scale_2 = Conv_one_scale(input_channel,kernel_size=32)
    scale_3 = Conv_one_scale(input_channel,kernel_size=16)
    scale_4 = Conv_one_scale(input_channel,kernel_size=8)
    x = Concatenate(axis=1)([scale_1, scale_2 , scale_3 , scale_4])
    return x
posted @ 2021-11-29 00:13  x66ccff  阅读(281)  评论(0)    收藏  举报