Python 在C+中使用加载的tensorflow模型运行推理+;

Python 在C+中使用加载的tensorflow模型运行推理+;,python,c++,tensorflow,Python,C++,Tensorflow,本例中我的tensorflow模型很简单,已经成功加载。我的问题是,要运行推断,我要传递什么tf::Session?我如何创建上面提到的feedDict,我的“输出”是什么 以下是python中的模型: model = tf.keras.Sequential([ tf.keras.layers.Convolution2D(filters, (5, 5), input_shape=(BoardDepth, BoardLength, BoardLength), data_format='channe

本例中我的tensorflow模型很简单,已经成功加载。我的问题是,要运行推断,我要传递什么tf::Session?我如何创建上面提到的feedDict,我的“输出”是什么

以下是python中的模型:

model = tf.keras.Sequential([
tf.keras.layers.Convolution2D(filters, (5, 5), input_shape=(BoardDepth, BoardLength, BoardLength), data_format='channels_first', name='Input'),
tf.keras.layers.Activation('relu', name='Relu'),
tf.keras.layers.MaxPooling2D(pool_size=(2,2), name='Pool'),
tf.keras.layers.Flatten(name="Flatten"),
tf.keras.layers.Dense(BoardSize, activation='softmax', name='Output'),
])

optimizer = tf.train.AdamOptimizer(learning_rate=0.0018)

model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy']) 
以下是用于训练模型的方法,该模型使用生成器将图像输入:

earlyExit = keras.callbacks.EarlyStopping(monitor='val_acc', min_delta=0, patience=0)

# Train the model
history = model.fit_generator(generator=gen.generator(),
                steps_per_epoch=gen.stepsPerEpoch(),
                validation_data=valGen.generator(),
                validation_steps=valGen.stepsPerEpoch(),
                epochs=numEpochs, 
                verbose=2, workers=1, callbacks=[earlyExit])
以下是用于保存模型的方法:

K.set_learning_phase(0)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    saver = tf.train.Saver(tf.trainable_variables())
    saver.save(sess, './models/test/latestModel')
如果你没有遵循上面的链接,推理应该是这样做的:

// and run the inference to your liking
auto feedDict = ...
auto outputOps = ...
std::vector<tensorflow::Tensor> outputTensors;
status = session->Run(feedDict, outputOps, {}, &outputTensors);
auto shape = tf::TensorShape({ BoardDepth, BoardSize, BoardSize});

// Placeholder until we're using actual input data
float inData[inputSize] = { 0.0 };

tf::Tensor input(tf::DT_FLOAT, shape);
std::copy_n(inData, inputSize, input.flat<float>().data());

std::vector<std::pair<std::string, tf::Tensor>> inputs = {
    { "Input/Conv2D", input },
};

std::vector<std::string> outOps = { "Output/bias:0"};

std::vector<tf::Tensor> outputs;

status = session->Run(inputs, outOps, {}, &outputs);
//然后根据您的喜好运行推理
自动feedDict=。。。
自动输出端口=。。。
矢量输出传感器;
状态=会话->运行(feedDict、outputOps、{}和outputSensors);
我试着遵循这个例子,但似乎无法弄清楚我需要传递什么作为输出。我需要只传递输出节点的名称,还是需要传递模型中的每个操作?到目前为止,我尝试的不同配置都不起作用

到目前为止,我的代码如下所示:

// and run the inference to your liking
auto feedDict = ...
auto outputOps = ...
std::vector<tensorflow::Tensor> outputTensors;
status = session->Run(feedDict, outputOps, {}, &outputTensors);
auto shape = tf::TensorShape({ BoardDepth, BoardSize, BoardSize});

// Placeholder until we're using actual input data
float inData[inputSize] = { 0.0 };

tf::Tensor input(tf::DT_FLOAT, shape);
std::copy_n(inData, inputSize, input.flat<float>().data());

std::vector<std::pair<std::string, tf::Tensor>> inputs = {
    { "Input/Conv2D", input },
};

std::vector<std::string> outOps = { "Output/bias:0"};

std::vector<tf::Tensor> outputs;

status = session->Run(inputs, outOps, {}, &outputs);
auto shape=tf::TensorShape({BoardDepth,BoardSize,BoardSize});
//占位符,直到我们使用实际的输入数据
浮点inData[inputSize]={0.0};
tf::张量输入(tf::DT_FLOAT,shape);
std::copy_n(inData,inputSize,input.flat().data());
标准::矢量输入={
{“Input/Conv2D”,Input},
};
标准::向量输出={“输出/偏差:0”};
向量输出;
状态=会话->运行(输入、输出、{}和输出);

输入/输出名称只是设置为我能找到的不会抛出错误的名称。我真的不知道我应该如何设置它们,以使模型能够像训练时那样工作

它的工作原理与存储库中给定的
example.py
完全相同

用python编写:

将tensorflow导入为tf
将numpy作为np导入
sess=tf.Session()
从keras导入后端为K
K.SETU会话(sess)
img=tf.placeholder(tf.float32,shape=(无,2),name='input\u plhdr')
模型=tf.keras.Sequential([
tf.keras.layers.Dense(10,活化='relu',名称='Intermediate'),
tf.keras.layers.density(2,activation='softmax',name='Output'),
])
M=模型(img)
打印('输入',图像名称)
打印('output',M.name)
sess.run(tf.global\u variables\u initializer())
print('result',sess.run(M,{img:np.array([[42,43.]],dtype=np.float32]))
saver=tf.train.saver(tf.global_variables())
saver.save(sess,“./导出/my_model”)
tf.train.write_graph(sess.graph,“.”,“/exported/graph.pb”,如_text=False)

告诉您输入和输出的名称。调整
推断\u cc.cc
您只需填写正确的名称:

//与python文件中的相同
自动数据=data.flat().data();
数据_0]=42;
数据_u1]=43;
张量输入{
{“input_plhdr”,data},
};
向量输出;
TF_CHECK_OK(sess->Run(feed_dict,{“sequential/Output_1/Softmax:0”},{},&outputs));

std::cout打印输出张量名称作为Patwie的答案,显示如何解决一半的问题。keras的输入张量名称似乎是第一层的名称+\u input,所以在我的例子中,我的输入名称是input\u input

你的tf.placeholder在哪里?keras.com在哪里?基本上,您只需要传递输出张量名称。我需要tf.placeholder做什么?我将keras的编译和用于保存模型的代码添加到上述python代码中。我试着设置OutOs= {“输出”}(最后一层的名称),但没有用,并给出了一个错误:“FutCHOuttoNo.NoestOutlook:没有找到”。C++代码在这里显示给我看。至少它和我现在用的差不多。到目前为止,我看到的唯一区别是,我没有将“:0”添加到任何节点名称中。您应该作为输出节点移交的节点肯定就是最后一个节点。你绝对确定你的图表加载正确吗?也许将图形保存为文本会有所帮助,这样您就可以检查它是否保存了您所期望的内容,并搜索输出节点的确切名称。您可以使用tf.train.write_graph(…,as_text=True)实现这一点。必须有某种方法将数据输入到图形中。最简单的方法是使用
tf.placeholder
。诀窍就是使用
which_tensor.name
获取张量名称,并在
feed_dict
output
@Patwie中使用它,现在我正在使用model.fit_generator()将数据馈送到模型中,而没有tf.placeholder。有没有一种方法可以使用它,或者找到输入张量的名称?所以现在我正在使用keras.fit_generator()将图像提供给我的模型,有没有一种方法可以将tf.placeholder与之集成?还是有必要呢?为了清晰起见,我在示例代码中添加了当前用于训练模型的方法。我对keras不太熟悉。有没有机会创建一个完整的工作要点?我实际上刚刚找到keras使用的输入张量命名方案。感谢您对输出张量名称的帮助!不幸的是,现在我遇到了CUDNN错误
input           Tensor<type: float shape: [1,2] values: [42 43]>
output          Tensor<type: float shape: [1,2] values: [1 1.89797431e-11]>