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

السؤال

نشر

أقوم ببناء شبكة عصبية لمهمة NLP (مهمة تحليل مشاعر على بيانات imdb) لكن لا أعرف سبب الخطأ التالي:

from keras.datasets import imdb
from keras.layers import Embedding, SimpleRNN,Flatten,Dense
from keras.models import Sequential
(input_train, y_train), (input_test, y_test) = imdb.load_data(
num_words=10000)
print(len(input_train), 'train sequences')
print(len(input_test), 'test sequences')
################ نضيف###################
from keras.preprocessing import sequence
maxlen = 20
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, 16))
model.add(Flatten())
model.add(Dense(32, activation='relu'))
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-10-08cd97ead789> in <module>
     19 model.add(Embedding(10000, 16))
     20 model.add(Flatten())
---> 21 model.add(Dense(32, activation='relu'))
     22 model.add(Dense(1, activation='sigmoid'))
     23 model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])

~\anaconda3\lib\site-packages\tensorflow\python\training\tracking\base.py in _method_wrapper(self, *args, **kwargs)
    515     self._self_setattr_tracking = False  # pylint: disable=protected-access
    516     try:
--> 517       result = method(self, *args, **kwargs)
    518     finally:
    519       self._self_setattr_tracking = previous_value  # pylint: disable=protected-access

~\anaconda3\lib\site-packages\tensorflow\python\keras\engine\sequential.py in add(self, layer)
    221       # If the model is being built continuously on top of an input layer:
    222       # refresh its output.
--> 223       output_tensor = layer(self.outputs[0])
    224       if len(nest.flatten(output_tensor)) != 1:
    225         raise ValueError(SINGLE_LAYER_OUTPUT_ERROR_MSG)

~\anaconda3\lib\site-packages\tensorflow\python\keras\engine\base_layer.py in __call__(self, *args, **kwargs)
    950     if _in_functional_construction_mode(self, inputs, args, kwargs, input_list):
    951       return self._functional_construction_call(inputs, args, kwargs,
--> 952                                                 input_list)
    953 
    954     # Maintains info about the `Layer.call` stack.

~\anaconda3\lib\site-packages\tensorflow\python\keras\engine\base_layer.py in _functional_construction_call(self, inputs, args, kwargs, input_list)
   1089         # Check input assumptions set after layer building, e.g. input shape.
   1090         outputs = self._keras_tensor_symbolic_call(
-> 1091             inputs, input_masks, args, kwargs)
   1092 
   1093         if outputs is None:

~\anaconda3\lib\site-packages\tensorflow\python\keras\engine\base_layer.py in _keras_tensor_symbolic_call(self, inputs, input_masks, args, kwargs)
    820       return nest.map_structure(keras_tensor.KerasTensor, output_signature)
    821     else:
--> 822       return self._infer_output_signature(inputs, args, kwargs, input_masks)
    823 
    824   def _infer_output_signature(self, inputs, args, kwargs, input_masks):

~\anaconda3\lib\site-packages\tensorflow\python\keras\engine\base_layer.py in _infer_output_signature(self, inputs, args, kwargs, input_masks)
    860           # overridden).
    861           # TODO(kaftan): do we maybe_build here, or have we already done it?
--> 862           self._maybe_build(inputs)
    863           outputs = call_fn(inputs, *args, **kwargs)
    864 

~\anaconda3\lib\site-packages\tensorflow\python\keras\engine\base_layer.py in _maybe_build(self, inputs)
   2708         # operations.
   2709         with tf_utils.maybe_init_scope(self):
-> 2710           self.build(input_shapes)  # pylint:disable=not-callable
   2711       # We must set also ensure that the layer is marked as built, and the build
   2712       # shape is stored since user defined build functions may not be calling

~\anaconda3\lib\site-packages\tensorflow\python\keras\layers\core.py in build(self, input_shape)
   1180     last_dim = tensor_shape.dimension_value(input_shape[-1])
   1181     if last_dim is None:
-> 1182       raise ValueError('The last dimension of the inputs to `Dense` '
   1183                        'should be defined. Found `None`.')
   1184     self.input_spec = InputSpec(min_ndim=2, axes={-1: last_dim})

ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.

 

Recommended Posts

  • 1
نشر

حسناً اعتدنا على تمرير وسيطين إلى طبقة التضمين، الأول هو عدد ال tokens (المفردات) الموجودة في بياناتك أي (1 + maximum word index) والثاني هو dimensionality of the embeddings أي أبعاد التضمين. وكان ذلك كافياً عندما تكون الطبقة التالية هي طبقة تكرارية (أحد أنواع RNN).
لكنك هنا تستخدم طبقة Flatten بعدها، لذا في هذه الحالة يجب أن نقوم بتمرير وسيط إضافي إلى طبقة التضمين وهو input_length أي طول سلاسل الإدخال لديك:

from keras.datasets import imdb
from keras.layers import Embedding, SimpleRNN,Flatten,Dense
from keras.models import Sequential
(input_train, y_train), (input_test, y_test) = imdb.load_data(
num_words=10000)
print(len(input_train), 'train sequences')
print(len(input_test), 'test sequences')
################ نضيف###################
from keras.preprocessing import sequence
maxlen = 20
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, 16, input_length=maxlen))
model.add(Flatten())
model.add(Dense(32, activation='relu'))
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, 20)
input_test shape: (25000, 20)
Epoch 1/2
625/625 [==============================] - 2s 3ms/step - loss: 0.6506 - acc: 0.5996 - val_loss: 0.5080 - val_acc: 0.7414
Epoch 2/2
625/625 [==============================] - 2s 3ms/step - loss: 0.4356 - acc: 0.7957 - val_loss: 0.4968 - val_acc: 0.7534

 

  • 0
نشر

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

لاحظ أنك قمت بتعريف maxlen وهو متغير ال padding الذي يقوم بتحويل شكل البيانات المدخلة من 25000, 25000 لكل من ال input_train, input_test على التوالي ل (25000, 20) لكل منهما. بالتالي نمرر maxlen لمتغير input_length في طبقة Embedding ويصبح البرنامج:

from keras.layers import Dense
from keras.datasets import imdb
from keras.models import Sequential
from keras.preprocessing import sequence
from keras.layers import Embedding, SimpleRNN,Flatten,Dense
maxlen = 20

(input_train, y_train), (input_test, y_test) = imdb.load_data(num_words=10000)
print(len(input_train), 'train sequences')
print(len(input_test), 'test sequences')
print('train_shape',input_train.shape)
print('test_shape',input_test.shape)
print('Pad sequences (samples x time)')
print(input_train[0])
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)
print(input_train[0])

model = Sequential()
model.add(Embedding(10000, 16,input_length=maxlen))
model.add(Flatten())
model.add(Dense(32, activation='relu'))
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)

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...