Как добавить шаги предварительной обработки в TF Lite - PullRequest
0 голосов
/ 03 сентября 2018

Я использую простые данные радужной оболочки, которые имеют 4 функции. И я хочу сделать некоторые шаги предварительной обработки перед входом в сеть. Например, я хочу, чтобы мой NN получал только 3 функции, в среднем две последовательные оригинальные функции.

# x shape is 120 data x 4 features
tmp = np.zeros((x.shape[0],x.shape[1]-1))
for i in range(x.shape[1]-1):
    tmp[:,i] = (x[:,i]+x[:,i+1])/2.
x = deepcopy(tmp) # after preprocess its shape 120 x 3 features

Я попытался добавить эти шаги в input_function и изменить определение всей формы feature_columns на 3:

def input_function(x, y, is_train):

    tmp = np.zeros((x.shape[0],x.shape[1]-1))
    for i in range(x.shape[1]-1):
        tmp[:,i] = (x[:,i]+x[:,i+1])/2.
    x = deepcopy(tmp)

    dict_x = { "thisisinput" : x }

    dataset = tf.data.Dataset.from_tensor_slices((
        dict_x, y
    ))

    if is_train:
        dataset = dataset.shuffle(num_train).repeat(num_epoch).batch(num_train)
    else:   
        dataset = dataset.batch(num_test)

    return dataset

способ обучения классификатора:

feature_columns = [
    tf.feature_column.numeric_column(key="featurename",shape=3),
]

classifier = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[50, 20],
    n_classes=3,
    optimizer=tf.train.GradientDescentOptimizer(0.001),
    activation_fn=tf.nn.relu,
    model_dir = 'modeliris2/'
)

classifier.train(
    input_fn=lambda:input_function(xtrain, ytrain, True)
)

функция ввода моего обслуживания:

def my_serving_input_fn2():
    input_data = {
        "featurename" : tf.placeholder(tf.float32, [None, 3], name='inputtensors')
    }
    return tf.estimator.export.ServingInputReceiver(input_data, input_data)

Он работает, когда я запускаю его, но если я замораживаю модель, а затем использую ее для прогнозирования, она не работает. он сказал:

ValueError: Невозможно передать значение формы (1, 4) для Tensor 'import / inputtensors: 0', который имеет форму '(?, 3)'

Если я изменю feature_columns на my_serving_input_fn на [Нет, 4], после зависания модели все равно будет ошибка:

InvalidArgumentError (см. Выше для отслеживания): вход для изменения формы является тензор с 4 значениями, но запрошенная форма имеет 3

Мой вопрос, если мне нужно включить какие-либо этапы предварительной обработки или разработки функций (например, MFCC в предварительную обработку сигналов и т. Д.) В мою модель, куда мне ее поместить? Мой подход правильный? почему произошла ошибка? или есть лучшее решение?

и дополнительный вопрос: что, если на моих этапах предварительной обработки мне нужно включить внешние файлы (например, список стоп-слов в предварительной обработке текста и т. Д.), Все еще возможно включить эти файлы для предварительной обработки с использованием TF lite?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Технически вы можете поставить шаг предварительной обработки в двух местах. Я буду использовать tflite в качестве примера.

  1. предварительная обработка вне модели. Это означает, что в вашем драйвере есть mfcc:

    model = new model(CNN, RNN, ...)
    while(stream) {
       energy = mfcc(audio)
       model.invoke(energy)
    }
    
  2. Если этап предварительной обработки уже является операционным (обычно это не ...), вы можете включить операционное поле в свою модель:

    model = new model(MFCC, CNN, RNN, ...)
    while(stream) {
        model.invoke(audio)
    }
    

При этом вариант 1 наиболее доступен. Надеюсь, это поможет.

0 голосов
/ 08 февраля 2019

В этом случае предварительная обработка происходит в python. Таким образом, вы сможете использовать любые примитивы python, если вы вызываете граф TF Lite в python.

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