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

ظهور الخطأ ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list). أثناء محاولة تدريب شبكة عصبية

Meezo ML

السؤال

أحاول تدريب شبكة عصبية لتحليل المشاعر، لكن يظهر لي الخطأ التالي:

from keras.datasets import imdb
from keras.layers import Embedding, SimpleRNN
from keras.models import Sequential
(input_train, y_train), (input_test, y_test) = imdb.load_data(
num_words=max_features)
print(len(input_train), 'train sequences')
print(len(input_test), 'test sequences')
print('input_train shape:', input_train.shape)
print('input_test shape:', input_test.shape)
from keras.layers import Dense
model = Sequential()
model.add(Embedding(10000, 32))
model.add(SimpleRNN(32))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
history = model.fit(input_train, y_train,
epochs=2,
batch_size=32,
validation_split=0.2)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-53-0d042e98c73b> in <module>
     17 epochs=2,
     18 batch_size=32,
---> 19 validation_split=0.2)

~\anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)
   1062           use_multiprocessing=use_multiprocessing,
   1063           model=self,
-> 1064           steps_per_execution=self._steps_per_execution)
   1065 
   1066       # Container that configures and calls `tf.keras.Callback`s.

~\anaconda3\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in __init__(self, x, y, sample_weight, batch_size, steps_per_epoch, initial_epoch, epochs, shuffle, class_weight, max_queue_size, workers, use_multiprocessing, model, steps_per_execution)
   1110         use_multiprocessing=use_multiprocessing,
   1111         distribution_strategy=ds_context.get_strategy(),
-> 1112         model=model)
   1113 
   1114     strategy = ds_context.get_strategy()

~\anaconda3\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in __init__(self, x, y, sample_weights, sample_weight_modes, batch_size, epochs, steps, shuffle, **kwargs)
    261                **kwargs):
    262     super(TensorLikeDataAdapter, self).__init__(x, y, **kwargs)
--> 263     x, y, sample_weights = _process_tensorlike((x, y, sample_weights))
    264     sample_weight_modes = broadcast_sample_weight_modes(
    265         sample_weights, sample_weight_modes)

~\anaconda3\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in _process_tensorlike(inputs)
   1014     return x
   1015 
-> 1016   inputs = nest.map_structure(_convert_numpy_and_scipy, inputs)
   1017   return nest.list_to_tuple(inputs)
   1018 

~\anaconda3\lib\site-packages\tensorflow\python\util\nest.py in map_structure(func, *structure, **kwargs)
    657 
    658   return pack_sequence_as(
--> 659       structure[0], [func(*x) for x in entries],
    660       expand_composites=expand_composites)
    661 

~\anaconda3\lib\site-packages\tensorflow\python\util\nest.py in <listcomp>(.0)
    657 
    658   return pack_sequence_as(
--> 659       structure[0], [func(*x) for x in entries],
    660       expand_composites=expand_composites)
    661 

~\anaconda3\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in _convert_numpy_and_scipy(x)
   1009       if issubclass(x.dtype.type, np.floating):
   1010         dtype = backend.floatx()
-> 1011       return ops.convert_to_tensor_v2_with_dispatch(x, dtype=dtype)
   1012     elif scipy_sparse and scipy_sparse.issparse(x):
   1013       return _scipy_sparse_to_sparse_tensor(x)

~\anaconda3\lib\site-packages\tensorflow\python\util\dispatch.py in wrapper(*args, **kwargs)
    199     """Call target, and fall back on dispatchers if there is a TypeError."""
    200     try:
--> 201       return target(*args, **kwargs)
    202     except (TypeError, ValueError):
    203       # Note: convert_to_eager_tensor currently raises a ValueError, not a

