Я пытался переписать простой классификатор с помощью CNTK. Но все примеры, с которыми я сталкивался, используют встроенный Reader с входной картой, и мои данные должны быть сильно изменены после прочтения, чтобы я не смог использовать то, что демонстрирует большинство примеров, в качестве метода загрузки данных. Я сталкивался с кодом на здесь , который, кажется, показывает, как использовать прямые np-массивы для обучения, но на самом деле он ничего не тренирует.
Минимальный рабочий пример, показывающий проблему:
import cntk as C
import numpy as np
from cntk.ops import relu
from cntk.layers import Dense, Convolution2D
outputs = 10
input_var = C.input_variable((7, 19, 19), name='features')
label_var = C.input_variable((outputs))
epochs = 20
minibatchSize = 100
cc = C.layers.Convolution2D((3,3), 64, activation=relu)(input_var)
net = C.layers.Dense(outputs)(cc)
loss = C.cross_entropy_with_softmax(net, label_var)
learner = C.adam(net.parameters, 0.0018, 0.9, minibatch_size=minibatchSize)
progressPrinter = C.logging.ProgressPrinter(tag='Training', num_epochs=epochs)
for i in range(epochs):
X = np.zeros((minibatchSize, 7, 19, 19), dtype=np.float32)
Y = np.ones((minibatchSize, outputs), dtype=np.float32)
train_summary = loss.train((X, Y), parameter_learners=[learner], callbacks=[progressPrinter])
Пример вывода:
Learning rate per 100 samples: 0.0018
Finished Epoch[1 of 20]: [Training] loss = 2.302410 * 100, metric = 0.00% * 100 0.835s (119.8 samples/s);
Finished Epoch[2 of 20]: [Training] loss = 0.000000 * 0, metric = 0.00% * 0 0.003s ( 0.0 samples/s);
Finished Epoch[3 of 20]: [Training] loss = 0.000000 * 0, metric = 0.00% * 0 0.001s ( 0.0 samples/s);
Возможно, есть действительно очевидная причина, по которой это происходит, но я не смог понять это. Любые идеи о том, как это исправить, будут высоко оценены!