Я строй 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
Как изменить данные, чтобы получить какие-либо значимые представления о нем и впоследствии передать его в логистической регрессии слой?
, когда я 'бассейн = tf.reshape (бассейн, [pool_shape [0], [pool_shape 2] * pool_shape [3]]) ', я получаю:' TypeError: ожидаемый int32, получил Dimension (None) типа 'Dimension' вместо .'. Я подозреваю, что это связано с тем, что форма пула является 'pool_shape == (?, 1, 1819, 10)', где должен быть выведен самый первый аргумент и не является явным целым числом. Как мне решить эту проблему? Предполагаемый параметр - размер партии, который может меняться, я думаю. – Oleksandra
Кроме того, в самом начале: 'Защиту my_conv_model (х, у): х = tf.cast (х, tf.float32) у = tf.cast (у, tf.float32) печати (" х ", x.get_shape()) print (" y ", y.get_shape())' напечатанные формы: 'x (?, 3640) 'и ' y (?,) '. Есть ли способ получить размер и сохранить их в переменной или что-то еще? – Oleksandra
Ах, я обновил ответ, чтобы использовать 'tf.shape()' (который использует фактическую форму во время выполнения) вместо 'Tensor.get_shape()'. Похоже, что размер партии является переменным в вашей программе. Если вы хотите увидеть фактическую форму тензора, размер которой может меняться, вы можете передать тензор на 'tf.shape()' op и передать результат в 'sess.run()'. – mrry