将张量值分配给 tensorflow v1.13 中的占位符
Assign tensor value to placeholder in tensorflow v1.13
在我的张量流模型中,一个网络的输出是一个张量。我需要将该值作为输入提供给另一个预训练网络。我正在按如下方式加载预训练网络
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
。我怎样才能做到这一点?任何替代解决方案也是可以接受的
为了社区的利益,在此(答案)部分提及答案(尽管它出现在评论部分)。
在这种情况下不需要 Placeholder
。只需将 output_resnet
传递给 input_map
即可解决问题。
替换代码,
saver = tf.train.import_meta_graph(model_path.as_posix() + '.meta',
input_map={'input/Identity:0': input_b_ph})
和
saver = tf.train.import_meta_graph(model_path.as_posix() + '.meta',
input_map={'input/Identity:0': output_resnet})
已解决问题。
在我的张量流模型中,一个网络的输出是一个张量。我需要将该值作为输入提供给另一个预训练网络。我正在按如下方式加载预训练网络
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
。我怎样才能做到这一点?任何替代解决方案也是可以接受的
为了社区的利益,在此(答案)部分提及答案(尽管它出现在评论部分)。
在这种情况下不需要Placeholder
。只需将 output_resnet
传递给 input_map
即可解决问题。
替换代码,
saver = tf.train.import_meta_graph(model_path.as_posix() + '.meta',
input_map={'input/Identity:0': input_b_ph})
和
saver = tf.train.import_meta_graph(model_path.as_posix() + '.meta',
input_map={'input/Identity:0': output_resnet})
已解决问题。