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

ظهور الخطأ () ValueError: Error when checking target: expected dense_1 to have 3 dimensions, but got array with shape في كيراس keras وتنسرفلو tensorflow

Meezo ML

السؤال

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

# نموذج لتوقع أسعار الأسهم
#  استخدم بيانات 50 يوماً للتنبؤ بسعر إغلاق اليوم 51
import keras
from keras.layers import Dense,LSTM
import keras
model = keras.Sequential()
model.add( LSTM( 1024, input_shape=(50, 2), return_sequences=True))
model.add( LSTM( 200, return_sequences=True))
model.add( (Dense(1,activation=None)))
model.compile(optimizer='rmsprop',loss='mae')
model.fit( X, y, batch_size = 64,epochs=15)
-------------------------------------------------------------------
ValueError: Error when checking target: expected dense_1 to have 3 dimensions, but got array with shape (200, 1)

بياناتي لها الشكل التالي:

X_train:(200, 50, 2)
y_train:(200, 1)

 

تم التعديل في بواسطة Meezo ML
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

إن طبقة ال LSTM الثانية الخاصة بك تقوم بإعادة كامل التسلسل أي خرجها 3D وذلك بسبب ضبط الوسيط return_sequences=True على True والطبقات الكثيفة Dense بشكل افتراضي تقوم بتطبيق kernel على كل خطوة زمنية أيضاً مما ينتج عنه تسلسل:

# (batchsize, 50, 2)
model.add( LSTM( 1024, input_shape=(50, 2), return_sequences=True))
# (batchsize, 50, 1024)
model.add( LSTM( 200, return_sequences=True))
# (batchsize, 50, 200)
model.add( (Dense(1)))
# (batchsize, 50, 1) وهو الخرج الخاص بك

لذا لحل المشكلة يجب عليك أن تقوم بالضبط التالي return_sequences=False في طبقة LSTM الثانية:

import keras
from keras.layers import Dense,LSTM
import keras
model = keras.Sequential()
model.add( LSTM( 1024, input_shape=(50, 2), return_sequences=True))
model.add( LSTM( 200, return_sequences=False))
#(batchsize, 200)
model.add( (Dense(1,activation=None)))
#(batchsize, 1)
model.compile(optimizer='rmsprop',loss='mae')
model.fit( X, y, batch_size = 64,epochs=15)

 

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

المشكلة هي في ضبط شبكة lstm لأنها في هذه الحالة ستخرج كل سلسلة الحالات المخفية hidden states و في شكل البيانات و قبل إستدعاء طبقة dense نريد فقط خرج اخر خطوة زمنية final time step of the hidden state.

يمكن تفادي الخطأ بضبط return_sequence=False أو يمكنك مسحها لأن حسب تعريف شبكة lstm قيمتها false:

tf.keras.layers.LSTM(
    units,
    activation="tanh",
    recurrent_activation="sigmoid",
    use_bias=True,
    kernel_initializer="glorot_uniform",
    recurrent_initializer="orthogonal",
    bias_initializer="zeros",
    unit_forget_bias=True,
    kernel_regularizer=None,
    recurrent_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    recurrent_constraint=None,
    bias_constraint=None,
    dropout=0.0,
    recurrent_dropout=0.0,
    return_sequences=False,
    return_state=False,
    go_backwards=False,
    stateful=False,
    time_major=False,
    unroll=False,
    **kwargs
)

 

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...