Tensorflow .NET Аппроксимация логической функции
Данный пример генерирует и обучает небольшую нейронную сеть с помощью Tensorflow Keras API:
NDArray trainSet = np.array(trainSetArr);
NDArray labels = np.array(lablesArr);
NDArray testSet = np.array(testSetArr);
NDArray testLabels = np.array(testLablesArr);
Tensor inputs = keras.Input(new Shape(4));
LayersApi layers = new LayersApi();
Tensor outputs = layers.Dense(12, keras.activations.Relu).Apply(inputs);
outputs = layers.Dense(17, keras.activations.Relu).Apply(outputs);
outputs = layers.Dense(1, keras.activations.Relu).Apply(outputs);
Functional model = keras.Model(inputs, outputs);
model.compile(optimizer: keras.optimizers.SGD(0.1f), loss: keras.losses.MeanSquaredError(), metrics: new string[] { "accuracy" });
model.fit(trainSet, labels, epochs: 200);
Tensor tensor = model.Apply(testSet);
Console.WriteLine(tensor);
Ставилась задача аппроксимации логической функции.
Таблица истинности:
a b c d F
-------------
0 0 0 0 0
0 0 0 1 0
0 0 1 0 0
0 0 1 1 0
0 1 0 0 1
0 1 0 1 1
0 1 1 0 0
0 1 1 1 0
1 0 0 0 0
1 0 0 1 1
1 0 1 0 0
1 0 1 1 1
1 1 0 0 1
1 1 0 1 1
1 1 1 0 0
1 1 1 1 1
Первые 12 значений использовались для обучения и 4 последних для теста. Результат получился такой:
То есть сеть обучилась успешно. Последние 4 правильных значения это 1 1 0 1, что и было предсказано сетью.
У меня есть несколько вопросов по работе с данной платформой в .NET.
Каким образом я могу использовать, например, LeakyReLU в качестве функции активации?
keras.activationsпредоставляет очень скудный набор функций активаций.Нет возможности для начальной инициализации весовых коэффициентов. Бывает сеть просто не начинает обучаться и ошибка не уменьшается.
keras.optimizers.SGDне позволяет задать много гиперпараметров (например momentum). Как это можно настроить?Метод
model.fitимеет параметрbatch_size, который, как я понимаю, нужен при обучении в пакетном режиме и определяет количество элементов в обучающей выборке?
Ответы (1 шт):
Wrapper это не всегда лучший вариант.Так как оригинальная библиотека может обновляться и расширятся намного быстрее чем враппер. Поэтому могу посоветовать вам строить и обучать в python и там же конвертировать в onnx формат, а потом легко импортировать в .net.
Так как это враппер над питоновским Keras, не все методы и объекты повторяет оригинальную библиотеку. Почитав на github классы этой библиотеке
1)Написать свой метод расширения для активации.
3)Метод SGD все таки имеет такой параметр
public SGD(float lr = 0.01f, float momentum = 0.0f, float decay = 0.0f, bool nesterov = false)
4)Да,вы правильно понимаете.
Надеюсь чем то помог или навел на какие-то идеи
