Гибкий вывод длины в сверточной модели CoreML - PullRequest
0 голосов
/ 24 февраля 2020

Я обучил сверточную модель с использованием Keras, которая принимает входные данные размера (None, 2) и производит выходные данные размера (None, 2). Затем я экспортировал модель как модель CoreML и импортировал ее в Swift. Однако, когда я использую модель для прогнозирования, используя ввод размера (N, 2), я все равно получаю вывод размера 2, где я ожидаю вывод размера (N, 2). Почему так и как я могу получить гибкую длину вывода?

Это мой код для обучения и экспорта модели:

# Create model
model = Sequential()
model.add(Conv1D((2), 3, padding='same', activation='relu', input_shape=(None,2)))

# Compile model
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])

...[Set up training and validation generators]...

# Fit model
model.fit_generator(t_gen, steps_per_epoch=t_spe, epochs=epochs, verbose=1, validation_data=v_gen, validation_steps=v_spe)

# Save model
coreml_model = coremltools.converters.keras.convert(model)
coreml_model.save('model.mlmodel')

spec = coremltools.utils.load_spec('model.mlmodel')
range = coremltools.models.neural_network.flexible_shape_utils.NeuralNetworkMultiArrayShapeRange()
range.add_channel_range((2, -1))   

coremltools.models.neural_network.flexible_shape_utils.update_multiarray_shape_range(spec, feature_name='input1', shape_range=range)
coremltools.models.neural_network.flexible_shape_utils.update_multiarray_shape_range(spec, feature_name='output1', shape_range=range)
coremltools.models.utils.save_spec(spec, 'model.mlmodel')

А это мой код для импорта и прогнозирования:

let mlModel = model.mlModel
let input:[Double] = [0.0,0.5,0,0,0.3,0]
var output:[Double] = []
do {
    let provider = PointProvider()
    provider.update(point: input)
    let outputProvider = try mlModel.prediction(from: provider)
    let result = outputProvider.featureValue(for: "output1")!.multiArrayValue!
    for i in 0..<result.count { output.append(result[i].doubleValue) }
    print(output)
} catch {
    print(error)
}

class PointProvider : MLFeatureProvider {
    var featureValues:[String:MLFeatureValue?] = [:]

    func update(point: [Double]) {
        featureValues["input1"] = makePointFeature(point: point)
    }

    func makePointFeature(point: [Double]) -> MLFeatureValue? {
        do {
            let m = try MLMultiArray(shape: [NSNumber(integerLiteral: point.count)], dataType: .double)
            for i in point.indices {
                m[i] = NSNumber(floatLiteral: point[i])
            }

            return MLFeatureValue(multiArray: m)
        } catch {
            print(error)
        }
        return nil
    }

    var featureNames: Set<String> {
        return Set(featureValues.keys)
    }

    func featureValue(for featureName: String) -> MLFeatureValue? {
        return featureValues[featureName] ?? nil
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...