我使用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图进行预测,也可以创建雅可比函数: