Python 如何获取/定义图形的输入/输出名称或以适当的形式将其冻结

Python 如何获取/定义图形的输入/输出名称或以适当的形式将其冻结,python,c#,visual-studio,tensorflow,keras,Python,C#,Visual Studio,Tensorflow,Keras,大家好,我们一直在尝试将模型保存为.bytes格式,以便在c#脚本中使用它。 我们使用的是tensorflow 1.7.0 这是我们的模型: bsize=16 # define cnn model def define_model(): # load model model = VGG16(include_top=False, input_shape=(224, 224, 3)) # mark loaded layers as not trainable fo

大家好,我们一直在尝试将模型保存为.bytes格式,以便在c#脚本中使用它。 我们使用的是tensorflow 1.7.0 这是我们的模型:

bsize=16


# define cnn model
def define_model():
    # load model
    model = VGG16(include_top=False, input_shape=(224, 224, 3))
    # mark loaded layers as not trainable
    for layer in model.layers:
        layer.trainable = False
    # add new classifier layers
    flat1 = Flatten()(model.layers[-1].output)
    class1 = Dense(128, activation='relu', kernel_initializer='he_uniform')(flat1)
    output = Dense(2, activation='softmax')(class1)
    # define new model
    model = Model(inputs=model.inputs, outputs=output)
    # compile model
    # compile model
    opt = Adam(lr=0.001)
    model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
    return model
培训:

sess=tf.Session()
tf.global_variables_initializer().run(session=sess)
model = define_model()
# create data generator
datagen = ImageDataGenerator(rescale=1.0/255.0)
# prepare iterators
train_it = datagen.flow_from_directory(mpath+'/train',
class_mode='categorical', batch_size=bsize, target_size=(224, 224))
test_it = datagen.flow_from_directory(mpath+'/test',
class_mode='categorical', batch_size=bsize, target_size=(224, 224))
# fit model
history = model.fit_generator(train_it, steps_per_epoch=len(train_it),
validation_data=test_it, validation_steps=len(test_it), epochs=1, verbose=0)
# evaluate model
_, acc = model.evaluate_generator(test_it, steps=len(test_it), verbose=0)
print('> %.3f' % (acc * 100.0))

model.save_weights("weights.h5")
冻结:

K.clear_session()
K.set_learning_phase(0)
model = define_model()
model.load_weights("weights.h5")

save_dir = "./out"


tf.saved_model.simple_save(K.get_session(),
                           save_dir,
                           inputs={"input": model.inputs[0]},
                           outputs={"output": model.outputs[0]})

freeze_graph.freeze_graph(None,
                          None,
                          None,
                          None,
                          model.outputs[0].op.name,
                          None,
                          None,
                          os.path.join(save_dir, "frozen_model.bytes"),
                          False,
                          "",
                          input_saved_model_dir=save_dir)
然后,我们尝试使用以下方法查看输入和输出名称:

    model.inputs[0].name
    model.ouputs[0].name
最后,我们希望在c#中使用此图:

然而,正如我们从错误中了解到的,输入和输出名称是错误的。而且无论何时我们打电话

model.inputs[0].name
model.ouputs[0].name
即使我们将输出名称定义为name=“output”,它们也会打印不同的输入和输出名称

您对如何冻结此模型、获取输入和输出名称等有何建议

关于

这个怎么样:

my_input = tf.keras.layers.Input(shape=[224,224,3], name="my_input")
vgg = tf.keras.applications.VGG16(input_tensor=my_input)
my_output = tf.identity(vgg.output, name="my_output")
现在您知道了输入和输出张量的名称:

In [0]: my_input                                                                                                                                                                    
Out[0]: <tf.Tensor 'my_input:0' shape=(?, 224, 224, 3) dtype=float32>

In [1]: my_output                                                                                                                                                                   
Out[1]: <tf.Tensor 'my_output:0' shape=(?, 1000) dtype=float32>
[0]中的
:我的\u输入
输出[0]:
在[1]:我的_输出
出[1]:
这个怎么样:

my_input = tf.keras.layers.Input(shape=[224,224,3], name="my_input")
vgg = tf.keras.applications.VGG16(input_tensor=my_input)
my_output = tf.identity(vgg.output, name="my_output")
现在您知道了输入和输出张量的名称:

In [0]: my_input                                                                                                                                                                    
Out[0]: <tf.Tensor 'my_input:0' shape=(?, 224, 224, 3) dtype=float32>

In [1]: my_output                                                                                                                                                                   
Out[1]: <tf.Tensor 'my_output:0' shape=(?, 1000) dtype=float32>
[0]中的
:我的\u输入
输出[0]:
在[1]:我的_输出
出[1]:

对于那些有类似问题的人:

model.inputs[0].name
model.ouputs[0].name
产生这样的结果:

input_1:0
dense_2/Softmax:0
但您不应在中直接使用它们。因此,请不要:

.AddInput(graph["input_1:0"][0], tensor).Fetch(graph[dense_2/Softmax:0][0]);
这样做:

.AddInput(graph["input_1"][0], tensor).Fetch(graph[dense_2/Softmax][0]);

因此,上面的代码实际上可以工作,只需从名称字符串中省略:0部分,对于那些有类似问题的人来说,这就是:D

model.inputs[0].name
model.ouputs[0].name
产生这样的结果:

input_1:0
dense_2/Softmax:0
但您不应在中直接使用它们。因此,请不要:

.AddInput(graph["input_1:0"][0], tensor).Fetch(graph[dense_2/Softmax:0][0]);
这样做:

.AddInput(graph["input_1"][0], tensor).Fetch(graph[dense_2/Softmax][0]);

因此,上面的代码实际上是有效的,只是从名称字符串中省略了:0部分,仅此而已:D

是的,实际上我正在寻找类似的代码。非常感谢您的回复,但不幸的是,我遇到了一个“输出掩码”错误。也许我无法将其适应我的代码,或者可能这又是一个版本问题(我有很多版本问题:'))是的,实际上我正在寻找类似的东西。非常感谢您的回复,但不幸的是,我遇到了一个“输出掩码”错误。可能我无法将其适应我的代码,或者可能这又是一个版本问题(我有很多版本问题:'))