Я пытаюсь создать пользовательский 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.
Я перепробовал все, что мог придумать, и не могу найти, почему ввод не сохраняет правильный размер.