使用TensorFlow图从Keras模型进行预测

我使用Keras训练了一个模型,使用的后端是TensorFlow,但现在我需要将我的模型转换为TensorFlow图以用于某个应用。我尝试这样做并进行预测以确保其正确工作,但在与model.predict()获取的结果进行比较时,我得到了非常不同的值。例如:

from keras.models import load_modelimport tensorflow as tfmodel = load_model('model_file.h5')x_placeholder = tf.placeholder(tf.float32, shape=(None,7214,1))y = model(x_placeholder)x = np.ones((1,7214,1))with tf.Session() as sess:    sess.run(tf.global_variables_initializer())    print("Predictions from:\ntf graph:      "+str(sess.run(y, feed_dict={x_placeholder:x})))    print("keras predict: "+str(model.predict(x)))

返回结果如下:

Predictions from:tf graph:      [[-0.1015993   0.07432419  0.0592984 ]]keras predict: [[ 0.39339241  0.57949686 -3.67846966]]

Keras predict的值是正确的,但TensorFlow图的结果却不是。

如果了解最终的预期应用有帮助的话,我正在使用tf.gradients()函数创建一个雅可比矩阵,但目前与Theano的雅可比函数相比,它并未返回正确的结果,而Theano的函数给出了正确的雅可比矩阵。以下是我的TensorFlow雅可比代码:

x = tf.placeholder(tf.float32, shape=(None,7214,1))y = tf.reshape(model(x)[0],[-1])y_list = tf.unstack(y)jacobian_list = [tf.gradients(y_, x)[0] for y_ in y_list]jacobian = tf.stack(jacobian_list)

编辑:模型代码

import numpy as npfrom keras.models import Sequentialfrom keras.layers import Dense, InputLayer, Flattenfrom keras.layers.convolutional import Conv1Dfrom keras.layers.convolutional import MaxPooling1Dfrom keras.optimizers import Adamfrom keras.callbacks import EarlyStopping, ReduceLROnPlateau# 每层之后使用的激活函数,除了输出层activation = 'relu'# 模型权重初始化器initializer = 'he_normal'# 输入到输入层的输入数据形状input_shape = (None,7214,1)# 卷积层中使用的滤波器数量num_filters = [4,16]# 卷积层中滤波器的长度filter_length = 8# 最大池化窗口的长度pool_length = 4# 每个隐藏全连接层的节点数量num_hidden_nodes = [256,128]# 训练时一次输入模型的样本数量batch_size = 64# 模型训练的最大迭代次数max_epochs = 30# 优化算法的初始学习率lr = 0.0007# 优化算法中第一时刻估计的指数衰减率beta_1 = 0.9# 优化算法中第二时刻估计的指数衰减率beta_2 = 0.999# 优化算法中用于数值稳定性的小常数optimizer_epsilon = 1e-08model = Sequential([    InputLayer(batch_input_shape=input_shape),    Conv1D(kernel_initializer=initializer, activation=activation, padding="same", filters=num_filters[0], kernel_size=filter_length),    Conv1D(kernel_initializer=initializer, activation=activation, padding="same", filters=num_filters[1], kernel_size=filter_length),    MaxPooling1D(pool_size=pool_length),    Flatten(),    Dense(units=num_hidden_nodes[0], kernel_initializer=initializer, activation=activation),    Dense(units=num_hidden_nodes[1], kernel_initializer=initializer, activation=activation),    Dense(units=3, activation="linear", input_dim=num_hidden_nodes[1]),]) # 编译模型loss_function = 均方误差early_stopping_min_delta = 0.0001early_stopping_patience = 4reduce_lr_factor = 0.5reuce_lr_epsilon = 0.0009reduce_lr_patience = 2reduce_lr_min = 0.00008optimizer = Adam(lr=lr, beta_1=beta_1, beta_2=beta_2, epsilon=optimizer_epsilon, decay=0.0)early_stopping = EarlyStopping(monitor='val_loss',     min_delta=early_stopping_min_delta,                                    patience=early_stopping_patience, verbose=2, mode='min')reduce_lr = ReduceLROnPlateau(monitor='loss', factor=0.5, epsilon=reuce_lr_epsilon,                               patience=reduce_lr_patience,     min_lr=reduce_lr_min, mode='min', verbose=2)model.compile(optimizer=optimizer, loss=loss_function)model.fit(train_x, train_y, validation_data=(cv_x, cv_y),      epochs=max_epochs, batch_size=batch_size, verbose=2,      callbacks=[reduce_lr,early_stopping])model.save('model_file.h5')

回答:

@被隐藏的人名 引导我到这里

https://github.com/amir-abdi/keras_to_tensorflow

结合来自

https://github.com/metaflow-ai/blog/blob/master/tf-freeze/load.py

https://github.com/tensorflow/tensorflow/issues/675

我找到了一个解决方案,既可以使用TensorFlow图进行预测,也可以创建雅可比函数:

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注