Nano Hash - криптовалюты, майнинг, программирование

Сглаживание двух последних измерений тензора в TensorFlow

Я пытаюсь преобразовать тензор из [A, B, C, D] в [A, B, C * D] и передать его в dynamic_rnn. Предположим, что я заранее не знаю B, C и D (они являются результатом сверточной сети).

Думаю, в Theano такая переформовка выглядела бы так:

x = x.flatten(ndim=3)

Кажется, в TensorFlow нет простого способа сделать это и пока вот что у меня получилось:

x_shape = tf.shape(x)
x = tf.reshape(x, [batch_size, x_shape[1], tf.reduce_prod(x_shape[2:])]

Даже когда форма x известна во время построения графика (т.е. print(x.get_shape()) выводит абсолютные значения, например [10, 20, 30, 40] после изменения формы get_shape() становится [10, None, None]. Опять же, предположим, что исходная форма неизвестна, поэтому я не могу работать с абсолютными значениями.

И когда я передаю x в dynamic_rnn, это не удается:

ValueError: Input size (depth of inputs) must be accessible via shape inference, but saw value None.

Почему reshape не может справиться с этим делом? Как правильно воспроизвести flatten(ndim=n) Theano в TensorFlow с тензорами ранга 4 и выше?


Ответы:


1

Это не недостаток reshape, а ограничение tf.dynamic_rnn.

Ваш код для выравнивания последних двух измерений верен. И reshape тоже ведет себя правильно: если последние два измерения неизвестны, когда вы определяете операцию выравнивания, то их произведение тоже неизвестно, и None — единственное подходящее значение, которое может быть возвращено в это время.

Виновником является tf.dynamic_rnn, который ожидает полностью определенную форму элемента во время построения, т. е. должны быть известны все измерения, кроме первого (размер партии) и второго (временные шаги). Возможно, это немного прискорбно, но текущая реализация, похоже, не позволяет RNN с переменным количеством функций, а-ля FCN.

21.03.2018
  • Должны ли мы изменить название вопроса, следовательно? Потому что это больше не о том, как изменить форму, а о передаче частичного тензора в dynamic_rnn, верно? 23.06.2021

  • 2

    Я попробовал простой код в соответствии с вашими требованиями. Поскольку вы пытаетесь изменить форму вывода CNN, форма X такая же, как и на выходе CNN в Tensorflow.

    HEIGHT = 100
    WIDTH  = 200
    N_CHANELS =3
    
    N_HIDDEN =64
    
    X = tf.placeholder(tf.float32, shape=[None,HEIGHT,WIDTH,N_CHANELS],name='input') # output of CNN
    
    shape = X.get_shape().as_list() # get the shape of each dimention shape[0] =BATCH_SIZE , shape[1] = HEIGHT , shape[2] = HEIGHT = WIDTH , shape[3] = N_CHANELS
    
    input = tf.reshape(X, [-1, shape[1] , shape[2] * shape[3]])
    print(input.shape) # prints (?, 100, 600)
    
    #Input for tf.nn.dynamic_rnn should be in the shape of [BATCH_SIZE, N_TIMESTEPS, INPUT_SIZE]     
    
    #Therefore, according to the reshape N_TIMESTEPS = 100 and INPUT_SIZE= 600
    
    #create the RNN here
    lstm_layers = tf.contrib.rnn.BasicLSTMCell(N_HIDDEN, forget_bias=1.0)
    outputs, _ = tf.nn.dynamic_rnn(lstm_layers, input, dtype=tf.float32)
    

    Надеюсь это поможет.

    31.10.2017
  • Поправьте меня, если я что-то неправильно понял, но я прямо сказал, что исходная форма неизвестна, поэтому я не могу работать с абсолютными значениями, что вы делаете в shape[2] * shape[3]. 31.10.2017
  • Поправьте меня если я ошибаюсь. Таким образом, A — это размер пакета, который зависит от количества входных выборок при обучении модели. Следовательно, мы знаем только A во время обучения. Но выходные данные CNN зависят от входной формы, формы фильтра и количества выходных каналов и могут быть рассчитаны или проверены с помощью метода get_shape(). При этом B, C, D не должны быть равны None, как A. 31.10.2017
  • Вероятно, это было бы возможно, но потребовалось бы вычисление и жесткое кодирование множества значений только для выполнения довольно простого преобразования данных. Это то, чего я пытался избежать (и то, что Lasagne/Theano позволяет вам выполнить одной строкой кода). Основная часть основного вопроса по-прежнему заключается в том, почему reshape не может справиться с этим делом? 01.11.2017

  • 3

    Я нашел решение этой проблемы с помощью .get_shape(). Предполагая, что «x» является четырехмерным тензором.

    Это будет работать только с слоем изменения формы. Поскольку вы вносили изменения в архитектуру модели, это должно работать.

    x = tf.keras.layers.Reshape(x, [x.get_shape()[0], x.get_shape()[1], x.get_shape()[2] * x.get_shape()][3])
    

    Надеюсь, это сработает!

    21.04.2021
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

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