#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 🙂 надеюсь, это поможет