Подтвердить что ты не робот

Как исправить ошибку измерения в TensorFlow?

Я пытаюсь применить экспертную часть учебника к своим собственным данным, но я постоянно сталкиваюсь с ошибками измерения. Здесь код, предшествующий ошибке.

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)

def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def max_pool_2x2(x):
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                        strides=[1, 2, 2, 1], padding='SAME')

W_conv1 = weight_variable([1, 8, 1, 4])
b_conv1 = bias_variable([4])

x_image = tf.reshape(tf_in, [-1,2,8,1])

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)

И затем, когда я пытаюсь запустить эту команду:

W_conv2 = weight_variable([1, 4, 4, 8])
b_conv2 = bias_variable([8])

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)

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

ValueError                                Traceback (most recent call last)
<ipython-input-41-7ab0d7765f8c> in <module>()
      3 
      4 h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
----> 5 h_pool2 = max_pool_2x2(h_conv2)

ValueError: ('filter must not be larger than the input: ', 'Filter: [', Dimension(2), 'x', Dimension(2), '] ', 'Input: [', Dimension(1), 'x', Dimension(4), '] ')

Только для некоторой справочной информации, с которой я имею дело, является CSV файл, в котором каждая строка содержит 10 функций и 1 пустой столбец, который может быть 1 или 0. То, что я пытаюсь получить, - это вероятность в пустом столбце, что столбец будет равен 1.

4b9b3361

Ответ 1

Вы должны сформировать вход, чтобы он был совместим как с тензором обучения, так и с выходом. Если вы вводите длину 1, ваш выход должен быть длиной 1 (длина заменяется размером).

Когда вы имеете дело с -

def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def max_pool_2x2(x):
    return tf.nn.max_pool(x, ksize=[1, 1, 1, 1],
                    strides=[1, 1, 1, 1], padding='SAME')

Обратите внимание, как я изменил шаги, а ksize - на [1, 1, 1, 1]. Это будет соответствовать выходному сигналу на одномерный вход и предотвратит ошибки в дороге.

Когда вы определяете свою весовую переменную (см. код ниже) -

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)

def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

вам нужно будет сделать первые 2 числа соответствующими тензору характеристик, которые вы используете для обучения вашей модели, последние два числа будут измерением прогнозируемого выхода (так же, как и размерность ввода).

W_conv1 = weight_variable([1, 10, 1, 1])
b_conv1 = bias_variable([1])

Обратите внимание на [1, 10, в начале, что означает, что тензор характеристик будет тензором функции 1x10; последние два числа 1, 1] соответствуют размерам входных и выходных тензоров/предикторов.

Когда вы изменяете тензор x_foo (я называю его x_ [x prime]), вы по какой-то причине должны определить его так:

x_ = tf.reshape(x, [-1,1,10,1])

Обратите внимание на 1 и 10 в середине < <27 > . И снова эти числа соответствуют размерности вашего тензора характеристик.

Для каждой переменной смещения вы выбираете конечное число ранее определенной переменной. Например, если W_conv1 = weight_variable([1, 10, 1, 1]) появляется так, вы берете конечный номер и помещаете его в переменную смещения, чтобы он мог соответствовать размерам ввода. Это делается так: b_conv1 = bias_variable([1]).

Если вам нужно больше объяснений, прокомментируйте ниже.

Ответ 2

Размеры, которые вы используете для фильтра, не соответствуют выходу скрытого слоя.

Позвольте мне посмотреть, понял ли я вас: ваш вход состоит из 8 функций, и вы хотите переделать его в матрицу 2x4, правильно?

Весы, созданные с помощью weight_variable([1, 8, 1, 4]), ожидают вход 1x8 в одном канале и выдают 1x8 выход в 4-х каналах (или скрытых единицах). Фильтр, который вы используете, выполняет поиск в квадратах 2x2. Однако, поскольку результат весов равен 1x8, они не будут совпадать.

Вы должны изменить форму ввода как

x_image = tf.reshape(tf_in, [-1,2,4,1])

Теперь ваш вход на самом деле 2x4 вместо 1x8. Затем вам нужно изменить форму веса на (2, 4, 1, hidden_units) для работы с выходом 2x4. Он также будет производить выход 2x4, и теперь может быть применен фильтр 2x2.

После этого фильтр будет соответствовать выходу весов. Также обратите внимание, что вам придется изменить форму вашей второй весовой матрицы на weight_variable([2, 4, hidden_units, hidden2_units])