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

浙公网安备 33010602011771号