tensorflow - 关于内核权重的 TensorRT 5 UFFParser 错误
问题描述
我正在尝试使用 Tensorflow 模型进行转换然后运行推理。
我用 tf.keras 生成了一个 Tensorflow 模型:
model = Sequential()
model.add(Conv2D(64, kernel_size=3, activation='relu', input_shape=(224,224,3), name='image'))
model.add(Conv2D(32, kernel_size=3, activation='relu'))
model.add(Flatten())
model.add(Dense(num_classes, activation='softmax', name='output'))
我训练模型然后我转换文件保存一个.pb tensorflow冻结图形文件,转换为UFF:
uff_model = uff.from_tensorflow_frozen_model(
frozen_file="model/tensorflow/simplemodel.pb",
output_nodes=["output/Softmax"],
output_filename="model/tensorrt/simplemodel.uff")
当我解析模型时:
TRT_LOGGER = trt.Logger(trt.Logger.INFO)
builder = trt.Builder(TRT_LOGGER)
network = builder.create_network()
parser = trt.UffParser()
parser.register_input("image_input", (1, 224, 224, 3))
parser.register_output("output/SoftMax")
parser.parse("model/tensorrt/simplemodel.uff", network)
我收到了这个错误:
[TensorRT] INFO: UFFParser: parsing image_input
[TensorRT] INFO: UFFParser: parsing image/kernel
[TensorRT] INFO: UFFParser: parsing image/Conv2D
[TensorRT] INFO: UFFParser: parsing image/bias
[TensorRT] INFO: UFFParser: parsing image/BiasAdd
[TensorRT] ERROR: image/Conv2D: kernel weights has count 1728 but 129024 was expected
[TensorRT] ERROR: UFFParser: Parser error: image/BiasAdd: The input to the Scale Layer is required to have a minimum of 3 dimensions.
为什么关于内核权重的错误计数?我将输入形状设置为正确的大小(224,244,3...),这是我的模型:
Layer (type) Output Shape Param #
=================================================================
image (Conv2D) (None, 222, 222, 64) 1792
_________________________________________________________________
conv2d (Conv2D) (None, 220, 220, 32) 18464
_________________________________________________________________
flatten (Flatten) (None, 1548800) 0
_________________________________________________________________
output (Dense) (None, 6) 9292806
=================================================================
Total params: 9,313,062
Trainable params: 9,313,062
Non-trainable params: 0
谢谢,
伊戈尔
解决方案
Tensorrt 使用 NCHW 格式。因此
parser.register_input("image_input", (1, 224, 224, 3))
本来应该
parser.register_input("image_input", (1, 3, 224, 224))
在您的情况下,它假设 224 是输入中的通道数。因此,权重参数的数量将是 224*64*3*3 = 129204 (input_channels*output_channels*kernel_height*kernel*width)
推荐阅读
- r - Group_by 使用数据框过滤
- c - C 复杂函数声明
- python - 在 python、selenium 中使用 xpath 从网页中抓取数据
- servlets - 如何使用 WebSphere 8.5.5 传统支持 Servlet 3.1
- list - 排序 List(Double, (String, List[String])) 首先按 Double 然后按元组中的第一个 String 值
- mysql - MySQL:通过将位于两个单独表中的价格和数量列相乘来计算餐厅数据库中每个订单的总价格
- python - 查询不会使用变量运行
- c++ - 用 const 定义的变量会占用内存吗?
- swift - 如何在对同一链中的 dataTaskPublisher 的请求中使用来自一个发布者的值?
- python - 如何从 while 循环中删除尾随逗号?