我正在将OpenCV 3.4提供的MLP ANN与python一起使用。我注意到,当通过cv2.ml.TrainData_create
准备训练数据时,人工神经网络的效果很好,如果不使用该神经网络,但使用相同的样本和参数,则不会正确训练神经网络。
在这里,我并不是说即使使用相同的数据,训练也会有所不同(由于起点随机,这是可以预期的),因为我在这里看到的是工作训练与非工作训练,而且这总是发生。 / p>
以下代码使用cv2.ml.TrainData_create
import cv2
import numpy as np
ann = cv2.ml.ANN_MLP_create()
ann.setTrainMethod(cv2.ml.ANN_MLP_BACKPROP)
ann.setActivationFunction(cv2.ml.ANN_MLP_SIGMOID_SYM)
ann.setLayerSizes(np.array([3, 8, 4]))
ann.setTermCriteria(( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 ))
input_array = np.array([ [1.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 0.0, 1.0],
[1.0, 1.0, 1.0],
], dtype=np.float32)
output_array = np.array([ [1.0, 0.0, 0.0, 0.0],
[0.0, 1.0, 0.0, 0.0],
[0.0, 0.0, 1.0, 0.0],
[0.0, 0.0, 0.0, 1.0],
], dtype=np.float32)
td = cv2.ml.TrainData_create(input_array, cv2.ml.ROW_SAMPLE, output_array)
ann.train(td, cv2.ml.ANN_MLP_NO_INPUT_SCALE | cv2.ml.ANN_MLP_NO_OUTPUT_SCALE)
SAMPLES = 5000
for x in range(0, SAMPLES):
ann.train(td, cv2.ml.ANN_MLP_UPDATE_WEIGHTS | cv2.ml.ANN_MLP_NO_INPUT_SCALE | cv2.ml.ANN_MLP_NO_OUTPUT_SCALE)
这很好用:
print(ann.predict(input_array))
(0.0, array([[ 1.0000000e+00, 0.0000000e+00, 4.7625793e-16, 2.8575474e-16],
[ 1.9050316e-16, 10000000e+00, 5.7150949e-16, 9.5251581e-17],
[ 9.5251581e-17, 0.0000000e+00, 1.0000000e+00, -1.9050316e-16],
[-1.9050316e-16, -1.9050316e-16, 0.0000000e+00, 1.0000000e+00]],
dtype=float32))
以下代码未使用cv2.ml.TrainData_create
,但显然使用了相同的数据和参数:
import cv2
import numpy as np
ann = cv2.ml.ANN_MLP_create()
ann.setTrainMethod(cv2.ml.ANN_MLP_BACKPROP | cv2.ml.ANN_MLP_UPDATE_WEIGHTS | cv2.ml.ANN_MLP_NO_INPUT_SCALE | cv2.ml.ANN_MLP_NO_OUTPUT_SCALE)
ann.setActivationFunction(cv2.ml.ANN_MLP_SIGMOID_SYM)
ann.setLayerSizes(np.array([3, 8, 4]))
ann.setTermCriteria(( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 ))
input_array = np.array([ [1.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 0.0, 1.0],
[1.0, 1.0, 1.0],
], dtype=np.float32)
output_array = np.array([ [1.0, 0.0, 0.0, 0.0],
[0.0, 1.0, 0.0, 0.0],
[0.0, 0.0, 1.0, 0.0],
[0.0, 0.0, 0.0, 1.0],
], dtype=np.float32)
SAMPLES = 5000
for x in range(0, SAMPLES):
ann.train(np.array([[1.0, 0.0, 0.0]], dtype=np.float32), cv2.ml.ROW_SAMPLE, np.array([[1.0, 0.0, 0.0, 0.0]], dtype=np.float32))
ann.train(np.array([[0.0, 1.0, 0.0]], dtype=np.float32), cv2.ml.ROW_SAMPLE, np.array([[0.0, 1.0, 0.0, 0.0]], dtype=np.float32))
ann.train(np.array([[0.0, 0.0, 1.0]], dtype=np.float32), cv2.ml.ROW_SAMPLE, np.array([[0.0, 0.0, 1.0, 0.0]], dtype=np.float32))
ann.train(np.array([[1.0, 1.0, 1.0]], dtype=np.float32), cv2.ml.ROW_SAMPLE, np.array([[0.0, 0.0, 0.0, 1.0]], dtype=np.float32))
但是这个根本不起作用:
print(ann.predict(input_array))
(0.0, array([[ 1.2886142 , 0.51306236, -1.0352006 , -0.19007786],
[ 1.2194023 , 0.7686653 , -1.097198 , -0.03246666],
[ 0.99483347, 0.40380374, -0.917998 , 0.08949649],
[ 0.7475754 , 0.12770385, -0.81321925, 0.37416443]],
dtype=float32))
第二个代码段出了什么问题?