• 0

ظهور الخطأ InvalidArgumentError: indices[19577,0] = -3 is not in [0, 2160) في كيراس Keras

أقوم ببناء نموذج في كيراس لكن تظهر لي المشكلة التالية عندما أحاول تدريب النموذج:

x = Input(shape=[1])
e1 = Embedding(max_machine, 100)(x)
in1 = Input(shape=[1])
e2 = Embedding(max_windspeed, 100)(in)
in2 = Input(shape=[1])
e3 = Embedding(max_activepower, 100)(in2)
in4 = Input(shape=[1])
emb_pitchangle = Embedding(max_pitchangle, 100)(in4)
in_genspeed = Input(shape=[1])
emb_genspeed = Embedding(max_genspeed, 100)(in_genspeed)
in_temp = Input(shape=[1])
emb_temp = Embedding(max_temp, 100)(in_temp)
in_turbine = Input(shape=[1])
emb_turbine = Embedding(max_turbine, 100)(in_turbine)
d = concatenate([
    (e1), 
    (in), 
    (e3), 
    (emb_pitchangle), 
    (emb_genspeed), 
    (emb_temp), 
    (emb_turbine)
])
s_dout = SpatialDropout1D(0.3)(d)
x = Flatten()(s_dout)
x = Dropout(0.3)(Dense(1000,activation='tanh')(x))
x = Dropout(0.3)(Dense(128,activation='tanh')(x))
outp = Dense(1,activation='sigmoid')(x)
model = Model(inputs=[in_machine, in1, in2, in_pitchangle,
    in_genspeed, in_temp, in_turbine], outputs=outp)
------------------------------------------------------------------------------------
InvalidArgumentError: indices[19577,0] = -3 is not in [0, 2160)
     [[Node: embedding_50/GatherV2 = GatherV2[Taxis=DT_INT32, Tindices=DT_INT32, Tparams=DT_FLOAT, _class=["loc:@training_3/Adam/gradients/embedding_50/GatherV2_grad/Reshape"], _device="/job:localhost/replica:0/task:0/device:CPU:0"](embedding_50/embeddings/read, embedding_50/Cast, embedding_48/GatherV2/axis)]]

ما المشكلة؟ علماً أن مدخلاتي تحوي قيماً سلبية.

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

استخدامك للتضمين هنا غير صحيح ، فعندما تكون مدخلاتك لها قيم سلبية، يكون الترميز غير صالح لاستخدام مع طبقة التضمين، يحب أن يكون ترميز الكلمات في المستندات عبارة عن أعداد صحيحة موجبة حصراً (كل كلمة فريدة يتم ربطها بعدد صحيح يمثلها). حيث أن طبقة التضمين هي طبقة تتيح لنا  تحويل كل كلمة إلى متجه بطول ثابت وبحجم محدد. المتجه الناتج هو متجه كثيف "Dense" له قيم حقيقية بدلاً من 0 و 1 فقط كما في الترميز One-Hot. يساعدنا الطول الثابت لمتجهات الكلمات على تمثيل الكلمات بطريقة أفضل وأكثر فعالية مع أبعاد مخفضة. وهذه المتجهات تكون ممثلة في فضاء Vector space مهيكل ويعكس المعاني الدلالية لكل كلمة. ويمكن اعتبارها كقاموس يقوم بربط أعداد صحيحة (كل كلمة ترمز في البداية كعدد صحيح) بمتجه كثيف. أي أنها تأخذ كدخل أعداد صحيحة ثم تبحث في هذا القاموس على المتجه الذي يقابله في القاموس الداخلي، ويعيد هذا القاموس.

Word index --> Embedding layer --> Corresponding word vector

إذا كون مدخلاتك تحوي أعداداً سلبية  يعني أن استخدام التضمين  غير صحيح هنا.  إن التضمين يعمل مع أي نوع من مدخلات الأعداد الصحيحة الموجبة، ولكن ليس مع المدخلات العامة.

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

بشكل عام، لا تقبل النماذج التدريب على قيم سالبة، لان الترميز يجب أن يبدأ من 0 وحتي ما لا نهاية، وذلك لان له أساس في الرياضيات، حيث يتم تحويل كل تلك القيم في النهاية الي متجهات بحيث ترتبط كل قيمة بترميز معين، وبما  انه لا يوجد معني لمتجهات سالبة القيمة، اذا لا يمكن أن تتضمن الترميزات قيما سالبة.

أما في طبقة ال  dense حيث يتم تحويل كل المصفوفات الناتجة الى متجاهات احادية البعد 1-D  فتكون قيم الترميزات بين 0 و 1 فقط. يمكنك تخيلها مثل قاموس بحيث تنتمي كل قيمة فيه الي فئة محددة.

ولان الترميز عندك قد ظهر فيه قيم سالبة، فهذا يعني أن استخدامك للتضمين غير صحيح، ولتجنب هذة المشكلة عليك استخدام one-hot encoder لجعل كل القيم أرقاما صحيحية.

كذلك يمكنك تعديل شكل البيانات المخدلة عن طريق np.reshape وهذا لتجعلها موحدة في كل خطوات التدريب، قد يلغي هذا تلك المشكلة ايضا.

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن