Как я могу предсказать 2d-вывод в keras (форма метки = 20, 42, 3)

#python #keras #neural-network #conv-neural-network

#python #keras #нейронная сеть #conv-нейронная сеть

Вопрос:

У меня есть набор данных для оценки положения рук (RHD dataset). Входными данными являются изображения RGB (320x320x3), и одна метка имеет такую форму (42, 3):

 array([[ 0.05283 ,  0.05878 ,  0.6696  ],
   [-0.05483 ,  0.08679 ,  0.5844  ],
   [-0.03584 ,  0.08737 ,  0.6015  ],
   [-0.01452 ,  0.08199 ,  0.6239  ],
   [ 0.02035 ,  0.07135 ,  0.6479  ],
   [-0.01679 ,  0.07526 ,  0.5043  ],
   [-0.00701 ,  0.06789 ,  0.5283  ],
   [ 0.002691,  0.06231 ,  0.5502  ],
   [ 0.01555 ,  0.06194 ,  0.5836  ],
   [ 0.02368 ,  0.06908 ,  0.4946  ],
   [ 0.02951 ,  0.06739 ,  0.52    ],
   [ 0.03332 ,  0.05871 ,  0.5455  ],
   [ 0.0389  ,  0.05864 ,  0.5797  ],
   [ 0.05521 ,  0.07793 ,  0.5055  ],
   [ 0.05739 ,  0.07229 ,  0.5305  ],
   [ 0.05845 ,  0.06505 ,  0.5556  ],
   [ 0.05725 ,  0.06129 ,  0.5846  ],
   [ 0.08927 ,  0.08603 ,  0.5338  ],
   [ 0.08616 ,  0.08226 ,  0.5512  ],
   [ 0.08332 ,  0.07606 ,  0.5664  ],
   [ 0.07672 ,  0.06926 ,  0.5946  ],
   [-0.241   ,  0.2419  ,  1.249   ],
   [-0.1318  ,  0.289   ,  1.182   ],
   [-0.1482  ,  0.2822  ,  1.199   ],
   [-0.1673  ,  0.2615  ,  1.217   ],
   [-0.2056  ,  0.2481  ,  1.232   ],
   [-0.17    ,  0.3072  ,  1.097   ],
   [-0.1799  ,  0.2972  ,  1.117   ],
   [-0.1886  ,  0.2866  ,  1.139   ],
   [-0.1988  ,  0.2737  ,  1.17    ],
   [-0.2035  ,  0.3251  ,  1.098   ],
   [-0.211   ,  0.3123  ,  1.118   ],
   [-0.2172  ,  0.2954  ,  1.138   ],
   [-0.2185  ,  0.2835  ,  1.169   ],
   [-0.2263  ,  0.3407  ,  1.117   ],
   [-0.2309  ,  0.3242  ,  1.134   ],
   [-0.233   ,  0.3077  ,  1.154   ],
   [-0.2331  ,  0.2912  ,  1.177   ],
   [-0.2407  ,  0.3499  ,  1.155   ],
   [-0.244   ,  0.3359  ,  1.167   ],
   [-0.2462  ,  0.323   ,  1.176   ],
   [-0.2482  ,  0.3002  ,  1.193   ]], dtype=float32)
  

Это 42 координаты (x y z). Это модель:

 model = Sequential()

model.add(Conv2D(32, (5, 5), activation = 'relu', input_shape = (320, 320, 3)))
model.add(MaxPool2D((2, 2)))
model.add(Conv2D(64, (5, 5), activation = 'relu'))
model.add(MaxPool2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation = 'relu'))
model.add(MaxPool2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation = 'relu'))
model.add(Flatten())
model.add(Dense(64, activation = 'relu'))
model.add(Dense(42, activation = 'linear'))
  

И keras выдает эту ошибку:

 ValueError: Error when checking target: expected dense_2 to have 2 dimensions, but got array with shape (20, 42, 3)
  

Как мне это решить?

Комментарии:

1. Похоже, что эта проблема связана с ошибкой несоответствия размера генерации данных в пакетном режиме. Тщательно проверяйте размер входного изображения и размер метки сигнала для каждого пакета. Я надеюсь, что таким образом вы сможете устранить эту ошибку.

Ответ №1:

Это потому, что форма вывода вашей модели равна [None, 42] или для объяснения [n, 42], где n — количество входных данных, тогда как вам нужен вывод, который выглядел бы примерно как [None, 42, 3]. Для этого вы могли бы либо вывести 126 значений, либо преобразовать их в [42,3] . Вы можете сделать это следующим образом

 model.add(Dense(126,activation = 'linear')) ##Changing the output layer
Y_train = Y_train.reshape(-1,126)
model.fit(X_train,Y_train)
pred = model.predict(X_test)
pred = pred.reshape(-1,42,3) ## I guess you get the pattern by now
  

Но это не лучший способ решить проблему, лучшим подходом было бы использование сверточного слоя в качестве вывода, чтобы компоненты x, y, z могли коррелировать друг с другом, помогая модели быстро обучаться, но это может быть очень сложно для новичка.

Комментарии:

1. Хорошо, спасибо, но почему значение n выборок должно быть равно -1?

2. n также будет работать нормально, но это означало бы, что мне нужно было бы знать размер всех массивов (небольшое неудобство), а не использовать простую концепцию в python, согласно которой индексирование является циклическим, т.Е. a [-1] == a [n-1] . numpy расширяет это, используя -1, он включал бы весь последний индекс для вас, что означало бы все значения

3. И как я могу сделать это с помощью слоев свертки в качестве выходных данных?

4. Я делаю это, чтобы использовать его в режиме реального времени. С помощью сверточных слоев в качестве выходных данных будут ли прогнозы также быстрее, а не только обучение? Как выглядит nn для реального времени и другое, что не для реального времени?

5. Ну, я полагаю, что под сверточными слоями в качестве выходных данных вы подразумеваете массив значений для положения руки, и контекст, который у вас есть для этого, — это ответ, который я дал, это правильно? Если да, то я считаю, что невозможно получить более быстрое предсказание, поскольку количество операций не будет одинаковым, а скорее просто ядра будут одинаковыми, следовательно, разница будет незначительной. Смотрите, сети довольно маленькие и не должны быть проблемой для приличного ПК с ускорением gpu для выполнения вычислений. Но я чувствую, что вы используете it на raspberry pi или около того, тогда было бы лучше всего кодировать на c и использовать библиотеку arm 🙂 надеюсь, это поможет