Функциональный API со смешанными входными данными.Получил эту ошибку: AttributeError: объект 'tuple' не имеет атрибута 'ndim' - PullRequest
0 голосов
/ 23 сентября 2019

Я прочитал и ищу похожий вопрос, но ответы у меня не сработали, даже если я попробую его несколькими способами.

У меня есть набор данных, который таким образом представляет 4.000.000 различных строк, представляющих ячейку (категориальные данные), и 4.000.000 долготы, широты, представляющих, где эти ячейки находятся здесь, является фрагментом набора данных (числовые данные)


device_id                    seconds      latitude     longitude

jg4M/taYRc2cBJPGa8c7vw==       752        53.392060    -2.069796

Я создаю эту модель, она работает, но у меня возникают проблемы, когда я пытаюсь подогнать ее.Модель имеет набор слоев для категориальных данных и отдельный набор слоев для числовых данных.И я объединяю их.Все работает нормально, пока не подойдет часть. Вот код.


device_id = Input(name = 'data_tf', shape = [1,1])
visible = Input(name = 'X_train', shape=(3,1,1))

#this is the categorical layers  
top_words = 10376
embedding_vector_length = 22
x = Embedding(top_words, embedding_vector_length)(device_id)
x = Dense(2, activation='sigmoid')(x)
modelx = Model(inputs=device_id, outputs = x)


#this are the numerical layers
hidden1 = Dense(10, activation='relu')(visible)
hidden2 = Dense(20, activation='relu')(hidden1)
hidden3 = Dense(10, activation='relu')(hidden2)
output = Dense(2, activation='sigmoid')(hidden3)

modely = Model(inputs=visible, outputs=output)

#merge the two set of layers and all this works perfectly 
merge = concatenate([x, output], axis =1)

#layers after concatenate 

hidden1 = Dense(10, activation='relu')(merge)
hidden2 = Dense(10, activation='relu')(hidden1)
output = Dense(2, activation='sigmoid')(hidden2)
model = Model(inputs=[device_id,visible], outputs=output)

Вот краткое изложение модели:


Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
X_train (InputLayer)            (None, 3, 1, 1)      0                                            
__________________________________________________________________________________________________
dense_2 (Dense)                 (None, 3, 1, 10)     20          X_train[0][0]                    
__________________________________________________________________________________________________
data_tf (InputLayer)            (None, 1, 1)         0                                            
__________________________________________________________________________________________________
dense_3 (Dense)                 (None, 3, 1, 20)     220         dense_2[0][0]                    
__________________________________________________________________________________________________
embedding_1 (Embedding)         (None, 1, 1, 22)     228272      data_tf[0][0]                    
__________________________________________________________________________________________________
dense_4 (Dense)                 (None, 3, 1, 10)     210         dense_3[0][0]                    
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, 1, 1, 2)      46          embedding_1[0][0]                
__________________________________________________________________________________________________
dense_5 (Dense)                 (None, 3, 1, 2)      22          dense_4[0][0]                    
__________________________________________________________________________________________________
concatenate_1 (Concatenate)     (None, 4, 1, 2)      0           dense_1[0][0]                    
                                                                 dense_5[0][0]                    
__________________________________________________________________________________________________
dense_6 (Dense)                 (None, 4, 1, 10)     30          concatenate_1[0][0]              
__________________________________________________________________________________________________
dense_7 (Dense)                 (None, 4, 1, 10)     110         dense_6[0][0]                    
__________________________________________________________________________________________________
dense_8 (Dense)                 (None, 4, 1, 2)      22          dense_7[0][0]                    
==================================================================================================
Total params: 228,952
Trainable params: 228,952
Non-trainable params: 0
__________________________________________________________________________________________________
None

затем

model.compile(loss='binary_crossentropy',optimizer='adam', metrics=['accuracy'])

но этоэто часть, которая не работает:

model.fit((visible,device_id),X_trainY, batch_size=10, epochs=5, verbose=1)


AttributeError: 'tuple' object has no attribute 'ndim'

У меня есть поиск в течение 4 дней, похожий вопрос, но ни один из них не работает для меня.

Может ли кто-нибудь помочь?

ОБНОВЛЕНИЕ Я аккуратно поставил скобки, как это предложено ниже Ришабхом Сахраватом, и теперь у меня есть эта проблема

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-53-9b35f717e3e7> in <module>
----> 1 model.fit([visible,device_id],X_trainY, batch_size=10, epochs=5, verbose=1)

//anaconda3/lib/python3.7/site-packages/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, **kwargs)
    950             sample_weight=sample_weight,
    951             class_weight=class_weight,
--> 952             batch_size=batch_size)
    953         # Prepare validation data.
    954         do_validation = False

//anaconda3/lib/python3.7/site-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size)
    749             feed_input_shapes,
    750             check_batch_axis=False,  # Don't enforce the batch size.
--> 751             exception_prefix='input')
    752 
    753         if y is not None:

//anaconda3/lib/python3.7/site-packages/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
     90         data = data.values if data.__class__.__name__ == 'DataFrame' else data
     91         data = [data]
---> 92     data = [standardize_single_array(x) for x in data]
     93 
     94     if len(data) != len(names):

//anaconda3/lib/python3.7/site-packages/keras/engine/training_utils.py in <listcomp>(.0)
     90         data = data.values if data.__class__.__name__ == 'DataFrame' else data
     91         data = [data]
---> 92     data = [standardize_single_array(x) for x in data]
     93 
     94     if len(data) != len(names):

//anaconda3/lib/python3.7/site-packages/keras/engine/training_utils.py in standardize_single_array(x)
     23                 'When feeding symbolic tensors to a model, we expect the'
     24                 'tensors to have a static batch size. '
---> 25                 'Got tensor with shape: %s' % str(shape))
     26         return x
     27     elif x.ndim == 1:

ValueError: When feeding symbolic tensors to a model, we expect thetensors to have a static batch size. Got tensor with shape: (None, 3, 1, 1)

1 Ответ

0 голосов
/ 23 сентября 2019

Поскольку вы не вставили полный журнал ошибок, из того, что вы поделились, я думаю, что проблема в круглых скобках, которые вы использовали для ввода данных (категориальные, числовые).Попробуйте использовать квадратные скобки, такие как model.fit([visible,device_id], X_trainY, batch_size=10, epochs=5, verbose=1)

РЕДАКТИРОВАТЬ

В вашем определении device_id параметр формы должен быть с круглыми скобками вместо квадратных скобок.Или, может быть, есть причина, которую вы можете объяснить.

Причиной новой ошибки в вашем EDIT может быть использование имени слоя в model.fit вместо подачи фактических данных.Посмотрите здесь (перейдите к Общие слои ), как и что передать в модель общих слоев.Также взгляните на похожую проблему .

Еще одна вещь, которую я нашел в вашем коде, здесь: model = Model(inputs=[device_id,visible], outputs=output), здесь сначала модель ожидает данные device_id, а затем visible, но в исходном коде в fit вы его кормитенаоборот.model.fit((visible,device_id),X_trainY, batch_size=10, epochs=5, verbose=1) и здесь visible и device_id должны быть фактическими данными, а не именами слоев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...