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

ظهور الخطأ 'ValueError: Cannot feed value of shape (1, 1, 1) for Tensor 'lstm_1_input:0', which has shape '(9, 1, 1) في كيراس

السؤال

نشر (معدل)

قمت ببناء النموذج التالي في كيراس، في القسم 1 يتم تدريب الشبكة على جميع العينات في كل epoch وإعادة تعيين الحالة "reset the state" في الشبكة في نهاية كل epoch  يدوياً.

#sequence إنشاء تسلسل
length = 10
s= [i/float(length) for i in range(length)]
# إنشاء أزواج x/y
df = DataFrame(s)
df = concat([df, df.shift(1)], axis=1)
df.dropna(inplace=True)
val = df.values
data = val[:, 0]
label=val[:, 1]
data = data.reshape(len(data), 1, 1)
# القسم 0 
n_batch = len(data)
n_epoch = 800
n_neurons = 12
model = Sequential()
model.add(LSTM(n_neurons, batch_input_shape=(n_batch, data.shape[1], data.shape[2]), stateful=True))
model.add(Dense(1))
model.compile(loss='mse', optimizer='rmsprop')
# القسم 1
for i in range(n_epoch):
	model.fit(data, label, epochs=1, batch_size=n_batch, verbose=1, shuffle=False)
	model.reset_states()
# القسم 2
for i in range(len(data)):
	testX, testy = data[i], label[i]
	testX = testX.reshape(1, 1, 1)
	yhat = model.predict(testX, batch_size=1)
	print('>Expected=%.1f, Predicted=%.1f' % (testy, yhat))

لكن ينتج لدي الخطأ التالي في القسم 2: 'ValueError: Cannot feed value of shape (1, 1, 1) for Tensor 'lstm_1_input:0', which has shape '(9, 1, 1)
علماً أن حجم ال batch_size كما تلاحظون  يغطي  مجموعة بيانات التدريب بالكامل (batch learning)  وسيتم تنفيذ التنبؤات واحدة تلو الأخرى (التنبؤ بخطوة واحدة)

تم التعديل في بواسطة Meezo ML

Recommended Posts

  • 1
نشر (معدل)

في القسم الثاني ينتج الخطأ، حيث يتم توقع كل خطوة في التسلسل (خطوة خطوة). وهذا يتطلب أن يكون حجم ال batch_size مساوي ل 1 أي:

Online Learning (Batch Size = 1)

أي الحل يتغيير حجم الباتش كالتالي:

#sequence إنشاء تسلسل
length = 10
s= [i/float(length) for i in range(length)]
# إنشاء أزواج x/y
df = DataFrame(s)
df = concat([df, df.shift(1)], axis=1)
df.dropna(inplace=True)
val = df.values
data = val[:, 0]
label=val[:, 1]
data = data.reshape(len(data), 1, 1)
# القسم 0 
n_batch = 1 # هنا
n_epoch = 800
n_neurons = 12
model = Sequential()
model.add(LSTM(n_neurons, batch_input_shape=(n_batch, data.shape[1], data.shape[2]), stateful=True))
model.add(Dense(1))
model.compile(loss='mse', optimizer='rmsprop')
# القسم 1
for i in range(n_epoch):
	model.fit(data, label, epochs=1, batch_size=n_batch, verbose=1, shuffle=False)
	model.reset_states()
# القسم 2
for i in range(len(data)):
	testX, testy = data[i], label[i]
	testX = testX.reshape(1, 1, 1)
	yhat = model.predict(testX, batch_size=1)
	print('>Expected=%.1f, Predicted=%.1f' % (testy, yhat))

هذا يعني أنه سيتم تحديث أوزان الشبكة بعد كل عينة تدريبية. وطبعاً هذا سيعطيك سرعة أكبر لكن التدريب لن يكون مستقراً.
طريقة أخرى، وهي تنفبذ كل التنبؤات دفعة واحدة، أي:

 Batch Forecasting (Batch Size = N)

