Как я могу исправить несовместимую форму: [32,32 против [32, 32, 912] Керас - PullRequest
0 голосов
/ 12 ноября 2019

Я работаю с нестандартной потерей в модели и получаю эту ошибку

tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [32,32] vs. [32,32,912]
 [[{{node LogicalAnd}}]]

Это странно, но я знаю, что это проблема с input_b, который имеет форму (331, 912),Поэтому я посмотрел на форму моей модели, а input_b там нет. РЕДАКТИРОВАТЬ Так что, если исправлена ​​проблема со вторым входом не отображается. Но я все еще получаю ту же ошибку. Так что я думал об этом, потому что второй вход пропал был неправильным.

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_a (InputLayer)            (None, 224, 224, 3)  0                                            
__________________________________________________________________________________________________
input_b (InputLayer)            (None, 912)          0                                            
__________________________________________________________________________________________________
model_1 (Model)                 (None, 2048)         20861480    input_a[0][0]                    
__________________________________________________________________________________________________
concatenate_1 (Concatenate)     (None, 2960)         0           input_b[0][0]                    
                                                             model_1[1][0]                    
==================================================================================================
Total params: 20,861,480
Trainable params: 20,806,952
Non-trainable params: 54,528
__________________________________________________________________________________________________
None

Так что я не знаю, что происходит с этой ошибкой. Тогда я думаю, что это связано с отсутствием входного слоя, но так ли это? Вот мой код модели

# Define new model
input_a = Input(shape=(224, 224, 3), name='input_a')
input_b = Input(shape=(912,), name='input_b')

embeddings = base_network(input_a) # loaded from a fine tuned model
final_data = Concatenate(axis=1)([input_b, embeddings])

batch_loss = batch_hard_triplet_loss(embeddings, input_b, 0.4, False)
model = Model(inputs=[input_a, input_b], outputs=final_data)
# Compile model
model.compile(loss=batch_loss, optimizer='adam')

Полная ошибка Журналы

Preocessing data...
Shape of X train
(331, 224, 224, 3)
Shape of Y train
(331, 912)
(164, 224, 224, 3)
(164, 912)
Finished processing data.
Initializing Model...
WARNING:tensorflow:From     C:/Users/matthew.millar/Documents/reid/ReIDFullProject/AdvancedTensorflowTripleLoss.py:47: to_float (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.cast instead.
Model Created.

Started Training model...
WARNING:tensorflow:From C:\Users\matthew.millar\Anaconda3\envs\tf\lib\site-packages\tensorflow\python\ops\math_grad.py:102: div (from     tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Deprecated in favor of operator or tf.math.divide.
Train on 332 samples, validate on 164 samples
Epoch 1/10
Traceback (most recent call last):
  File     "C:/Users/matthew.millar/Documents/reid/ReIDFullProject/AdvancedTensorflowTripleLoss.py", line 288, in <module>
callbacks=callbacks_list)
  File "C:\Users\matthew.millar\Anaconda3\envs\tf\lib\site-packages\keras\engine\training.py", line 1039, in fit
validation_steps=validation_steps)
  File "C:\Users\matthew.millar\Anaconda3\envs\tf\lib\site-packages\keras\engine\training_arrays.py", line 199, in fit_loop
outs = f(ins_batch)
  File "C:\Users\matthew.millar\Anaconda3\envs\tf\lib\site-packages\keras\backend\tensorflow_backend.py", line 2715, in __call__
return self._call(inputs)
  File "C:\Users\matthew.millar\Anaconda3\envs\tf\lib\site-packages\keras\backend\tensorflow_backend.py", line 2675, in _call
fetched = self._callable_fn(*array_vals)
  File "C:\Users\matthew.millar\Anaconda3\envs\tf\lib\site-packages\tensorflow\python\client\session.py", line 1439, in __call__
run_metadata_ptr)
  File "C:\Users\matthew.millar\Anaconda3\envs\tf\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 528, in __exit__
c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [32,32] vs. [32,32,912]
 [[{{node LogicalAnd}}]]

Вот функция подгонки, чтобы вы знали, как я отправляю данные в

history = model.fit(x=[x_train, y_train], y=dummy_y_train,
                epochs=EPOCH,
                batch_size=BATCHSIZE,
                shuffle=True,
                validation_data=([x_test, y_test], dummy_y_test),
                verbose=1,
                callbacks=callbacks_list)

1 Ответ

0 голосов
/ 13 ноября 2019

Хорошо, я понял это после хорошего ночного отдыха. Было несколько проблем с кодом.

Во-первых, я сделал to_categorical для второго ввода, так как это была строка. Это было проблемой, так как я чувствую, что keras видел это естественно как метку и испортил форму ввода, так что это было [32,32,913], которое является размером пакета х число входных данных. Таким образом, чтобы исправить это, я изменяю этот ввод в int, который может читать keras.

Второе изменение состояло в том, чтобы изменить форму ввода на 1, что было бы логично для целых чисел.

так что это окончательная модель и сейчас она отлично работает

# Define new model
input_a = Input(shape=(224, 224, 3), name='input_a')
input_b = Input(shape=(1,), name='input_b')
embeddings = base_network(input_a) # loaded from a fine tuned model
batch_loss = batch_hard_triplet_loss(embeddings, input_b, 0.4, False)
model = Model(inputs=[input_a, input_b], outputs=embeddings)

Надеюсь, это поможет всем, у кого возникнут проблемы в будущем.

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