Как определить весовой размер для входного тензора ранга-3? - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь сконструировать автоматический кодер для классификации активности для 3-канального ввода (данные трехосного акселерометра).

Входной тензор имеет форму [None,200,3] ([Размер партии, размер окна, количество каналов]), и на первом уровне я хочу просто уменьшить размер входного слоя до [None,150,3]. Вот код для создания заполнителей и первого слоя:

import tensorflow as tf

def denseLayer(inputVal,weight,bias):
    return tf.nn.relu((tf.matmul(inputVal,weight)+bias))


x = tf.placeholder(dtype=tf.float32,shape=[None,200,3]) #Input tensor
wIn = tf.get_variable(name='wIn',initializer=tf.truncated_normal(stddev=0.1,dtype=tf.float32,shape=[200,150]))

bIn = tf.get_variable(name='bIn',initializer=tf.constant(value = 0.1,shape=[150,3],dtype=tf.float32))


firstLayer = denseLayer(x,weight=wIn,bias=bIn)

Этот код, конечно, приведет к ошибке (из-за разницы в ранге между x и wIn), и я не могу определить форму wIn переменной для получить желаемую форму firstLayer, то есть [None,150,3].

Вот как должна выглядеть конечная сеть (упрощенная версия с меньшими слоями): Autoencoder

1 Ответ

0 голосов
/ 23 января 2019

Я думаю, что это то, что вы хотите:

import tensorflow as tf

def denseLayer(inputVal, weight, bias):
    # Each input "channel" uses the corresponding set of weights
    value = tf.einsum('nic,ijc->njc', inputVal, weight) + bias
    return tf.nn.relu(value)
#Input tensor
x = tf.placeholder(dtype=tf.float32, shape=[None, 200, 3])
# Weights and biases have three "channels" each
wIn = tf.get_variable(name='wIn',
                      shape=[200, 150, 3],
                      initializer=tf.truncated_normal_initializer(stddev=0.1))
bIn = tf.get_variable(name='bIn',
                      shape=[150, 3],
                      initializer=tf.constant_initializer(value=0.1))
firstLayer = denseLayer(x, weight=wIn, bias=bIn)
print(firstLayer)
# Tensor("Relu:0", shape=(?, 150, 3), dtype=float32)

Здесь wIn можно рассматривать как три набора [200, 150] параметров, которые применяются к каждому входному каналу. Я думаю, tf.einsum - самый простой способ реализовать это в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...