إضافة ميزات إضافية في Theano (CNN)
-
21-12-2019 - |
سؤال
أنا أستخدم Theano للتصنيف (الشبكات العصبية التلافيفية)
في السابق، كنت أستخدم قيم البكسل للصورة (المسطحة) كميزات NN.والآن أريد إضافة ميزات إضافية.
لقد قيل لي أنه يمكنني ربط ناقل الميزات الإضافية هذا بميزات الصورة المسطحة ثم استخدامه كمدخل للطبقة المتصلة بالكامل، لكني أواجه مشكلة في ذلك.
بداية، هل هذا هو النهج الصحيح؟
إليك بعض مقتطفات التعليمات البرمجية وأخطائي:
مشابه للمثال المقدم من موقعهم مع بعض التعديلات
(من الفصل الذي يبني النموذج)
# allocate symbolic variables for the data
self.x = T.matrix('x') # the data is presented as rasterized images
self.y = T.ivector('y') # the labels are presented as 1D vector of [int] labels
self.f = T.matrix('f') # additional features
أدناه، المتغيرات v
و rng
يتم تعريفها سابقا.المهم هو layer2_input
:
layer2_input = self.layer1.output.flatten(2)
layer2_input = T.concatenate([layer2_input, self.f.flatten(2)])
self.layer2 = HiddenLayer(rng, input=layer2_input, n_in=v, n_out=200, activation=T.tanh)
(من الفصل الذي يتدرب)
train_model = theano.function([index], cost, updates=updates,
givens={
model.x: train_set_x[index * batch_size: (index + 1) * batch_size],
model.y: train_set_y[index * batch_size: (index + 1) * batch_size],
model.f: train_set_f[index * batch_size: (index + 1) * batch_size]
})
ومع ذلك، تظهر لي رسالة خطأ عند استدعاء نموذج القطار:
ValueError: GpuJoin: Wrong inputs for input 1 related to inputs 0.!
Apply node that caused the error: GpuJoin(TensorConstant{0}, GpuElemwise{tanh,no_inplace}.0, GpuFlatten{2}.0)
Inputs shapes: [(), (5, 11776), (5, 2)]
Inputs strides: [(), (11776, 1), (2, 1)]
Inputs types: [TensorType(int8, scalar), CudaNdarrayType(float32, matrix), CudaNdarrayType(float32, matrix)]
هل تمثل أشكال الإدخال أشكال x
, y
و f
, ، على التوالى؟
إذا كان الأمر كذلك، فإن الثالثة تبدو صحيحة (حجم الدفعة = 5، وميزتان إضافيتان)، ولكن لماذا تكون الأولى عددية والثانية مصفوفة؟
المزيد من التفاصيل:
train_set_x.shape = (61, 19200) [61 flattened images (160x120), 19200 pixels]
train_set_y.shape = (61,) [61 integer labels]
train_set_f.shape = (61,2) [2 additional features per image]
batch_size = 5
هل لدي الفكرة الصحيحة أم أن هناك طريقة أفضل لتحقيق ذلك؟هل هناك أي رؤى حول سبب ظهور الخطأ؟
المحلول
كانت المشكلة أنني كنت متسلسلاً على المحور الخطأ.
layer2_input = T.concatenate([layer2_input, self.f.flatten(2)])
كان ينبغي أن يكون
layer2_input = T.concatenate([layer2_input, self.f.flatten(2)], axis=1)