~\anaconda3\lib\site-packages\tensorflow\python\framework\ops.py in convert_to_tensor_v2_with_dispatch(value, dtype, dtype_hint, name)
   1403   """
   1404   return convert_to_tensor_v2(
-> 1405       value, dtype=dtype, dtype_hint=dtype_hint, name=name)
   1406 
   1407 

~\anaconda3\lib\site-packages\tensorflow\python\framework\ops.py in convert_to_tensor_v2(value, dtype, dtype_hint, name)
   1413       name=name,
   1414       preferred_dtype=dtype_hint,
-> 1415       as_ref=False)
   1416 
   1417 

~\anaconda3\lib\site-packages\tensorflow\python\profiler\trace.py in wrapped(*args, **kwargs)
    161         with Trace(trace_name, **trace_kwargs):
    162           return func(*args, **kwargs)
--> 163       return func(*args, **kwargs)
    164 
    165     return wrapped

~\anaconda3\lib\site-packages\tensorflow\python\framework\ops.py in convert_to_tensor(value, dtype, name, as_ref, preferred_dtype, dtype_hint, ctx, accepted_result_types)
   1538 
   1539     if ret is None:
-> 1540       ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
   1541 
   1542     if ret is NotImplemented:

~\anaconda3\lib\site-packages\tensorflow\python\framework\tensor_conversion_registry.py in _default_conversion_function(***failed resolving arguments***)
     50 def _default_conversion_function(value, dtype, name, as_ref):
     51   del as_ref  # Unused.
---> 52   return constant_op.constant(value, dtype, name=name)
     53 
     54 

~\anaconda3\lib\site-packages\tensorflow\python\framework\constant_op.py in constant(value, dtype, shape, name)
    263   """
    264   return _constant_impl(value, dtype, shape, name, verify_shape=False,
--> 265                         allow_broadcast=True)
    266 
    267 

~\anaconda3\lib\site-packages\tensorflow\python\framework\constant_op.py in _constant_impl(value, dtype, shape, name, verify_shape, allow_broadcast)
    274       with trace.Trace("tf.constant"):
    275         return _constant_eager_impl(ctx, value, dtype, shape, verify_shape)
--> 276     return _constant_eager_impl(ctx, value, dtype, shape, verify_shape)
    277 
    278   g = ops.get_default_graph()

~\anaconda3\lib\site-packages\tensorflow\python\framework\constant_op.py in _constant_eager_impl(ctx, value, dtype, shape, verify_shape)
    299 def _constant_eager_impl(ctx, value, dtype, shape, verify_shape):
    300   """Implementation of eager constant."""
--> 301   t = convert_to_eager_tensor(value, ctx, dtype)
    302   if shape is None:
    303     return t

~\anaconda3\lib\site-packages\tensorflow\python\framework\constant_op.py in convert_to_eager_tensor(value, ctx, dtype)
     96       dtype = dtypes.as_dtype(dtype).as_datatype_enum
     97   ctx.ensure_initialized()
---> 98   return ops.EagerTensor(value, ctx.device_name, dtype)
     99 
    100 

ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list).

 

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

Recommended Posts

  • 1

عند التعامل مع المسائل التي تندرج تحت ال NLP هناك خطوة مهمة يجب القيام بها قبل إرسال ال Data إلى الطبقات للتدرب عليها وهي وضع القيم في مصفوفة ذات أبعاد ثابتة.
 أثناء تجهيز البيانات النصية (النصوص، حيث كل عينة تكون عبارة عن نص) وترميزها رقمياً (إسناد عدد صحيح يمثل كل كلمة ثم تمثيل النص كسلسلة من الأعداد الصحيحة) ستكون بعض النصوص أطول من الأخرى وهذا شيء مؤكد وبديهي (أي أول عينة قد يكون طولها 500 والأخرى 1000 وو). لذا لإدخالها إلى شبكة عصبية يجب علينا أولاً توحيد طول كل عينة (طول كل نص أو طول كل سلسلة رقمية كوننا قمنا بترميزها رقمياً)، وهذا التوحيد يكون عبر اختيارنا للحجم الذي نراه مناسياً لكل سلسلة وليكن x، ثم نمر على كل العينات ونقطع كل سلسلة طولها أكبر من  (بالتالي نجعلها 500 فقط)، أما إذا كانت أقل من x فنقوم (بحشوها) بأصفار، وهذا مايتم من خلال التابع pad_sequences كما سترى في المثال، وهذا مايجب عليك القيام به قبل إدخالالبيانات إلى شبكتك، فهذا هو سبب الخطأ الذي ظهر ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list). فهو غير قادر على تحويل list لإى tensor بأبعاد مختلفة، يجب أن تقوم بتوحيد الأبعاد لكل العينات.
