OpenCV-使用TrainData_create时,培训会导致不同的结果

时间:2018-11-23 08:21:27

标签: python opencv machine-learning neural-network training-data

我正在将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))

第二个代码段出了什么问题?

0 个答案:

没有答案