Расширение контекста для речевых кадров в тензорном потоке или керасе - PullRequest
1 голос
/ 19 марта 2019

Предположим, у меня есть тензор формы [batch_size, T, d], где T - количество кадров для речевого файла, а d - размерность MFCC.Теперь я хотел бы расширить контекст для левого и правого фреймов, например, этой функции в numpy:

def make_context(feature, left, right):
'''
Takes a 2-D numpy feature array, and pads each frame with a specified
    number of frames on either side.
'''
    feature = [feature]
    for i in range(left):
        feature.append(numpy.vstack((feature[-1][0], feature[-1][:-1])))
    feature.reverse()
   for i in range(right):
       feature.append(numpy.vstack((feature[-1][1:], feature[-1][-1])))
   return numpy.hstack(feature)

Как реализовать эту функцию в tenorflow или keras?

1 Ответ

0 голосов
/ 20 марта 2019

Вы можете использовать tf.map_fn и tf.py_func для реализации этой функции в tenorflow.tf.map_fn может использоваться для обработки каждого элемента в пакете.tf.py_func может применить эту функцию к элементу.Например:

import tensorflow as tf
import numpy as np

def make_context(feature, left, right):
    feature = [feature]
    for i in range(left):
        feature.append(np.vstack((feature[-1][0], feature[-1][:-1])))
    feature.reverse()
    for i in range(right):
        feature.append(np.vstack((feature[-1][1:], feature[-1][-1])))
    return np.hstack(feature)

# numpy usage
feature = np.array([[1,2],[3,4],[5,6]])
print(make_context(feature, 2, 3))

# tensorflow usage
feature_tf = tf.placeholder(shape=(None,None,None),dtype=tf.float32)

result = tf.map_fn(lambda element: tf.py_func(lambda feature, left, right: make_context(feature, left, right)
                    ,[element,2,3]
                    ,tf.float32)
                    ,feature_tf,tf.float32)

with tf.Session() as sess:
    print(sess.run(result,feed_dict={feature_tf:np.array([feature,feature])}))

# print 
[[1 2 1 2 1 2 3 4 5 6 5 6]
 [1 2 1 2 3 4 5 6 5 6 5 6]
 [1 2 3 4 5 6 5 6 5 6 5 6]]

[[[1. 2. 1. 2. 1. 2. 3. 4. 5. 6. 5. 6.]
  [1. 2. 1. 2. 3. 4. 5. 6. 5. 6. 5. 6.]
  [1. 2. 3. 4. 5. 6. 5. 6. 5. 6. 5. 6.]]

 [[1. 2. 1. 2. 1. 2. 3. 4. 5. 6. 5. 6.]
  [1. 2. 1. 2. 3. 4. 5. 6. 5. 6. 5. 6.]
  [1. 2. 3. 4. 5. 6. 5. 6. 5. 6. 5. 6.]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...