#javascript #tensorflow #tensorflow.js
#javascript #tensorflow #tensorflow.js
Вопрос:
Я прогуглил все версии вопроса, которые мог придумать, но, хоть убейте, я не могу найти ни одного базового примера tensorflow.js обучение tf.browser.fromPixels (изображение) для получения результата «да» или «нет». Все примеры, которые я смог найти, начинаются с предварительно обученных сетей.
Я создал базу данных из изображений размером 25×25 пикселей и сохранил их все в виде холстов в переменной типа:
let data = {
t: [canvas1, canvas2, canvas3, ... canvas3000 ....],
f: [canvas1, canvas2, ... and so on ...]
}
И я думаю, что должно быть тривиально сделать что-то вроде:
data.t.forEach(canvas => {
const xs = tf.browser.fromPixels(canvas);
const ys = tf.tensor([1]); // output 1, since this canvas is from the `t` (true) dataset
model.fit(xs, ys, {
batchSize: 1,
epochs: 1000
});
});
data.f.forEach(canvas => {
const xs = tf.browser.fromPixels(canvas);
const ys = tf.tensor([0]); // output 0, since this canvas is from the `f` (false) dataset
model.fit(xs, ys, {
batchSize: 1,
epochs: 1000
});
});
model.predict(tf.browser.fromPixels(data.t[0])).print(); // -> [1]
model.predict(tf.browser.fromPixels(data.t[1])).print(); // -> [1]
model.predict(tf.browser.fromPixels(data.t[2])).print(); // -> [1]
model.predict(tf.browser.fromPixels(data.f[0])).print(); // -> [0]
model.predict(tf.browser.fromPixels(data.f[1])).print(); // -> [0]
model.predict(tf.browser.fromPixels(data.f[2])).print(); // -> [0]
Но специфика, такая как inputShape
и различные мелкие детали, будучи новыми для TF, делают попытку выполнить это без возможности найти базовый пример довольно болезненной кривой обучения. Как бы выглядело действительное представление этой функции обучения? Вот код на данный момент:
// Just imagine DataSet builds a large data set like described in my
// question and calls a callpack function with the data variable as
// its only argument, full of pre-categorized images. Since my database
// of images is locally stored, I cant really produce an example here
// that works fully, but this gets the idea across at least.
new DataSet(
data => {
const model = tf.sequential();
model.add(
// And yes, I realize I would want a convolutional layer,
// some max pooling, filtering, etc, but I'm trying to start simple
tf.layers.dense({
units: [1],
inputShape: [25, 25, 3],
dataFormat: "channelsLast",
activation: "tanh"
})
);
model.compile({optimizer: "sgd", loss: "binaryCrossentropy", lr: 0.1});
data.t.forEach(canvas => {
const xs = tf.browser.fromPixels(canvas);
const ys = tf.tensor([1]); // output 1, since this canvas is
// from the `t` (true) dataset
model.fit(xs, ys, {
batchSize: 1,
epochs: 1000
});
});
data.f.forEach(canvas => {
const xs = tf.browser.fromPixels(canvas);
const ys = tf.tensor([0]); // output 0, since this canvas is
// from the `f` (false) dataset
model.fit(xs, ys, {
batchSize: 1,
epochs: 1000
});
});
model.predict(tf.browser.fromPixels(data.t[0])).print(); // -> [1]
model.predict(tf.browser.fromPixels(data.t[1])).print(); // -> [1]
model.predict(tf.browser.fromPixels(data.t[2])).print(); // -> [1]
model.predict(tf.browser.fromPixels(data.f[0])).print(); // -> [0]
model.predict(tf.browser.fromPixels(data.f[1])).print(); // -> [0]
model.predict(tf.browser.fromPixels(data.f[2])).print(); // -> [0]
},
{canvas: true}
);
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.0/dist/tf.min.js"></script>
Ответ №1:
У вас есть только один слой для вашей модели. Вам нужно больше слоев, чем это. Существует множество руководств, которым вы можете следовать, чтобы создать классификатор для различения двух или более классов изображений. Вот это руководство на официальном веб-сайте tensorflow с использованием CNN.
Кроме того, вы можете увидеть, как использовать полностью подключенную нейронную сеть, используя этот фрагмент для построения классификатора, хотя точность может быть не такой хорошей, как у моделей CNN.