【发布时间】:2020-03-24 06:37:03
【问题描述】:
在我的张量流模型中,一个网络的输出是张量。我需要将此值作为输入提供给另一个预训练网络。我正在加载预训练网络如下
input_b_ph = tf.placeholder(shape=(), dtype=float.32, name='input_b_ph')
sess1 = tf.Session()
saver = tf.train.import_meta_graph(model_path.as_posix() + '.meta', input_map={'input/Identity:0': input_b_ph})
graph = tf.get_default_graph()
saver.restore(sess1, model_path.as_posix())
output_b = graph.get_tensor_by_name('output/Identity:0')
我需要向feature_input 提供一个张量。我怎样才能做到这一点?
编辑 1:添加端到端详细信息:
我在 tensorflow 中定义了一个网络 A,它接受输入 input_a 并产生输出 output_a。我需要将其提供给 ResNet50 预训练模型。为此,我使用了来自tf.keras 的ResNet50
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.applications.resnet50 import preprocess_input
resnet_model = ResNet50(include_top=False, pooling='avg')
preprocessed_input = preprocess_input(tf.cast(output_a, tf.float32))
output_resnet = resnet_model([preprocessed_input])
ResNet 的输出是output_resnet。这我需要提供给另一个预训练网络,比如网络B。 B 实际上是用 Keras 编写的。我将其修改为使用tf.keras。然后我将训练好的模型保存如下:
import tensorflow as tf
from tensorflow import keras
curr_sess = keras.backend.get_session()
with tf.name_scope('input'):
_ = tf.identity(quality_net.model.input)
with tf.name_scope('output'):
__ = tf.identity(quality_net.model.output)
saver = tf.train.Saver()
saver.save(curr_sess, output_filepath.as_posix())
我可以访问此网络B 并尝试以h5 格式保存模型,但它给出了模型是线程锁的错误。在互联网上搜索时,我知道当网络中有Lambda 层时会出现此错误。因此,我采用 tensorflow 格式保存模型 - 3 个文件:元、权重和索引。 (任何使用 h5 格式的方案也是可以接受的)。
这里有一个警告。网络B 的结构可以不断变化,它来自不同的项目。所以我不能硬编码B 的架构。我必须从保存的模型中加载它。我的问题是如何恢复这个预训练模型并将output_resnet 作为输入传递给网络B。网络B 即output_b 的输出是训练我的原始网络A 的损失函数。目前我可以按如下方式恢复网络 B:
input_b_ph = tf.placeholder(shape=(), dtype=float.32, name='input_b_ph')
sess1 = tf.Session()
saver = tf.train.import_meta_graph(model_path.as_posix() + '.meta', input_map={'input/Identity:0': input_b_ph})
graph = tf.get_default_graph()
saver.restore(sess1, model_path.as_posix())
output_b = graph.get_tensor_by_name('output/Identity:0')
我的 resnet 输出为 output_resnet,这是一个张量。我需要一种方法将其设置为input_b_ph。我怎样才能做到这一点?任何替代解决方案也是可以接受的
【问题讨论】:
-
我想这与your previous question 有关,但我不确定我是否理解其中的区别,或者在这种情况下您究竟需要实现什么。您希望能够执行
session.run(out, feed_dict={feature_input: x})之类的操作,其中x是tf.Tensor?这是不可能的(参见例如here),如果您想将一个模型的输出连接到下一个模型的输入,feature_input应该是第一个模型生成的tf.Tensor,而不是占位符。跨度> -
是的,这是上一个问题的延续。是的,我知道将张量馈送到占位符是不可能的。我已经详细更新了我的问题。请看一下,让我知道是否有任何可能的方法。谢谢。询问我是否需要进一步说明。
-
感谢您提供更多详细信息。不过,很抱歉,我仍然不确定我是否完全理解。你不能简单地传递
input_map={'input/Identity:0': output_resnet}吗? -
这行得通吗?不应该将占位符传递给 input_map 吗?我会试试的(明天)。谢谢
-
是的,任何张量值都应该没问题,看看是否可行。
标签: python python-3.x tensorflow deep-learning tf.keras