وبالتالي يكون التعديل:

# القسم 2
yhat = model.predict(data, batch_size=n_batch)
for i in range(len(label)):
	print('>Expected=%.1f, Predicted=%.1f' % (label[i], yhat[i]))

لكن هذا يعني أننا قد نكون مقيدين للغاية في طريقة استخدام النموذج،  سيتعين علينا استخدام جميع التنبؤات التي تم إجراؤها مرة واحدة ، أو الاحتفاظ بالتنبؤ الأول فقط وتجاهل الباقي.
لذا فالحل الأفضل هو استخدام أحجام دفعات مختلفة للتدريب والتنبؤ. طريقة القيام بذلك هي نسخ الأوزان من الشبكة التي تم تدريبها وإنشاء شبكة جديدة باستخدام الأوزان المدربة مسبقاً. يمكننا القيام بذلك باستخدام وظائف get_weights () و set_weights () في Keras API ، على النحو التالي:

# إعادة تعيين حجم الدفعة
n_batch = 1
# إعادة تعريف النموذج
new_model = Sequential()
new_model.add(LSTM(n_neurons, batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True))
new_model.add(Dense(1))
# copy weights عملية 
old_weights = model.get_weights()
new_model.set_weights(old_weights)

يؤدي هذا إلى إنشاء نموذج جديد يتم تجميعه compile بحجم دفعة 1. يمكننا بعد ذلك استخدام هذا النموذج الجديد لعمل تنبؤات من خطوة واحدة:

# القسم 2
for i in range(len(data)):
	testX, testy = data[i], label[i]
	testX = testX.reshape(1, 1, 1)
	yhat = new_model.predict(testX, batch_size=n_batch)
	print('>Expected=%.1f, Predicted=%.1f' % (testy, yhat))

 

تم التعديل في بواسطة Ali Haidar Ahmad
  • 1
نشر

تظهر المشكلة نتيجة اختلاف كل البيانات في كل مرحلة، وذلك لأن شكل البيانات الخارجة من أول مرحلة هي (1,1,1) بينما المرحلة الثانية تتطلب بيانات ذات شكل  (9,1,1) وحل هذا يكون بحل كل خطوة على حده.

بالنسبة للمرلحلة الأولي يجب تعديل حجم ال batch_size الذي يدخل لعملية التعلم، هنا أنت تستخدم كل البيانات في التعلم وهذا ليس صوابا وأنما يجب تغييرها لتكون 1 وذلك حتي يتم توقع كل خطوة في التسلسل خطوة تلو خطوة، والتعديل الذي يجب أن يتم على الكود كالتالي:

n_batch = 1

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

#sequence إنشاء تسلسل
length = 10
s= [i/float(length) for i in range(length)]
# إنشاء أزواج x/y
df = DataFrame(s)
df = concat([df, df.shift(1)], axis=1)
df.dropna(inplace=True)
val = df.values
data = val[:, 0]
label=val[:, 1]
data = data.reshape(len(data), 1, 1)
# القسم 0 
# إعادة تعيين حجم الدفعة
n_batch = 1
# إعادة تعريف النموذج
new_model = Sequential()
new_model.add(LSTM(n_neurons, batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True))
new_model.add(Dense(1))
old_weights = model.get_weights()
new_model.set_weights(old_weights)
model.compile(loss='mse', optimizer='rmsprop')
# القسم 1
for i in range(n_epoch):
	model.fit(data, label, epochs=1, batch_size=n_batch, verbose=1, shuffle=False)
	model.reset_states()
# القسم 2
for i in range(len(data)):
	testX, testy = data[i], label[i]
	testX = testX.reshape(1, 1, 1)
	yhat = new_model.predict(testX, batch_size=n_batch)
	print('>Expected=%.1f, Predicted=%.1f' % (testy, yhat))

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...