Hook up a dataset importer for training the AIs, but it's untested.

Also, we don't have any code that actually does the training itself 
either yet.
This commit is contained in:
Starbeamrainbowlabs 2019-07-17 15:15:31 +01:00
parent f7e2d77daa
commit 6dbb6c3b87
6 changed files with 90 additions and 4 deletions

16
server/Helpers/Math.mjs Normal file
View file

@ -0,0 +1,16 @@
"use strict";
function normalise(value, { min : input_min, max: input_max }, { min : output_min, max: output_max }) {
return (
((value - input_min) / (input_max - input_min)) * (output_max - output_min)
) + output_min
}
function clamp(value, min, max) {
if(value > max) return max;
if(value < min) return min;
return value;
}
export { normalise, clamp };

View file

@ -23,6 +23,18 @@ class RSSIRepo {
} }
} }
iterate_gateway(gateway_id) {
return this.db.prepare(`SELECT
rssis.*,
readings.latitude,
readings.longitude
FROM rssis
JOIN readings ON rssis.gateway_id = readings.id
WHERE gateway_id = :gateway_id`).iterate({
gateway_id
});
}
iterate() { iterate() {
return this.db.prepare(`SELECT * FROM rssis`).iterate(); return this.db.prepare(`SELECT * FROM rssis`).iterate();
} }

View file

@ -13,6 +13,9 @@ import MessageHandler from '../ttn-app-server/MessageHandler.mjs';
import DataProcessor from '../process-data/DataProcessor.mjs'; import DataProcessor from '../process-data/DataProcessor.mjs';
import AITrainer from '../train-ai/AITrainer.mjs';
import DatasetFetcher from '../train-ai/DatasetFetcher.mjs';
import settings from './settings.mjs'; import settings from './settings.mjs';
import database_init from '../bootstrap/database_init.mjs'; import database_init from '../bootstrap/database_init.mjs';
@ -31,7 +34,11 @@ export default async function setup() {
database: a.asFunction(database_init).singleton(), database: a.asFunction(database_init).singleton(),
TTNAppServer: a.asClass(TTNAppServer), TTNAppServer: a.asClass(TTNAppServer),
MessageHandler: a.asClass(MessageHandler), MessageHandler: a.asClass(MessageHandler),
DataProcessor: a.asClass(DataProcessor)
DataProcessor: a.asClass(DataProcessor),
AITrainer: a.asClass(AITrainer),
DatasetTrainer: a.asClass(DatasetTrainer)
}); });
// Enable / disable colourising the output // Enable / disable colourising the output

View file

@ -54,6 +54,11 @@ devices = [
[ai] [ai]
# Settings relating to the training of the AI. Note that a number of these settings can also be specified by environment variables, to aid with fiddling with the parameters to find the right settings. # Settings relating to the training of the AI. Note that a number of these settings can also be specified by environment variables, to aid with fiddling with the parameters to find the right settings.
# Min / max dataset values when training the AI, since neural networks only take values between 0 and 1.
# Note that changing these means that you've got to retrain the AIs all over again!
rssi_min = -150
rssi_max = 0
[logging] [logging]
# The format the date displayed when logging things should take. # The format the date displayed when logging things should take.
# Allowed values: relative (e.g like when a Linux machine boots), absolute (e.g. like Nginx server logs), none (omits it entirely)) # Allowed values: relative (e.g like when a Linux machine boots), absolute (e.g. like Nginx server logs), none (omits it entirely))

View file

@ -3,8 +3,10 @@
import tf from '@tensorflow/tfjs-node-gpu'; import tf from '@tensorflow/tfjs-node-gpu';
class AITrainer { class AITrainer {
constructor({ settings }) { constructor({ settings, GatewayRepo, DatasetFetcher }) {
this.settings = settings; this.settings = settings;
this.dataset_fetcher = DatasetFetcher;
this.repo_gateway = GatewayRepo;
this.model = this.generate_model(); this.model = this.generate_model();
} }
@ -29,8 +31,15 @@ class AITrainer {
return model; return model;
} }
train() { async train() {
for(let gateway of this.repo_gateway.iterate()) {
let dataset = this.dataset_fetcher.fetch(gateway.id);
await this.train_dataset(dataset);
}
}
async train_dataset(dataset) {
// TODO: Fill this in
} }
} }

View file

@ -0,0 +1,37 @@
"use strict";
import { normalise, clamp } from '../Helpers/Math.mjs';
class DatasetFetcher {
constructor({ settings, RSSIRepo }) {
this.settings = settings;
this.repo_rssi = RSSIRepo;
}
fetch(gateway_id) {
let result = [];
for(let rssi of this.repo_rssi.iterate_gateway(gateway_id) {
result.push({
input: [
normalise(rssi.latitude,
{ min: -90, max: +90 },
{ min: 0, max: 1 }
),
normalise(rssi.longitude,
{ min: -180, max: +180 },
{ min: 0, max: 1 }
)
],
output: [
clamp(normalise(rssis.rssi,
{ min: this.settings.ai.rssi_min, max: this.settings.ai.rssi_max },
{ min: 0, max: 1 }
), 0, 1)
]
});
}
return result;
}
}
export default DatasetFetcher;