如何在 python 中将 ndarray 呈现给经过训练的 caffe net?
How to present ndarray to trained caffe net in python?
我正在尝试在 python 中使用完全连接的 caffe 神经网络 (NN)。原来的 model/NN 是在 Keras 中实现和训练的,然后使用 MMdnn.
转换为 caffe 模型
我要呈现给NN的数据是一个numpy数组。它应该将其推入网络,然后对输出进行 class 预测。
但是,当我尝试将一维 numpy 数组呈现给加载的 caffe 模型时,出现以下错误:
File "/pythonpath/python3.7/site-packages/caffe/pycaffe.py", line 119, in _Net_forward
outputs = set(self.outputs + blobs)
TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32')
我在 google 和 Whosebug 上进行了搜索,但无法解决问题。 你能帮忙吗?
关于我做了什么的描述:
我通过以下方式定期加载我的 caffe 模型:
nn = caffe.Net('/model_path/model.prototxt',
'/model_path/model.caffemodel',
caffe.TEST)
这给了我以下日志(成功?):
WARNING: Logging before InitGoogleLogging() is written to STDERR
W0423 14:53:15.663930 11914 _caffe.cpp:139] DEPRECATION WARNING - deprecated use of Python interface
W0423 14:53:15.663944 11914 _caffe.cpp:140] Use this instead (with the named "weights" parameter):
W0423 14:53:15.663946 11914 _caffe.cpp:142] Net('/path/model.prototxt', 1, weights='/path/model.caffemodel')
I0423 14:53:15.665053 11914 net.cpp:51] Initializing net from parameters:
state {
phase: TEST
level: 0
}
layer {
name: "dense_1_input"
type: "Input"
top: "dense_1_input"
input_param {
shape {
dim: 1
dim: 40
}
}
}
.... more layers ...
layer {
name: "output_activation"
type: "Softmax"
bottom: "output"
top: "output_activation"
}
I0423 14:53:15.665112 11914 layer_factory.hpp:77] Creating layer dense_1_input
I0423 14:53:15.665118 11914 net.cpp:84] Creating Layer dense_1_input
I0423 14:53:15.665122 11914 net.cpp:380] dense_1_input -> dense_1_input
I0423 14:53:15.665140 11914 net.cpp:122] Setting up dense_1_input
I0423 14:53:15.665143 11914 net.cpp:129] Top shape: 1 40 (40)
I0423 14:53:15.665148 11914 net.cpp:137] Memory required for data: 160
.... more layers ...
I0423 14:53:15.665232 11914 layer_factory.hpp:77] Creating layer output_activation
I0423 14:53:15.665236 11914 net.cpp:84] Creating Layer output_activation
I0423 14:53:15.665239 11914 net.cpp:406] output_activation<- output
I0423 14:53:15.665242 11914 net.cpp:380] output_activation-> output_activation
I0423 14:53:15.665248 11914 net.cpp:122] Setting up output_activation
I0423 14:53:15.665251 11914 net.cpp:129] Top shape: 1 3 (3)
I0423 14:53:15.665254 11914 net.cpp:137] Memory required for data: 248
I0423 14:53:15.665256 11914 net.cpp:200] output_activation does not need backward computation.
.... more layers ...
I0423 14:53:15.665269 11914 net.cpp:242] This network produces output output_activation
I0423 14:53:15.665272 11914 net.cpp:255] Network initialization done.
我要呈现给 NN 的数据存储在一个 numpy 数组中。这是给咖啡模型这样的:
# print data, its shape and type
print("Data:")
print(test_data)
print("Data shape:")
print(test_data.shape)
print("Data type:")
print(type(test_data))
print("Type of array elements:")
print(type(test_data[0][0]))
# forward data through caffe model
out = nn.forward(test_data)
pred_probas = out['prob']
print(pred_probas.argmax())
以上代码抛出此日志(错误):
Data:
[[ 0.2655475 0.2655475 0.2655475 0.2655475 0.2655475 0.26516597
0.26516597 0.26516597 0.26516597 0.26516597 -0.03401361 -0.04166667
-0.03996599 -0.01870748 -0.01785714 -0.02636054 -0.0255102 -0.03401361
-0.03231293 -0.0212585 0.02047792 0.02047792 0.02047792 0.02047792
0.02047792 0.02047792 0.02319407 0.02319407 0.02319407 0.02594073
0. 0. 0. 0. 0. 0.
0.01176471 0. 0. 0.01189689]]
Data shape:
(1, 40)
Data type:
<class 'numpy.ndarray'>
Type of array elements:
<class 'numpy.float64'>
Traceback (most recent call last):
File "/path/caffe_nn_test.py", line 41, in <module>
out = nn.forward(test_data)
File "//python3.7/site-packages/caffe/pycaffe.py", line 119, in _Net_forward
outputs = set(self.outputs + blobs)
TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32')
如果您对此问题有任何帮助,我将不胜感激!谢谢。
找到答案,为什么我无法按照我尝试的方式输入 numpy 数组。有必要将它分配给网络的正确输入 blob(据我所知)。
查看图层名称问题。
此代码有效:
# load net from files
nn = caffe.Net('/model_path/model.prototxt',
'/model_path/model.caffemodel',
caffe.TEST)
# test_data is a numpy array with the shape (1, 40)
# set input for neural network
nn.blobs['dense_1_input'] = test_data
# forward data through caffe model
out = nn.forward()
# get class prediction
pred_probas = out['output_activation']
print(pred_probas.argmax())
希望这对有同样问题的人有所帮助。
我正在尝试在 python 中使用完全连接的 caffe 神经网络 (NN)。原来的 model/NN 是在 Keras 中实现和训练的,然后使用 MMdnn.
转换为 caffe 模型我要呈现给NN的数据是一个numpy数组。它应该将其推入网络,然后对输出进行 class 预测。
但是,当我尝试将一维 numpy 数组呈现给加载的 caffe 模型时,出现以下错误:
File "/pythonpath/python3.7/site-packages/caffe/pycaffe.py", line 119, in _Net_forward
outputs = set(self.outputs + blobs)
TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32')
我在 google 和 Whosebug 上进行了搜索,但无法解决问题。 你能帮忙吗?
关于我做了什么的描述:
我通过以下方式定期加载我的 caffe 模型:
nn = caffe.Net('/model_path/model.prototxt',
'/model_path/model.caffemodel',
caffe.TEST)
这给了我以下日志(成功?):
WARNING: Logging before InitGoogleLogging() is written to STDERR
W0423 14:53:15.663930 11914 _caffe.cpp:139] DEPRECATION WARNING - deprecated use of Python interface
W0423 14:53:15.663944 11914 _caffe.cpp:140] Use this instead (with the named "weights" parameter):
W0423 14:53:15.663946 11914 _caffe.cpp:142] Net('/path/model.prototxt', 1, weights='/path/model.caffemodel')
I0423 14:53:15.665053 11914 net.cpp:51] Initializing net from parameters:
state {
phase: TEST
level: 0
}
layer {
name: "dense_1_input"
type: "Input"
top: "dense_1_input"
input_param {
shape {
dim: 1
dim: 40
}
}
}
.... more layers ...
layer {
name: "output_activation"
type: "Softmax"
bottom: "output"
top: "output_activation"
}
I0423 14:53:15.665112 11914 layer_factory.hpp:77] Creating layer dense_1_input
I0423 14:53:15.665118 11914 net.cpp:84] Creating Layer dense_1_input
I0423 14:53:15.665122 11914 net.cpp:380] dense_1_input -> dense_1_input
I0423 14:53:15.665140 11914 net.cpp:122] Setting up dense_1_input
I0423 14:53:15.665143 11914 net.cpp:129] Top shape: 1 40 (40)
I0423 14:53:15.665148 11914 net.cpp:137] Memory required for data: 160
.... more layers ...
I0423 14:53:15.665232 11914 layer_factory.hpp:77] Creating layer output_activation
I0423 14:53:15.665236 11914 net.cpp:84] Creating Layer output_activation
I0423 14:53:15.665239 11914 net.cpp:406] output_activation<- output
I0423 14:53:15.665242 11914 net.cpp:380] output_activation-> output_activation
I0423 14:53:15.665248 11914 net.cpp:122] Setting up output_activation
I0423 14:53:15.665251 11914 net.cpp:129] Top shape: 1 3 (3)
I0423 14:53:15.665254 11914 net.cpp:137] Memory required for data: 248
I0423 14:53:15.665256 11914 net.cpp:200] output_activation does not need backward computation.
.... more layers ...
I0423 14:53:15.665269 11914 net.cpp:242] This network produces output output_activation
I0423 14:53:15.665272 11914 net.cpp:255] Network initialization done.
我要呈现给 NN 的数据存储在一个 numpy 数组中。这是给咖啡模型这样的:
# print data, its shape and type
print("Data:")
print(test_data)
print("Data shape:")
print(test_data.shape)
print("Data type:")
print(type(test_data))
print("Type of array elements:")
print(type(test_data[0][0]))
# forward data through caffe model
out = nn.forward(test_data)
pred_probas = out['prob']
print(pred_probas.argmax())
以上代码抛出此日志(错误):
Data:
[[ 0.2655475 0.2655475 0.2655475 0.2655475 0.2655475 0.26516597
0.26516597 0.26516597 0.26516597 0.26516597 -0.03401361 -0.04166667
-0.03996599 -0.01870748 -0.01785714 -0.02636054 -0.0255102 -0.03401361
-0.03231293 -0.0212585 0.02047792 0.02047792 0.02047792 0.02047792
0.02047792 0.02047792 0.02319407 0.02319407 0.02319407 0.02594073
0. 0. 0. 0. 0. 0.
0.01176471 0. 0. 0.01189689]]
Data shape:
(1, 40)
Data type:
<class 'numpy.ndarray'>
Type of array elements:
<class 'numpy.float64'>
Traceback (most recent call last):
File "/path/caffe_nn_test.py", line 41, in <module>
out = nn.forward(test_data)
File "//python3.7/site-packages/caffe/pycaffe.py", line 119, in _Net_forward
outputs = set(self.outputs + blobs)
TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32')
如果您对此问题有任何帮助,我将不胜感激!谢谢。
找到答案,为什么我无法按照我尝试的方式输入 numpy 数组。有必要将它分配给网络的正确输入 blob(据我所知)。
查看图层名称问题。
此代码有效:
# load net from files
nn = caffe.Net('/model_path/model.prototxt',
'/model_path/model.caffemodel',
caffe.TEST)
# test_data is a numpy array with the shape (1, 40)
# set input for neural network
nn.blobs['dense_1_input'] = test_data
# forward data through caffe model
out = nn.forward()
# get class prediction
pred_probas = out['output_activation']
print(pred_probas.argmax())
希望这对有同样问题的人有所帮助。