0

Я создаю сверточный NN символьного уровня. У меня есть куча образцов в качестве обучающих данных, и каждый образец имеет размерность 3640. Я думаю, что я не имею ни малейшего понятия грубо, как изменить размер/перекроить размеры в tensorflow, потому что я продолжаю получать ошибки я не могу исправить:Размеры слоев в Conv Net Tensorflow: ValueError: Форма полной переменной (logistic_regression/weight) должна быть полностью определена

Traceback (most recent call last): 
    File "/Users/osopova/Documents/00_KSU_Masters/00_2016_Fall/00_Research/cnn_da/step_4_cnn_4.py", line 87, in my_conv_model 
    prediction, loss = learn.models.logistic_regression(pool, y) 
    File "/Users/osopova/Applications/anaconda/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/models.py", line 146, in logistic_regression 
    'weights', [x.get_shape()[1], y.get_shape()[-1]], dtype=dtype) 
    File "/Users/osopova/Applications/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.py", line 873, in get_variable 
    custom_getter=custom_getter) 
    File "/Users/osopova/Applications/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.py", line 700, in get_variable 
    custom_getter=custom_getter) 
    File "/Users/osopova/Applications/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.py", line 217, in get_variable 
    validate_shape=validate_shape) 
    File "/Users/osopova/Applications/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.py", line 202, in _true_getter 
    caching_device=caching_device, validate_shape=validate_shape) 
    File "/Users/osopova/Applications/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.py", line 515, in _get_single_variable 
    "but instead was %s." % (name, shape)) 
ValueError: Shape of a new variable (logistic_regression/weights) must be fully defined, but instead was (?, 1). 
Traceback (most recent call last): 
    File "/Users/osopova/Documents/00_KSU_Masters/00_2016_Fall/00_Research/cnn_da/step_4_cnn_4.py", line 175, in <module> 
Traceback (most recent call last): 
    File "/Users/osopova/Documents/00_KSU_Masters/00_2016_Fall/00_Research/cnn_da/step_4_cnn_4.py", line 87, in my_conv_model 
    prediction, loss = learn.models.logistic_regression(pool, y) 
    File "/Users/osopova/Applications/anaconda/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/models.py", line 146, in logistic_regression 
    'weights', [x.get_shape()[1], y.get_shape()[-1]], dtype=dtype) 
    File "/Users/osopova/Applications/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.py", line 873, in get_variable 
    custom_getter=custom_getter) 
    File "/Users/osopova/Applications/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.py", line 700, in get_variable 
    custom_getter=custom_getter) 
    File "/Users/osopova/Applications/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.py", line 217, in get_variable 
    validate_shape=validate_shape) 
    File "/Users/osopova/Applications/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.py", line 202, in _true_getter 
    caching_device=caching_device, validate_shape=validate_shape) 
    File "/Users/osopova/Applications/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.py", line 515, in _get_single_variable 
    "but instead was %s." % (name, shape)) 
ValueError: Shape of a new variable (logistic_regression/weights) must be fully defined, but instead was (?, 1). 

Вот код:

import tensorflow as tf 
from tensorflow.contrib import learn 

N_FEATURES = 140*26 
N_FILTERS = 10 
WINDOW_SIZE = 3 

ко модель начинается:

def my_conv_model(x, y): 

# 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 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') 

# Add a RELU for non linearity. 
features = tf.nn.relu(features) 

# 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') 

print("(1) pool_shape", pool.get_shape()) 
print("(1) y_shape", y.get_shape()) 

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

print("(2) pool_shape", pool.get_shape()) 
print("(2) y_shape", y.get_shape()) 

try: 
    exc_info = sys.exc_info() 

    print("(3) pool_shape", pool.get_shape()) 
    print("(3) y_shape", y.get_shape()) 
ЗДЕСЬ пРИХОДИТ ОШИБКА:
prediction, loss = learn.models.logistic_regression(pool, y) 
    return prediction, loss 
