اذهب إلى المحتوى

السؤال

نشر

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

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)]]

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

Recommended Posts

  • 1
نشر

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

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

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

  • 1
نشر

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

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

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

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

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...