Tensorflow numeric_column, чтобы сгладить размеры тензора - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь создать пользовательский API для оценки тензорного потока в python.Я следовал примеру кода, который почти дословно найден здесь: https://github.com/tensorflow/models/blob/master/samples/core/get_started/custom_estimator.py

Однако я пытаюсь реализовать CNN, поэтому моя модель имеет следующую структуру с некоторыми дополнительными параметрами, передаваемыми через params []:

############### Define the Graph Structure
net = tf.feature_column.input_layer(features, params['feature_columns'])

for filters,window in params['CNN']:
    net = tf.layers.conv1d(inputs=net, filters=filters, kernel_size=window, activation=tf.nn.relu)

    net = tf.layers.max_pooling1d(inputs=net,pool_size=params['POOL'])

for nodes in params['DENSE']:
    net = tf.layers.dense(inputs=net,units=nodes,activation=tf.nn.relu)

output = tf.layers.dense(inputs=net,units=params['OUT'],activation=tf.nn.relu)

Я определил столбцы объектов как последовательности из пяти чисел длиной 32. Размеры (32,5).

the_feature_column = []
for key in feattraindatanorm.keys():
the_feature_column.append(tf.feature_column.numeric_column(key = key, shape=(32,5)))

Я создаю случайные данные следующим образом:

testtestdata = dict({'sequences':np.random.rand(100,32,5)})
testtestlabel = dict({'labels':np.random.rand(100)})
traintestdata = dict({'sequences':np.random.rand(100,32,5)})
traintestlabel = dict({'labels':np.random.rand(100)})

Мои функции ввода выглядят так (снова просто копия связанного файла выше):

def input_functor(datanorm,labelsnorm,batch_size):
    long = int(datanorm['sequences'].shape[0])
    dataset = tf.data.Dataset.from_tensor_slices((datanorm,labelsnorm))
    dataset = dataset.shuffle(long).repeat().batch(batch_size)
    return dataset.make_one_shot_iterator().get_next()

Tensorflow создает модель без ошибок.Однако, когда я пытаюсь тренироваться, я получаю следующую ошибку:

~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\layers\base.py in _assert_input_compatibility(self, inputs)
   1184                            'expected ndim=' + str(spec.ndim) + ', found ndim=' +
   1185                            str(ndim) + '. Full shape received: ' +
-> 1186                            str(x.get_shape().as_list()))
   1187       if spec.max_ndim is not None:
   1188         ndim = x.get_shape().ndims

ValueError: Input 0 of layer conv1d_1 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: [None, 160]

Похоже, что мой столбец с характеристиками измерения (партия, 32,5) как-то сплющен до (партия, 160) инесовместим с первым слоем CNN.

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

...