Я пытаюсь объединить несколько входных тензоров. Некоторые входные данные являются плотными, некоторые - разреженными матрицами.
input_shipping = Input(shape=[x_train['shipping'].shape[1]], name='shipping')
input_condition = Input(shape=[x_train['condition'].shape[1]], name='condition')
input_subcat1 = Input(shape=[x_train['subcat1'].shape[1]], name='subcat1', sparse=True)
input_subcat2 = Input(shape=[x_train['subcat2'].shape[1]], name='subcat2', sparse=True)
input_subcat3 = Input(shape=[x_train['subcat3'].shape[1]], name='subcat3', sparse=True)
input_brand = Input(shape=[x_train['brand'].shape[1]], name='brand', sparse=True)
input_description = Input(shape=[x_train['description'].shape[1]], name='description', sparse=True)
input_list = [input_shipping, input_condition, input_subcat1, input_subcat2, input_subcat3, input_brand, input_description]
input_conc = concatenate(input_list, axis=-1)
Все разреженные матрицы создаются с помощью sklearn.preprocessing.LabelBinarizer , кроме последней (x_train ['description']), которая создается sklearn.feature_extraction.text.TfidfVectorizer . После создания последнего выполняются sort_indices () и sum_duplicates () , поэтому матрица получает «каноническую» форму. Его свойства _has_canonical_format и _has_sorted_indices оба имеют значение True. Я тоже это проверил вручную.
Тем не менее, тренировочный заезд в самом начале начинается с
Caused by op 'concatenate_2/SparseToDense_4', defined at:
File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.4\helpers\pydev\pydevconsole.py", line 511, in <module>
pydevconsole.start_server(host, int(port), int(client_port), client_host)
File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.4\helpers\pydev\pydevconsole.py", line 336, in start_server
process_exec_queue(interpreter)
File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.4\helpers\pydev\pydevconsole.py", line 192, in process_exec_queue
more = interpreter.add_exec(code_fragment)
File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.4\helpers\pydev\_pydev_bundle\pydev_console_utils.py", line 281, in add_exec
more = self.do_add_exec(code_fragment)
File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.4\helpers\pydev\pydevconsole.py", line 102, in do_add_exec
command.run()
File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.4\helpers\pydev\pydevconsole.py", line 63, in run
self.more = self.interpreter.runsource(text, '<input>', symbol)
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\code.py", line 75, in runsource
self.runcode(code)
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\code.py", line 91, in runcode
exec(code, self.locals)
File "<input>", line 18, in <module>
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\site-packages\keras\layers\merge.py", line 641, in concatenate
return Concatenate(axis=axis, **kwargs)(inputs)
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\site-packages\keras\engine\base_layer.py", line 457, in __call__
output = self.call(inputs, **kwargs)
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\site-packages\keras\layers\merge.py", line 155, in call
return self._merge_function(inputs)
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\site-packages\keras\layers\merge.py", line 357, in _merge_function
return K.concatenate(inputs, axis=self.axis)
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\site-packages\keras\backend\tensorflow_backend.py", line 1934, in concatenate
return tf.concat([to_dense(x) for x in tensors], axis)
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\site-packages\keras\backend\tensorflow_backend.py", line 1934, in <listcomp>
return tf.concat([to_dense(x) for x in tensors], axis)
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\site-packages\keras\backend\tensorflow_backend.py", line 353, in to_dense
return tf.sparse_tensor_to_dense(tensor)
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\site-packages\tensorflow\python\ops\sparse_ops.py", line 996, in sparse_tensor_to_dense
name=name)
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\site-packages\tensorflow\python\ops\sparse_ops.py", line 776, in sparse_to_dense
name=name)
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\site-packages\tensorflow\python\ops\gen_sparse_ops.py", line 2898, in sparse_to_dense
name=name)
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 787, in _apply_op_helper
op_def=op_def)
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\site-packages\tensorflow\python\util\deprecation.py", line 454, in new_func
return func(*args, **kwargs)
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\site-packages\tensorflow\python\framework\ops.py", line 3155, in create_op
op_def=op_def)
File "C:\Users\Aleksandar\Miniconda3\envs\modelling\lib\site-packages\tensorflow\python\framework\ops.py", line 1717, in __init__
self._traceback = tf_stack.extract_stack()
InvalidArgumentError (see above for traceback): indices[1] = [0,111568] is out of order
[[Node: concatenate_2/SparseToDense_4 = SparseToDense[T=DT_FLOAT, Tindices=DT_INT64, validate_indices=true, _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_description/indices_1_0_4, _arg_description/shape_1_0_5, _arg_description/values_1_0_6, concatenate_2/SparseToDense/default_value)]]
Я уверен, что проблема в этой матрице, потому что, когда она опущена, все работает, как ожидалось. Кроме того, я уверен, что проблема в слое конкатенации, потому что, когда input_description подключен непосредственно к следующему слою, проблем нет.
Я что-то здесь упускаю? Есть ли другое решение, кроме объединения всех входных матриц в одну разреженную матрицу?
Я использую Keras v2.2.2 с TensorFlow-GPU v1.10.0 и scikit-learn v0.19.1.
и запуск Python v3.6.6 в Windows 10.