Какую структуру должны иметь данные ускорителя для прогнозирования модели? - PullRequest
1 голос
/ 20 октября 2019

Я создал модель Keras, которую я преобразовал в TensorFlow, а затем преобразовал в TensorFlow lite. Я хочу использовать свою модель TFLite для прогнозирования человеческой деятельности с помощью сигнала ускорителя с мобильного телефона. Вот последовательность моей модели:

N_FEATURES = 3
PERIOD = 80


model = Sequential()
model.add(Reshape((const.PERIOD, const.N_FEATURES), input_shape=(const.PERIOD * const.N_FEATURES,)))
model.add(Conv1D(100, 10, activation='relu', input_shape=(const.PERIOD, const.N_FEATURES)))
model.add(Conv1D(100, 10, activation='relu'))
model.add(MaxPooling1D(const.N_FEATURES))
model.add(Conv1D(160, 10, activation='relu'))
model.add(Conv1D(160, 10, activation='relu'))
model.add(Flatten())
model.add(Dropout(0.2))
model.add(Dense(7, activation='softmax'))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])


x_test.shape = (12369, 240)
y_test.shape = (12369, 7)
x_train.shape = (49476, 240)
y_train.shape = (49476, 7)

Я хочу спросить о форме данных, которые мне нужно передать модели в приложении для Android, чтобы предсказать активность. Я использую функцию Interpreter.runForMultipleInputsOutputs. Мне нужно использовать массив с тремя списками? Каждый из них должен иметь данные от одной оси от ускорителя (x, y и z), или мне нужно создать что-то еще?

Это моя первая модель, поэтому любые другие советы приветствуются.

Редактировать:

        List<Sample> samples = collector.getSamples();
        float[][] floatInputBuffer = new float[200][3];

        for(int i = 0; i < 200; i++) {
            floatInputBuffer[i][0] = samples.get(i).getX();
            floatInputBuffer[i][1] = samples.get(i).getY();
            floatInputBuffer[i][2] = samples.get(i).getZ();
        }

        Object[] inputArray = {floatInputBuffer, new int[]{5000}};
        Map<Integer, Object> outputMap = new HashMap<>();
        outputMap.put(0, new float[1][labels.size()]);
        Interpreter interpeter = null;
        try {
            interpeter = new Interpreter(loadModel(getAssets(), MODEL_PATH.split("file:///android_asset/", -1)[1]));
        } catch (IOException e) {
            e.printStackTrace();
        }

        interpeter.runForMultipleInputsOutputs(inputArray, outputMap);

Ответы [ 2 ]

0 голосов
/ 20 октября 2019

Какой бы размер ввода не использовался при обучении вашей модели, вы должны отправлять входные данные одинакового размера (за исключением размера пакета), когда вы выполняете вывод с использованием Интерпретатора. Если бы вы использовали метод run в вашем интерпретаторе, то вы могли бы передать только один вход, но, поскольку вы используете runForMultipleInputsOutputs, вы можете объединить свои данные вместе и затем отправить их.

ТакВаша модель имеет входную форму (const.PERIOD * const.N_FEATURES). Я считаю, что это продукт 240. Таким образом, ваш вклад в модель TFLite должен иметь форму (<<No. of inputs>>, 240).

0 голосов
/ 20 октября 2019

Вам нужен массив в виде (examples_, time_frames, dimensions_x_y_z)

Он уже определен в вашей модели с input_shape=(const.PERIOD, const.N_FEATURES).

Итак, (examples, const.PERIOD, const.N_FEATURES) - это ваш формат данных.

...