Проблема с вводом нуля для Steered Convolution Layer - PullRequest
1 голос
/ 21 мая 2019

Я использую новую графическую библиотеку Tensorflow для применения управляемой свертки к ряду ячеек.Во многих случаях у вас будет ряд мешей, которые не имеют одинаковый размер, и вы должны обнулить меньшие.Согласно документации, аргумент «sizes» функции graph_conv.feature_steered_convolution_layer принимает тензор int, состоящий из числа неэлементарных элементов каждой сетки.По какой-то причине, когда этот аргумент имеет значение, отличное от «None», я получаю предупреждение о том, что разреженный массив, используемый в аргументе «соседей», преобразуется в плотную матрицу.Это заставляет мою программу работать нелепо медленно.

Проблема, похоже, связана с тем, как она рассчитывает градиенты.Если оптимизатор закомментирован, ошибка не появляется.

Я читал о похожей проблеме (ссылка ниже), где решением проблемы было использование tf.dynamic_partition вместо tf.gather.Однако функции tf.gather в этом случае находятся в библиотеке graph_convolution.Я попытался внести некоторые изменения в мою копию библиотеки, но безрезультатно.

Как работать с UserWarning: Преобразование разреженных IndexedSlices в плотный тензор неизвестной формы

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from absl.testing import parameterized
import numpy as np
import tensorflow as tf

from tensorflow_graphics.nn.layer import graph_convolution as graph_conv

#Number of meshes
N = 2
#Number of spatial dimensions
d = 2

#################################
#Data consists of the vertices of two meshes.  The first mesh has 5 vertices and the second has 4.
    #Shape of data is (numberOfMeshes,maxNumberofVertices,numberofSpatialDimensions)

#An array containing the actual size of each non-padded mesh
sz = np.array([5,4],dtype=np.int64)
#The maximum number of vertices in a mesh
datav = 5

#Input placeholder for input data (vertices)
V0 = tf.placeholder(dtype=tf.float64,name="V0",shape=(N,datav,d)) 
#Input Placeholder for labels for classification (For now, I'm just using throw-away data as my labels)
L = tf.placeholder(shape=(N,5,1),dtype=tf.float64)
SZ = tf.placeholder(shape=(N),dtype=tf.int64)
#Input placeholder for the sparse array representing the adjacency matrix shape:(numberOfMeshes,datav,datav)
    #The warning is not raised if "SZ" is changed to "None
adj_sp = tf.sparse_placeholder(shape=(SZ.shape[0],datav,datav),dtype=tf.float64,name='SPP')



#The steered graph convolution that is included in Tensorflow's new graphics package
output = graph_conv.feature_steered_convolution_layer(data=V0,neighbors=adj_sp,sizes=SZ,translation_invariant=False,num_weight_matrices=1,num_output_channels=1)

loss = tf.losses.softmax_cross_entropy(L,output, weights=1.0)
optimizer = tf.train.AdamOptimizer(learning_rate=.001).minimize(loss) #Warning not raised if this is commented out

Когда запускается приведенный выше код, я получаю следующее предупреждение:

C:\Python37\lib\site-packages\tensorflow\python\ops\gradients_impl.py:110: 
UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown 
shape. This may consume a large amount of memory.
  "Converting sparse IndexedSlices to a dense Tensor of unknown shape. "

Я начинаю думать, что это может иметь больше общего с самой библиотекой, чем с этим фрагментом кода.Я ссылался на это в GitHub на случай, если потребуется обновление (или дополнительная документация) библиотеки.https://github.com/tensorflow/graphics/issues/13

...