tensorflow

这篇博客主要讨论了在使用TensorFlow时遇到的常见问题,包括在Flask部署时的FailedPreconditionError,tensorflow Serving的错误以及如何解决AttributeError、ValueError和UnicodeDecodeError。还介绍了TensorFlow Serve的安装、Docker部署以及GPU版本检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 部署flask报错

1.1 ValueError: Tensor Tensor("fc1000/Softmax:0", shape=(?, 1000), dtype=float32) is not an element of this graph.

在将keras部署在flask时,使用https://github.com/jrosebr1/simple-keras-rest-api这个例程时,会遇到这个问题

在初始化模型后,增加graph = tf.get_default_graph()

使用模型预测功能时,添加with graph.as_default():

参考

1.2 FailedPreconditionError (see above for traceback): Attempting to use uninitialized value

没有初始化变量,需要在sess内执行

with graph.as_default():
  #init_a = tf.initialize_all_variables()
  init_b = tf.global_variables_initializer()
  #init_c  = tf.local_variables_initializer()
  with tf.Session() as sess:
    #sess.run(init_a)
    sess.run(init_b)
    #sess.run(init_c)

注意graph和sess的位置

参考参考参考

2 tensorflow报错

2.1 AttributeError: ‘list’ object has no attribute ‘dtype’ when exporting model for tensorflow serving

将python的数据格式转换成tf的数据格式

tf.convert_to_tensor(model.output)

参考

2.2 tf.image.resize_images报错ValueError: ‘images’ contains no shape.

在执行tf.image.resize_images之前tf.image.decode_image的语句替换成

tf.image.decode_jpeg(如果图片是jpeg格式)

tf.image.decode_png(如果图片是png格式)

参考

2.3 UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte

将tensorflow 升级到1.12,当前python版本为3.6

参考

3 tensorflow serve

3.1 安装与示例

先要安装docker

# Download the TensorFlow Serving Docker image and repo
docker pull tensorflow/serving
git clone https://github.com/tensorflow/serving
# Location of demo models
TESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata"

# Start TensorFlow Serving container and open the REST API port
docker run -t --rm -p 8501:8501 \
   -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" \
   -e MODEL_NAME=half_plus_two \
   tensorflow/serving &

# Query the model using the predict API
curl -d '{"instances": [1.0, 2.0, 5.0]}' \
   -X POST http://localhost:8501/v1/models/half_plus_two:predict

# Returns => { "predictions": [2.5, 3.0, 4.5] }

参考

3.2 invalid argument type=bind for --mount flag invalid field '' must be a key=value pair

docker运行命令的逗号后面不要加空格

docker run -p 8500:8500 \
--mount type=bind,source=/tmp/mnist,target=/models/mnist \
-e MODEL_NAME=mnist -t tensorflow/serving &

参考

3.3 docker中绑定tensorflow serving

docker run -p 8500:8500 \
  --mount type=bind,source=/root/yanzi/yolo_saved_model,target=/models/yolo \
  -t --entrypoint=tensorflow_model_server tensorflow/serving --enable_batching \
  --port=8500 --model_name=yolo --model_base_path=/models/yolo &
docker run --runtime=nvidia -p 8500:8500 \
  --mount type=bind,source=/home/yanzi/yolo_saved_model,target=/models/yolo \
  -t --entrypoint=tensorflow_model_server tensorflow/serving:latest-gpu --enable_batching \
  --port=8500 --model_name=yolo --model_base_path=/models/yolo &

3.4 dokcer中部署多个model

docker run -p 8500:8500 \
  --mount type=bind,source=/root/yanzi/word_saved_model,target=/models/word \
  --mount type=bind,source=/root/yanzi/yolo_saved_model,target=/models/yolo \
  --mount type=bind,source=/root/yanzi/models.config,target=/models/models.config \
  -t tensorflow/serving --model_config_file=/models/models.config &

其中models.config文件如下:

model_config_list: {
  config: {
    name:  "yolo",
    base_path:  "/models/yolo",
    model_platform: "tensorflow",
    model_version_policy: {
        all: {}
    }
  },
  config: {
    name:  "word",
    base_path:  "/models/word",
    model_platform: "tensorflow",
    model_version_policy: {
        all: {}
    }
  }
}

参考serving/tensorflow_serving/g3doc/docker.md

参考

4 dataset导入图片

def image_dataset(directory):

    # 函数的功能时将filename对应的图片文件读进来,并缩放到统一的大小
    def _parse_function(filename, label):
        image_string = tf.read_file(filename)
        image_decoded = tf.image.decode_jpeg(image_string)
        image_resized = tf.image.resize_images(image_decoded, [28, 28])
        return image_resized, label

    file_temp = []
    label_temp = []

    pos_directory = os.path.join(directory, 'positive')
    pos_fileList = os.listdir(pos_directory)
    for file in pos_fileList:
        file_temp.append(os.path.join(pos_directory, file))
        label_temp.append(1)

    neg_directory = os.path.join(directory, 'negative')
    neg_fileList = os.listdir(neg_directory)
    for file in neg_fileList:
        file_temp.append(os.path.join(neg_directory, file))
        label_temp.append(0)

    # 图片文件的列表
    filenames = tf.constant(file_temp)
    # label[i]就是图片filenames[i]的label
    labels = tf.constant(label_temp)

    # 此时dataset中的一个元素是(filename, label)
    dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))

    # 此时dataset中的一个元素是(image_resized, label)
    dataset = dataset.map(_parse_function)

    return dataset

参考

5 SGD的momentum参数作用

梯度下降中的一种加速技术,如果上一次的momentum(冲量)与这一次的负梯度是相同的,那么这次下降的幅就会加大,因此可以起到加速收敛的作用,冲量的建议配置为0.9

6 使用sigmoid函数作为神经元,代价损失函数

如果使用方差代价函数(即采用均方误差MSE),会导致在梯度下降过程中w和b的更新非常慢,采用交叉熵代价函数可以克服这个问题

参考

另外,对数似然函数(log-likelihood cost)也常用来作为softmax的损失函数,softmax回归(使用softmax)是logistics回归(使用sigmoid)的多类别推广

参考

7 检测tensorflow是否gpu版本

import tensorflow as tf
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值