首页 > 解决方案 > AttributeError:“DType”对象没有属性“类型”Tensorflow Serving

问题描述

我正在尝试在 tensorflow 中使用一个函数(来自另一个模块)。该函数接受一个 numpy 数组并返回更改点。我的主要目标是在 tensorflow 服务上部署这个模型。我遇到了错误

AttributeError:“DType”对象没有属性“类型”

有 2 个函数,一个是 create_data(),它创建一个 numpy 数组并返回它,另一个是 change(),它接受 numpy 数组并使用前面提到的函数返回更改点。我创建了一个占位符来接受输入数据,一个执行函数的操作。问题是,如果我尝试通过占位符发送数据,我会遇到错误。如果我将数据直接发送到函数中,它就会运行。以下是我的代码。

def create_data():
    np.random.seed(0)
    size = 100
    mean_a = 0.0
    mean_b = 10.0
    mean_c = 0
    var = 0.1
    data_a = np.random.normal(mean_a, var, size)
    data_b = np.random.normal(mean_b, var, size)
    data_c = np.random.normal(mean_c, var, size)
    data = np.concatenate([data_a, data_b, data_c])
    return data

def change(data):
    # what else i tried
    # data = np.array(data, dtype=np.float)
    # above line gives another error mentioned after code 
    cpts = (pelt(normal_mean(x, np.var(x)), len(x)))
    return cpts

sess = tf.Session()
x = tf.placeholder(tf.float32, shape=[300, ], name="myInput")
y = tf.convert_to_tensor(change(x),np.float32,name="myOutput")
z = sess.run(y,feed_dict={x:create_data()})

如果我尝试data = np.array(data, dtype=np.float)函数 change() 中的代码,它会给我错误

ValueError:使用序列设置数组元素。

我也尝试过data = np.hstack((data)).astype(np.float)data = np.vstack((data)).astype(np.float)但它遇到了一个单独的错误,说使用 tf.map_fn。我还尝试使用 tf.eval() 来转换数字,但我无法让它们在带有占位符的函数中运行。

但是如果我直接发送输出,

y = tf.convert_to_tensor(change(create_data()),np.float32,name="myOutput")

有用。

我应该如何发送输入以使其工作?

编辑:如果有人想知道,有问题的功能就是这个。

标签: python-3.xnumpytensorflowtensorflow-serving

解决方案


当您尝试将张量传递给 numpy 函数时会引发此错误

您需要使用tf.py_func将 python 函数包含到 tensorflow 图中

(另外,你的 change() 函数使用数据作为参数而不是 x)

这是对我有用的代码

import numpy as np
import tensorflow as tf
from changepy import pelt
from changepy.costs import normal_mean

def create_data():
    np.random.seed(0)
    size = 100
    mean_a = 0.0
    mean_b = 10.0
    mean_c = 0
    var = 0.1
    data_a = np.random.normal(mean_a, var, size)
    data_b = np.random.normal(mean_b, var, size)
    data_c = np.random.normal(mean_c, var, size)
    data = np.concatenate([data_a, data_b, data_c])
    return data

def change(x):
    # what else i tried
    # data = np.array(data, dtype=np.float)
    # above line gives another error mentioned after code 

    cpts = (pelt(normal_mean(x, np.var(x)), len(x)))
    return cpts


sess = tf.Session()
x = tf.placeholder(tf.float32, shape=[300, ], name="myInput")
y = tf.convert_to_tensor(tf.compat.v1.py_func(change, [x], 3*[tf.int64]),np.float32,name="myOutput")
z = sess.run(y,feed_dict={x:create_data()})
print(z)

推荐阅读