当尝试使用我以前训练过的简单模型进行预测时,我会得到以下错误:
张量input_1:0,在feed_devices或fetch_devices中指定的,在图中找不到
在线上:
seatbelt_model.predict(image_arr, verbose=1)代码:
from tensorflow import keras
import tensorflow as tf
import numpy as np
graph = tf.get_default_graph()
seatbelt_model = keras.models.load_model(filepath='./graphs/seatbelt_A_3_81.h5')
class SeatbeltPredictor:
INPUT_SHAPE = (-1, 120, 160, 1)
@staticmethod
def predict_seatbelt(image_arr):
with graph.as_default():
image_arr = np.array(image_arr).reshape(SeatbeltPredictor.INPUT_SHAPE)
predicted_labels = seatbelt_model.predict(image_arr, verbose=1)
return predicted_labels该模型的形状如下:
input_layer = keras.layers.Input(shape=(IMAGE_HEIGHT, IMAGE_WIDTH, 1))
conv_0 = keras.layers.Conv2D(filters=32, kernel_size=[5, 5], activation=tf.nn.relu, padding="SAME")(input_layer)
pool_0 = keras.layers.MaxPool2D(pool_size=[2, 2], strides=2, padding="VALID")(conv_0)
conv_1 = keras.layers.Conv2D(filters=32, kernel_size=[5, 5], activation=tf.nn.relu, padding="SAME")(pool_0)
pool_1 = keras.layers.MaxPool2D(pool_size=[2, 2], strides=2, padding="VALID")(conv_1)
flat_0 = keras.layers.Flatten()(pool_1)
dense_0 = keras.layers.Dense(units=1024, activation=tf.nn.relu)(flat_0)
drop_0 = keras.layers.Dropout(rate=0.4, trainable=True)(dense_0)
dense_1 = keras.layers.Dense(units=2, activation=tf.nn.softmax)(drop_0)如果运行以下命令,就会得到一个张量结果:
graph.get_tensor_by_name('input_1:0')
<tf.Tensor 'input_1:0' shape=(?, 120, 160, 1) dtype=float32>第一层的名称是input_1
image_arr是形状(1,120,160,1)
Tensorflow 1.12
有什么想法吗?
发布于 2019-02-13 14:48:37
好吧,在经历了很多痛苦和痛苦之后,我发现了以下几点:
虽然模型有一个会话和图,但在某些tensorflow方法中,使用了默认的会话和图。为了解决这个问题,我不得不解释说,我想同时使用我的会话和图形作为缺省值:
with session.as_default():
with session.graph.as_default():完整法典:
from tensorflow import keras
import tensorflow as tf
import numpy as np
import log
config = tf.ConfigProto(
device_count={'GPU': 1},
intra_op_parallelism_threads=1,
allow_soft_placement=True
)
config.gpu_options.allow_growth = True
config.gpu_options.per_process_gpu_memory_fraction = 0.6
session = tf.Session(config=config)
keras.backend.set_session(session)
seatbelt_model = keras.models.load_model(filepath='./seatbelt.h5')
SEATBEL_INPUT_SHAPE = (-1, 120, 160, 1)
def predict_seatbelt(image_arr):
try:
with session.as_default():
with session.graph.as_default():
image_arr = np.array(image_arr).reshape(SEATBEL_INPUT_SHAPE)
predicted_labels = seatbelt_model.predict(image_arr, verbose=1)
return predicted_labels
except Exception as ex:
log.log('Seatbelt Prediction Error', ex, ex.__traceback__.tb_lineno)发布于 2020-06-04 06:03:14
这是一个非常常见的问题,一个人在部署多个模型,特别是在flask应用程序。处理这一问题的最佳方法是在加载任何keras模型之前设置一个session保存graph。如果您试图使用pickled模型来预测标签,这将特别有帮助。
Steps:
session和graph。predict函数。示例完整代码:
主班
import pickle
import tensorflow as tf
from tensorflow.python.keras.backend import set_session
# your other file/class
import UserDefinedClass
class Main(object):
def __init__(self):
return
def load_models(self):
# Loading a generic model
model1 = pickle.load(open(model1_path, "rb"))
# Loading a keras model
session = tf.Session()
graph = tf.get_default_graph()
set_session(session)
model2 = pickle.load(open(model2_path, "rb"))
# Pass 'session', 'graph' to other classes
userClassOBJ = UserDefinedClass(session, graph, model1, model2)
return
def run(self, X):
# X is input
GenericLabels, KerasLables = userClassOBJ.SomeFunction(X)在不同线程或flask_call中的其他文件/类:
from tensorflow.python.keras.backend import set_session
class UserDefinedClass(object):
def __init__(self, session, graph, model1, model2):
self.session = session
self.graph = graph
self.Generic_model = model1
self.Keras_model = model2
return
def SomeFunction(self, X):
# Generic model prediction
Generic_labels = self.Generic_model.predict(X)
print("Generic model prediction done!!")
# Keras model prediciton
with self.graph.as_default():
set_session(self.session)
Keras_labels = self.Keras_model.predict(X, verbose=0)
print("Keras model prediction done!!")
return Generic_labels, Keras_labels 发布于 2020-05-27 03:47:08
我也面临着同样的问题。我当时正在开发TensorFlow 1.0,所以我想把它升级到最新的版本(2.1),然后我的代码工作得很好。
https://stackoverflow.com/questions/54652536
复制相似问题