【问题标题】:Keras save model issueKeras保存模型问题
【发布时间】:2017-01-20 00:41:01
【问题描述】:

这是一个变分自编码器网络,我必须定义一个采样方法来生成潜在 z,我认为这可能有问题。这个py文件在做训练,另一个py文件在做在线预测,所以我需要保存keras模型,保存模型没有问题,但是当我从'h5'文件加载模型时,它显示错误:

NameError: name 'latent_dim' is not defined

以下是代码:

df_test = df[df['label']==cluster_num].iloc[:,:data_num.shape[1]]

data_scale_ = preprocessing.StandardScaler().fit(df_test.values)

data_num_ = data_scale.transform(df_test.values)

models_deep_learning_scaler.append(data_scale_)

batch_size = data_num_.shape[0]//10

original_dim = data_num_.shape[1]

latent_dim = data_num_.shape[1]*2

intermediate_dim = data_num_.shape[1]*10

nb_epoch = 1

epsilon_std = 0.001



x = Input(shape=(original_dim,))

init_drop = Dropout(0.2, input_shape=(original_dim,))(x)

h = Dense(intermediate_dim, activation='relu')(init_drop)

z_mean = Dense(latent_dim)(h)

z_log_var = Dense(latent_dim)(h)





def sampling(args):

    z_mean, z_log_var = args

    epsilon = K.random_normal(shape=(latent_dim,), mean=0.,

                              std=epsilon_std)

    return z_mean + K.exp(z_log_var / 2) * epsilon



# note that "output_shape" isn't necessary with the TensorFlow backend

z = Lambda(sampling, output_shape=(latent_dim,))([z_mean, z_log_var])



# we instantiate these layers separately so as to reuse them later



decoder_h = Dense(intermediate_dim, activation='relu')

decoder_mean = Dense(original_dim, activation='linear')

h_decoded = decoder_h(z)

x_decoded_mean = decoder_mean(h_decoded)





def vae_loss(x, x_decoded_mean):

    xent_loss = original_dim * objectives.mae(x, x_decoded_mean)

    kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)

    return xent_loss + kl_loss



vae = Model(x, x_decoded_mean)

vae.compile(optimizer=Adam(lr=0.01), loss=vae_loss)



train_ratio = 0.95

train_num = int(data_num_.shape[0]*train_ratio)



x_train = data_num_[:train_num,:]

x_test = data_num_[train_num:,:]



vae.fit(x_train, x_train,

        shuffle=True,

        nb_epoch=nb_epoch,

        batch_size=batch_size,

        validation_data=(x_test, x_test))

vae.save('./models/deep_learning_'+str(cluster_num)+'.h5')

del vae

from keras.models import load_model
vae = load_model('./models/deep_learning_'+str(cluster_num)+'.h5')

它显示错误: NameError: name 'latent_dim' is not defined

【问题讨论】:

    标签: save deep-learning keras


    【解决方案1】:

    对于变分损失,您使用了许多 Keras 模块不知道的变量。您需要通过 custom_objects 函数的 load_model 参数传递它们。

    在你的情况下:

    vae.save('./vae_'+str(cluster_num)+'.h5')
    vae.summary()
    
    del vae
    
    from keras.models import load_model
    vae = load_model('./vae_'+str(cluster_num)+'.h5', custom_objects={'latent_dim': latent_dim, 'epsilon_std': epsilon_std, 'vae_loss': vae_loss})
    vae.summary()
    

    【讨论】:

    • 它在同一个py文件中工作,但是如果我从磁盘加载h5文件时创建一个新的py文件,它不起作用,错误是:NameError:名称'latent_dim'未定义跨度>
    • 是的,custom_objects 只是一个字典。在新文件中,这些变量/函数不存在。所以你需要定义它们或pickle加载它们。此外,由于在变分损失中您需要使用z_meanz_log_var,您可能需要再次创建架构的一部分,因为pickle 不起作用。
    • 谢谢,这对我帮助很大
    • 我有不同的错误:ValueError:检查模型时出错:您传递给模型的 Numpy 数组列表不是模型预期的大小。预计会看到 2 个数组,但得到了以下 1 个数组的列表:[array([[1, 0, 0, ..., 0, 0, 0], [0, 1, 0, .. ., 0, 0, 0], [1, 0, 0, ..., 0, 0, 0], ..., [1, 0, 0, ..., 0, 0, 0], [ 1, 0, 0, ..., 0, 0, 0], [0, 1, 0, ..., 0, 0,...
    • @MarioZ 它不是load_model 错误。已评论您的question
    【解决方案2】:

    如果您在新的 py 文件中加载模型 (.h5) 文件,则可以使用 load_model('/.h5', compile = False)。 因为您在预测步骤中不需要任何自定义对象(即损失函数或latent_dim 等)。

    【讨论】:

      猜你喜欢
      • 2021-03-08
      • 2021-04-10
      • 2023-01-24
      • 1970-01-01
      • 2019-01-26
      • 2018-03-11
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      相关资源
      最近更新 更多