我的用例如下:我正在使用 Tensorflow 創建一個降維 AutoEncoder。我已經實作了三個自定義層和一個模型
class ConvLayer(Layer):
def __init__(self, filter, kernel, act, **kwargs):
super().__init__()
self.filter = filter
self.kernel = kernel
self.act = act
super(ConvLayer, self).__init__(**kwargs)
def build(self, input_shape):
self.conv = Conv1D(self.filter, self.kernel, padding='same')
self.norm = BatchNormalization()
self.acti = Activation(self.act)
def get_config(self):
config = super(ConvLayer, self).get_config()
config.update({
"filter": self.filter,
"kernel": self.kernel,
"act" : self.act
})
return config
def call(self, inputs):
x = self.conv(inputs)
x = self.norm(x)
return self.acti(x)
class _Conv1DTranspose(Layer):
def __init__(self, filter, kernel, **kwargs):
super().__init__()
self.filter = filter
self.kernel = kernel
super(_Conv1DTranspose, self).__init__(**kwargs)
def build(self, input_shape):
self.first = Lambda(lambda x: K.expand_dims(x, axis=2))
self.conv = Conv2DTranspose(self.filter, (self.kernel, 1), padding='same')
self.second = Lambda(lambda x: K.squeeze(x, axis=2))
def get_config(self):
config = super(_Conv1DTranspose, self).get_config()
config.update({
"filter": self.filter,
"kernel": self.kernel
})
return config
def call(self, inputs):
x = self.first(inputs)
x = self.conv(x)
return self.second(x)
class DeconvLayer(Layer):
def __init__(self, filter, kernel, act, **kwargs):
super().__init__()
self.filter = filter
self.kernel = kernel
self.act = act
super(DeconvLayer, self).__init__(**kwargs)
def build(self, input_shape):
self.conv = _Conv1DTranspose(self.filter, self.kernel)
self.norm = BatchNormalization()
self.acti = Activation(self.act)
def get_config(self):
config = super(DeconvLayer, self).get_config()
config.update({
"filter": self.filter,
"kernel": self.kernel,
"act" : self.act
})
return config
def call(self, inputs):
x = self.conv(inputs)
x = self.norm(x)
return self.acti(x)
def create_model(latent_dim):
encoder = Sequential([
ConvLayer(128, 2, 'selu'),
ConvLayer(128, 2, 'selu'),
ConvLayer(128, 2, 'selu'),
ConvLayer(128, 2, 'selu'),
MaxPooling1D(5),
ConvLayer(64, 2, 'selu'),
ConvLayer(64, 2, 'selu'),
ConvLayer(64, 2, 'selu'),
ConvLayer(64, 2, 'selu'),
MaxPooling1D(2),
ConvLayer(32, 2, 'selu'),
ConvLayer(32, 2, 'selu'),
ConvLayer(32, 2, 'selu'),
ConvLayer(32, 2, 'selu'),
MaxPooling1D(2),
Flatten(),
Dense(latent_dim, activation='selu') ], name='Encoder')
decoder = Sequential([
Dense((latent_dim * 32), activation='selu'),
Reshape((50, 32)),
UpSampling1D(2),
DeconvLayer(32, 2, 'selu'),
DeconvLayer(32, 2, 'selu'),
DeconvLayer(32, 2, 'selu'),
DeconvLayer(32, 2, 'selu'),
UpSampling1D(2),
DeconvLayer(64, 2, 'selu'),
DeconvLayer(64, 2, 'selu'),
DeconvLayer(64, 2, 'selu'),
DeconvLayer(64, 2, 'selu'),
UpSampling1D(5),
DeconvLayer(128, 2, 'selu'),
DeconvLayer(128, 2, 'selu'),
DeconvLayer(128, 2, 'selu'),
DeconvLayer(128, 2, 'selu'),
DeconvLayer(1, 2, 'sigmoid') ], name='Decoder')
return encoder, decoder
我正在訓練編碼器部分并將其保存在一個單獨的檔案autoencoder.py中,encoder.save("encoder_dim_50.h5")現在在我的main.py中我想加載我的模型并使用它來減少一些尺寸。
我的問題從這里開始,我正在匯入自定義層from autoencoder import _Conv1DTranspose, ConvLayer, DeconvLayer,在匯入時,它又開始運行整個訓練序列?!
代碼甚至沒有達到模型的加載
self.Encoder = tf.keras.models.load_model(model_path, custom_objects={'_Conv1DTranspose': _Conv1DTranspose,
'ConvLayer' : ConvLayer,
'DeconvLayer' : DeconvLayer})
我是否在這里遺漏了一些明顯的問題,或者我也應該在main.py中實作我的自定義層?
感謝您的時間
uj5u.com熱心網友回復:
要阻止您的代碼自動運行,請將您的代碼轉換為以下格式,它始終會阻止代碼自動運行。
def __main__():
#do whatever you want in this function as this will run if you run this file directly
print('hello world')
if __name__ == "__main__"
__main__()
這樣,您的代碼永遠不會單獨運行,您可以按照自己的方式使用函式。
uj5u.com熱心網友回復:
你有 TensorFlow 1 還是 2?我認為這與跑步有關eager_mode。默認情況下,它會構建一個圖,因此在啟動時會運行兩次。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/432294.html
