Передача обучения с помощью CNTK и предварительно обученной модели ONNX дает сбой - PullRequest
2 голосов
/ 16 мая 2019

Я пытаюсь использовать модель ResNet-50 из зоопарка модели ONNX , загружать и обучать ее в CNTK для задачи классификации изображений. Первое, что меня смущает, это то, что ось партии (не знаю, как ее официальное название, динамическая ось?) Установлена ​​в 1 в этой модели:

Почему это? Разве это не может быть просто [3x224x224]? Например, в этой модели вход выглядит так:

enter image description here

Чтобы загрузить модель и использовать свой собственный плотный слой, я использую следующий код:

def create_model(num_classes, input_features, freeze=False):
    base_model = load_model("restnet-50.onnx", format=ModelFormat.ONNX)
    feature_node = find_by_name(base_model, "gpu_0/data_0")
    last_node = find_by_uid(base_model, "Reshape2959")

    substitutions = {
        feature_node : placeholder(name='new_input')
    }

    cloned_layers = last_node.clone(CloneMethod.clone, substitutions)
    cloned_out = cloned_layers(input_features)
    z = Dense(num_classes, activation=softmax, name="prediction") (cloned_out)
    return z

Для обучения я использую (сокращенно):

# datasets = list of classes
feature = input_variable(shape=(1, 3, 224, 224))
label = input_variable(shape=(1,3))
model = create_model(len(datasets), feature)
loss = cross_entropy_with_softmax(model, label)

# some definitions for learner, epochs, ProgressPrinters missing

for epoch in range(epochs):
    loss.train((X_current,y_current), parameter_learners=[learner], callbacks=[progress_printer])

X_current - это одиночное изображение, а y_current - соответствующая метка класса, закодированная в виде массивов со следующими формами

X_current.shape
(1, 3, 224, 224)

y_current.shape
(1, 3)

Когда я пытаюсь тренировать модель, я получаю

«Ошибка ValueEr: ToBatchAxis7504 Операция ToBatchAxisNode может работать только для тензора без данных мини-пакета (без макета)»

Что здесь не так?

...