except Exception: 
    #print(traceback.format_exc()) 
    pass 
finally: 
    # Display the *original* exception 
    traceback.print_exception(*exc_info) 
    del exc_info 
#return prediction, loss 

Формы:

(1) pool_shape (?, 1, 1819, 10) 
(1) y_shape (?,) 
(2) pool_shape (?, ?) 
(2) y_shape (?, 1) 
(3) pool_shape (?, ?) 
(3) y_shape (?, 1) 

Основной:

def main(unused_argv): 

    # training and testing data encoded as one-hot 
    data_folder = './data' 

    sandyData = np.loadtxt(data_folder+'/sandyData.csv', delimiter=',') 
    sandyLabels = np.loadtxt(data_folder+'/sandyLabels.csv', delimiter=',') 

    x_train, x_test, y_train, y_test = \ 
     train_test_split(sandyData, sandyLabels, test_size=0.2, random_state=7) 

    x_train = np.array(x_train, dtype=np.float32) 
    x_test = np.array(x_test, dtype=np.float32) 
    y_train = np.array(y_train, dtype=np.float32) 
    y_test = np.array(y_test, dtype=np.float32) 

    # Build model 
    classifier = learn.Estimator(model_fn=my_conv_model) 

    # Train and predict 
    classifier.fit(x_train, y_train, steps=100) 
    y_predicted = [p['class'] for p in classifier.predict(x_test, as_iterable=True)] 
    score = metrics.accuracy_score(y_test, y_predicted) 
    print('Accuracy: {0:f}'.format(score)) 


if __name__ == '__main__': 
    tf.app.run() ` 
+0

Можете ли вы опубликовать полную статистику стека? – mrry

+0

@mrry, пожалуйста, посмотрите, я обновил сообщение. Я использовал 'traceback.format_exc()', чтобы получить (полную) трассировку стека – Oleksandra

+0

@mrry - мое обновление достаточно? Я использовал первый совет здесь: http://stackoverflow.com/questions/3702675/how-to-print-the-full-traceback-without-halting-the-program для печати полной трассировки стека, но я не уверен, что это именно то, что вы хотели, чтобы я предоставлял. – Oleksandra

ответ

1

Похоже, проблема в том, что pool аргумент logistic_regression() не имеет известное количество столбцов. linear_regression() должно знать количество столбцов в аргументе x для создания весовой матрицы соответствующего размера.

Эта проблема вытекает из следующей строки:

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

Хотя pool_shape[2]*pool_shape[3] имеет постоянное значение, на стороне клиента постоянное складывание TensorFlow в настоящее время не обрабатывать это выражение, так что он выводит статическую форму тензора pool к be (?, ?) (как показывает ваш вывод журнала). Один из способов, чтобы сделать следующее изменение:

pool_shape = pool.get_shape() 
pool = tf.reshape(pool, [-1, (pool_shape[2] * pool_shape[3]).value]) 

Используя pool.get_shape() вместо tf.shape(pool) дает TensorFlow немного больше информации о (частично определенной форме) pool, как tf.TensorShape объекта, а не tf.Tensor объекта. После этого изменения оба значения pool_shape[2] и pool_shape[3] имеют известные значения, поэтому количество столбцов в pool будет известно.

+0

При таком подходе я получил сообщение об ошибке «Ожидаемый int32, но получил измерение». В конце концов, я закончил явно сохранение количества выборок в переменной вне conv. модель, а затем передать ее, чтобы изменить форму и т. д. Не лучшее решение вообще, но теперь будет работать. Благодарим вас за отзыв, поразительно видеть, что реальные разработчики от Tensorflow отвечают на вопросы :) – Oleksandra

+1

Хм, возможно, что автоматическое преобразование типов здесь немного слабо. Я опубликовал обновление, которое должно работать - сообщите мне, если это так! – mrry

+0

Да, это работает! – Oleksandra

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

  • Нет связанных вопросов^_^