التصحيح:

from keras.datasets import imdb
from keras.layers import Embedding, SimpleRNN
from keras.models import Sequential
(input_train, y_train), (input_test, y_test) = imdb.load_data(
num_words=max_features)
print(len(input_train), 'train sequences')
print(len(input_test), 'test sequences')
################ نضيف###################
from keras.preprocessing import sequence
maxlen = 500
print('Pad sequences (samples x time)')
input_train = sequence.pad_sequences(input_train, maxlen=maxlen)
input_test = sequence.pad_sequences(input_test, maxlen=maxlen)
############# انتهى####################
print('input_train shape:', input_train.shape)
print('input_test shape:', input_test.shape)
from keras.layers import Dense
model = Sequential()
model.add(Embedding(10000, 32))
model.add(SimpleRNN(32))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
history = model.fit(input_train, y_train,
epochs=2,
batch_size=32,
validation_split=0.2)
-------------------------------------------------
25000 train sequences
25000 test sequences
Pad sequences (samples x time)
input_train shape: (25000, 500)
input_test shape: (25000, 500)
Epoch 1/2
625/625 [==============================] - 79s 111ms/step - loss: 0.6659 - acc: 0.5671 - val_loss: 0.4343 - val_acc: 0.8116
Epoch 2/2
625/625 [==============================] - 67s 108ms/step - loss: 0.3630 - acc: 0.8477 - val_loss: 0.3880 - val_acc: 0.8262

 

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

  • 0

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

الشئ الثاني هو الإنتباه لشكل البيانات المدخلة مقابل الشكل المتوقع في النموذج، وذلك يعنى ان ننتبه للقيم الممرة في شكل parameters للنموذج.

الأن لنقوم بإنشاء النموذج وطباعة ملخصه:

model = Sequential()
model.add(Embedding(10000, 32))
model.add(SimpleRNN(32))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
model.summary()

Model: "sequential_37"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_12 (Embedding)     (None, None, 32)          320000    
_________________________________________________________________
simple_rnn_2 (SimpleRNN)     (None, 32)                2080      
_________________________________________________________________
dense_57 (Dense)             (None, 1)                 33        
=================================================================
Total params: 322,113
Trainable params: 322,113
Non-trainable params: 0
_________________________________________________________________

لاحظ شكل النموذج، يتوقع منك الكلمات المحولة لأرقام صحيحة بأن تحتوي على متجهات ذات 32 لكل قيمة unique أو الرقم الذي يشير للكلمة في مجموعة البيانات. الأن القيمة المتوقعة في حال عدم تحديد شكل المدخل ستكون على هيئة (batch_size, input_length) وبالتالي فإن الطول لكل عينة يجب أن يكون متساوي. دعنا نلقى نظرة على أطوال أول 10 عينات:

for i in range(10):
  print(len(input_train[i]))
  
218
189
141
550
147
43
123
562
233
130  

لاحظ إختلاف القيم عن بعضها، بالتالي يجب أن نقوم بتوحيد أطوالها، ذلك يتم بإستخدام pad_sequences وهي الدالة التي تقوم بحساب أطول عينة و إسناد طولها لبقية العينات (هذا إن لم يتم تحديد طول معين)، وذلك يتم عن طريق وضع أصفار إلى وصول العينة الأقل طولاً للطول المطلوب، لاحظ المثال التالي:

from keras.preprocessing.sequence import pad_sequences

sequences = [[1, 2, 3, 4],
             [1, 2, 3],
             [1]]

pad_sequences(sequences)

والان الدالة ستقوم بإسناد أصفار لكل مدخل قيمته أقل من 4، لنرى النتائج:

array([[1, 2, 3, 4],
       [0, 1, 2, 3],
       [0, 0, 0, 1]], dtype=int32)

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...