我设法在Tensorflow中使用下面的图表训练我自己的模型:
在Python中它看起来像:
with tf.name_scope("Reshaping_data") as scope:
x = tf.reshape(x, shape=[-1, imgSize, imgSize, 1], name="inp") #(?, 48, 48, 1)
with tf.name_scope("Conv1") as scope:
conv1 = conv2d(x, weights['wc1'], biases['bc1']) #(?, 48, 48, 32)
conv1 = maxpool2d(conv1, k=2) #(?, 24, 24, 32)
...(更多卷积和完全连接)......
out = tf.add(tf.matmul(fc1, weights['out']), biases['out'], name="out") #(?, 43)
我用GTSRB Dataset训练了它并保存了模型。现在我想用这个模型标记一个新图像。 我目前的label.py:
import tensorflow as tf
checkpoint_file = tf.train.latest_checkpoint("saved_models")
graph = tf.Graph()
with graph.as_default():
sess = tf.Session()
with sess.as_default():
saver = tf.train.import_meta_graph("{}.meta".format(checkpoint_file))
saver.restore(sess,checkpoint_file)
inp = graph.get_operation_by_name("Reshaping_data/inp").outputs[0]
prediction=graph.get_operation_by_name("out").outputs[0]
input_img = tf.image.decode_jpeg(tf.read_file("/home/DB/GTSRB/Test/00021/07406.jpg"), channels=3)
reshaped_image = tf.image.resize_image_with_crop_or_pad(tf.cast(input_img, tf.float32), 48, 48)
float_image = tf.image.per_image_standardization(reshaped_image)
images = tf.expand_dims(float_image, 0)
print(sess.run(prediction,feed_dict={inp:images}))
但是在阅读feed_dict时失败了。我做错了什么?
Traceback (most recent call last):
File "label.py", line 23, in <module>
print(sess.run(prediction,feed_dict={inp:images}))
File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/client/session.py", line 767, in run
run_metadata_ptr)
File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/client/session.py", line 925, in _run
raise TypeError('The value of a feed cannot be a tf.Tensor object. '
TypeError: The value of a feed cannot be a tf.Tensor object. Acceptable feed values include Python scalars, strings, lists, or numpy ndarrays.
非常感谢!
答案 0 :(得分:1)
由于Tensor / op被传递到feed_dict
,Tensorflow会抛出错误。如果你print images
你会注意到你没有看到一个numpy数组而是一个张量,这通常直到会话运行时才计算出来。您传递到feed_dict
的任何内容都需要知道,例如“错误提到的Python标量,字符串,列表或numpy ndarray”,在您的情况下将是一个numpy ndarray。
不是使用张量流来读取图像并重新整形,而是尝试使用scipy,matplotlib或opencv中的imread
函数,然后将numpy重新整形。
答案 1 :(得分:1)
解决这个问题:
checkpoint_file = tf.train.latest_checkpoint("saved_models")
imgSize = 48
graph = tf.Graph()
with graph.as_default():
sess = tf.Session()
with sess.as_default():
saver = tf.train.import_meta_graph("{}.meta".format(checkpoint_file))
saver.restore(sess,checkpoint_file)
inp = graph.get_operation_by_name("Reshaping_data/inp").outputs[0]
prediction=graph.get_operation_by_name("out").outputs[0]
img = imread(imagepath, flatten=True)
img = imresize(img, [imgSize, imgSize])
img = img.astype('float32')
img_mean = np.mean(img)
img_var = np.std(img)
img = (img - img_mean)/img_var
#img = (48, 48)
img = np.expand_dims(img, axis=2)
#img = (48, 48, 1)
img = np.expand_dims(img, axis=0)
#img = (1, 48, 48, 1)
#inp expects (?, 48, 48, 1)
res = sess.run(prediction,feed_dict={inp:img})
print(res)
print(res.argmax(axis=1))