【问题标题】:Same keras models do not give the same output for get_config() method相同的 keras 模型不会为 get_config() 方法提供相同的输出
【发布时间】:2020-09-26 15:08:03
【问题描述】:

我想知道为什么对于两个相同的 keras 模型,有时 get_method() 会给出相同的结果(参见 model_dense_Amodel_dense_B),而有时不是(例如 model_conv_Amodel_conv_B)。

即使我使用clear_session() 方法和完全相同的代码,模型仍然不同。

有人知道这种行为吗?

代码sn-p:

from tensorflow import keras

input_shape = (300, 3)

# MODEL DENSE A
keras.backend.clear_session()
input_ = keras.layers.Input(shape=input_shape)
out = keras.layers.Flatten()(input_)
out = keras.layers.Dense(units=100, activation='relu')(out)
out = keras.layers.Dense(units=50, activation='relu')(out)
out = keras.layers.Dense(units=10, activation='softmax')(out)
mdl_dense_A = keras.models.Model(name='dense', inputs=input_, outputs=out)

# MODEL DENSE B
keras.backend.clear_session()
input_ = keras.layers.Input(shape=input_shape)
out = keras.layers.Flatten()(input_)
out = keras.layers.Dense(units=100, activation='relu')(out)
out = keras.layers.Dense(units=50, activation='relu')(out)
out = keras.layers.Dense(units=10, activation='softmax')(out)
mdl_dense_B = keras.models.Model(name='dense', inputs=input_, outputs=out)

print(mdl_dense_A.get_config() == mdl_dense_B.get_config())  # True

# MODEL CONV1D-LSTM A
keras.backend.clear_session()
input_ = keras.layers.Input(shape=input_shape)
branch_outputs = []
for i in range(input_shape[-1]):
    out = keras.layers.Lambda(lambda x: keras.backend.expand_dims(x[:, :, i], axis=-1))(input_)
    out = keras.layers.Conv1D(filters=20, kernel_size=5, strides=2, padding='valid')(out)
    branch_outputs.append(out)
out = keras.layers.Concatenate()(branch_outputs)
recursive = keras.layers.LSTM(50, return_sequences=True)(out)
recursive = keras.layers.LSTM(50)(recursive)
out = keras.layers.Dense(10, activation='softmax')(recursive)
mdl_conv_A = keras.models.Model(name='conv1d-lstm', inputs=input_, outputs=out)

# MODEL CONV1D-LSTM B
keras.backend.clear_session()
input_ = keras.layers.Input(shape=input_shape)
branch_outputs = []
for i in range(input_shape[-1]):
    out = keras.layers.Lambda(lambda x: keras.backend.expand_dims(x[:, :, i], axis=-1))(input_)
    out = keras.layers.Conv1D(filters=20, kernel_size=5, strides=2, padding='valid')(out)
    branch_outputs.append(out)
out = keras.layers.Concatenate()(branch_outputs)
recursive = keras.layers.LSTM(50, return_sequences=True)(out)
recursive = keras.layers.LSTM(50)(recursive)
out = keras.layers.Dense(10, activation='softmax')(recursive)
mdl_conv_B = keras.models.Model(name='conv1d-lstm', inputs=input_, outputs=out)

print(mdl_conv_A.get_config() == mdl_conv_B.get_config())  # False !? 

【问题讨论】:

    标签: python tensorflow keras conv-neural-network lstm


    【解决方案1】:

    通常有助于查看两个配置的确切不同之处,即

    print(mdl_conv_A.get_config() == mdl_conv_B.get_config(), (mdl_conv_A.get_config(), mdl_conv_B.get_config()))  # False !?
    
    

    在这种情况下,它们的不同之处在于 lambda 层,它不是非常可序列化的。

    【讨论】:

    • 感谢您的回答。您对比较这两种模型有何建议?我正在研究如何为这种情况编写单元测试。
    猜你喜欢
    • 2020-11-15
    • 2019-03-22
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2020-05-04
    相关资源
    最近更新 更多