2016-09-26 1 views
0

Я строй CNN фитинга своих собственных данных, основанных на this exampleтензора Перепрофилирования после макса Объединив ValueError: Фигуры не совместимы

В основном, мои данные есть 3640 возможностей; У меня есть слой свертки, за которым следует слой объединения, который объединяет все остальные функции, поэтому я заканчиваю размеры (?, 1, 1819, 1), потому что 3638 объектов после conv layer/2 == 1819.

Когда я пытаются изменить свои данные после объединения, чтобы получить его в виде [n_samples, n_fetures]

print("pool_shape", pool_shape) #pool (?, 1, 1819, 10) 
    print("y_shape", y_shape) #y (?,) 

    pool.set_shape([pool_shape[0], pool_shape[2]*pool_shape[3]]) 
    y.set_shape([y_shape[0], 1]) 

Я получаю сообщение об ошибке:

ValueError: Shapes (?, 1, 1819, 10) and (?, 18190) are not compatible

Мой код:

N_FEATURES = 140*26 
N_FILTERS = 1 
WINDOW_SIZE = 3 

def my_conv_model(x, y): 

    x = tf.cast(x, tf.float32) 
    y = tf.cast(y, tf.float32) 

    print("x ", x.get_shape()) 
    print("y ", y.get_shape()) 

    # to form a 4d tensor of shape batch_size x 1 x N_FEATURES x 1 
    x = tf.reshape(x, [-1, 1, N_FEATURES, 1]) 
    # this will give you sliding window of 1 x WINDOW_SIZE convolution. 
    features = tf.contrib.layers.convolution2d(inputs=x, 
               num_outputs=N_FILTERS, 
               kernel_size=[1, WINDOW_SIZE], 
               padding='VALID') 

    print("features ", features.get_shape()) #features (?, 1, 3638, 10) 

    # Max pooling across output of Convolution+Relu. 
    pool = tf.nn.max_pool(features, ksize=[1, 1, 2, 1], 
          strides=[1, 1, 2, 1], padding='SAME') 

    pool_shape = pool.get_shape() 
    y_shape = y.get_shape() 
    print("pool_shape", pool_shape) #pool (?, 1, 1819, 10) 
    print("y_shape", y_shape) #y (?,) 

### here comes the error ### 
    pool.set_shape([pool_shape[0], pool_shape[2]*pool_shape[3]]) 
    y.set_shape([y_shape[0], 1]) 

    pool_shape = pool.get_shape() 
    y_shape = y.get_shape() 
    print("pool_shape", pool_shape) #pool (?, 1, 1819, 10) 
    print("y_shape", y_shape) #y (?,) 

    prediction, loss = learn.models.logistic_regression(pool, y) 
    return prediction, loss 

Как изменить данные, чтобы получить какие-либо значимые представления о нем и впоследствии передать его в логистической регрессии слой?

ответ

1

Это похоже на путаницу между методом Tensor.set_shape() и оператором tf.reshape(). В этом случае, вы должны использовать tf.reshape(), потому что вы меняете форму pool и y тензоров:

  • Оператор tf.reshape(tensor, shape) принимает tensor любой формы, и возвращает тензор с данной shape, до тех пор, они имеют одинаковое количество элементов. Этот оператор следует использовать для изменение формы входного тензора.

  • tensor.set_shape(shape) метод принимает tensor, которые могут иметь частично известную или неизвестную форму, и утверждает, чтобы TensorFlow, что он на самом деле имеет заданную shape. Этот метод следует использовать для , чтобы получить более подробную информацию о форме конкретного тензора.

    Его можно использовать, например, когда вы берете вывод оператора, который имеет зависимую от данных форму вывода (например, tf.image.decode_jpeg()) и утверждают, что он имеет статическую форму (например, на основе знаний о размерах изображений в вашем наборе данных).

В вашей программе, вы должны заменить вызовы set_shape() что-то вроде следующего:

pool_shape = tf.shape(pool) 
pool = tf.reshape(pool, [pool_shape[0], pool_shape[2] * pool_shape[3]]) 

y_shape = tf.shape(y) 
y = tf.reshape(y, [y_shape[0], 1]) 

# Or, more straightforwardly: 
y = tf.expand_dims(y, 1)  
+0

, когда я 'бассейн = tf.reshape (бассейн, [pool_shape [0], [pool_shape 2] * pool_shape [3]]) ', я получаю:' TypeError: ожидаемый int32, получил Dimension (None) типа 'Dimension' вместо .'. Я подозреваю, что это связано с тем, что форма пула является 'pool_shape == (?, 1, 1819, 10)', где должен быть выведен самый первый аргумент и не является явным целым числом. Как мне решить эту проблему? Предполагаемый параметр - размер партии, который может меняться, я думаю. – Oleksandra

+0

Кроме того, в самом начале: 'Защиту my_conv_model (х, у): х = tf.cast (х, tf.float32) у = tf.cast (у, tf.float32) печати (" х ", x.get_shape()) print (" y ", y.get_shape())' напечатанные формы: 'x (?, 3640) 'и ' y (?,) '. Есть ли способ получить размер и сохранить их в переменной или что-то еще? – Oleksandra

+0

Ах, я обновил ответ, чтобы использовать 'tf.shape()' (который использует фактическую форму во время выполнения) вместо 'Tensor.get_shape()'. Похоже, что размер партии является переменным в вашей программе. Если вы хотите увидеть фактическую форму тензора, размер которой может меняться, вы можете передать тензор на 'tf.shape()' op и передать результат в 'sess.run()'. – mrry

Смежные вопросы