@modelx/model
Version:
Deep Learning Classification, LSTM Time Series, Regression and Multi-Layered Perceptrons with Tensorflow
171 lines (161 loc) • 7.75 kB
text/typescript
import { FeatureEmbedding, } from './index';
describe('static feature_embedding modules', () => {
it('should merge two arrays', () => {
const b = [0, 0, 0, 0];
const m = [1, 2];
const b1 = [0, 0, 0, 0];
const m1 = [];
const b2 = [0, 0];
const m2 = [5, 6, 7, 8];
const merged = FeatureEmbedding.getMergedArray(b, m);
const merged1 = FeatureEmbedding.getMergedArray(b1, m1);
const merged2 = FeatureEmbedding.getMergedArray(b2, m2);
const merged3 = FeatureEmbedding.getMergedArray(b2, m2, false, false);
expect(merged).toMatchObject([1, 2, 0, 0]);
expect(merged1).toMatchObject([0, 0, 0, 0]);
expect(merged2).toMatchObject([5, 6,]);
expect(merged3).toMatchObject([5, 6, 7, 8]);
});
});
const corpus = [
['prod1','prod2','prod1','prod3'],
['prod1','prod2'],
['prod3','prod2','prod3'],
['prod1','prod2','prod3','prod1'],
];
let FEModel;
let NewFEModel;
let ConvergedFEModel;
let EmbeddingData;
let NewEmbeddingData;
let ConvergedEmbeddingData;
describe('reloading model weights', () => {
beforeAll(async () => {
// const randomUni = tf.randomUniform([1, 100], -1, 1);
// randomUni.print()
FEModel = new FeatureEmbedding({
name: 'FEModel',
embedSize: 5,
fit: {
epochs: 30,
batchSize: 1,
callbacks: {
onTrainEnd: (logs: any) => console.log('FEModel onTrainEnd', { logs, }),
// onEpochBegin: (epoch: number, logs: any) => console.log('FEModel onEpochBegin', { logs, epoch, }),
}
},
});
await FEModel.train(corpus,[]);
// const FEweights = await FEModel.predict();
EmbeddingData = await FEModel.exportEmbeddings();
// const labeledFEWeights = FEModel.labelWeights(FEweights);
// console.log({ FEweights, labeledFEWeights });
// console.log('EmbeddingData', EmbeddingData);
NewFEModel = new FeatureEmbedding({
name: 'NewFEModel',
embedSize: 5,
fit: {
epochs: 30,
batchSize: 1,
callbacks: {
onTrainEnd: (logs: any) => console.log('NewFEModel onTrainEnd', { logs, }),
// onEpochBegin: (epoch: number, logs: any) => console.log('NewFEModel onEpochBegin', { logs, epoch, }),
}
},
});
await NewFEModel.importEmbeddings(EmbeddingData);
await NewFEModel.train(EmbeddingData.featureIds,[]);
NewEmbeddingData = await NewFEModel.exportEmbeddings();
ConvergedFEModel = new FeatureEmbedding({
name: 'ConvergedFEModel',
embedSize: 5,
fit: {
epochs: 50,
batchSize: 1,
callbacks: {
onTrainEnd: (logs: any) => console.log('ConvergedFEModel onTrainEnd', { logs, }),
// onEpochBegin: (epoch: number, logs: any) => console.log('ConvergedFEModel onEpochBegin', { logs, epoch, }),
}
},
});
await ConvergedFEModel.train(corpus, []);
ConvergedEmbeddingData = await ConvergedFEModel.exportEmbeddings();
});
it('should allow for embeddings to be reloaded', async () => {
const FEModelLoss = FEModel.loss;
const NewFEModelLoss = NewFEModel.loss;
const ConvergedFEModelLoss = ConvergedFEModel.loss;
// const reducedFEWeights = await FEModel.reduceWeights(Object.values(EmbeddingData.labeledWeights));
// const reducedNewFEWeights = await NewFEModel.reduceWeights(Object.values(NewEmbeddingData.labeledWeights));
// const reducedConvergedFEWeights = await ConvergedFEModel.reduceWeights(Object.values(ConvergedEmbeddingData.labeledWeights));
// const FESim = await FEModel.findSimilarFeatures([], { labeledWeights: EmbeddingData.labeledWeights, limit: 2, features: ['prod1'], });
// const NewFESim = await NewFEModel.findSimilarFeatures([], { labeledWeights: NewEmbeddingData.labeledWeights, limit: 2, features: ['prod1'], });
// const ConvergedFESim = await ConvergedFEModel.findSimilarFeatures([], { labeledWeights: ConvergedEmbeddingData.labeledWeights, limit: 2, features: ['prod1'], });
// console.log('FESim',FESim);
// console.log('NewFESim',NewFESim);
// console.log('ConvergedFESim',ConvergedFESim);
// console.log('reducedFEWeights',FEModel.labelWeights(reducedFEWeights));
// console.log('reducedNewFEWeights', NewFEModel.labelWeights(reducedNewFEWeights));
// console.log('reducedConvergedFEWeights', ConvergedFEModel.labelWeights(reducedConvergedFEWeights));
// console.log({ FEModelLoss, NewFEModelLoss, ConvergedFEModelLoss });
expect(ConvergedFEModelLoss).toBeLessThan(FEModelLoss);
// expect(ConvergedFEModelLoss).toBeLessThan(NewFEModelLoss);
});
it('should allow for adding more features', async () => {
let UpdatedModel = new FeatureEmbedding({
name: 'UpdatedModel',
embedSize: 5,
fit: {
epochs: 70,
batchSize: 1,
callbacks: {
onTrainEnd: (logs: any) => console.log('ConvergedFEModel onTrainEnd', { logs, }),
// onEpochBegin: (epoch: number, logs: any) => console.log('ConvergedFEModel onEpochBegin', { logs, epoch, }),
}
},
});
console.log('EmbeddingData', EmbeddingData);
await UpdatedModel.importEmbeddings({
...EmbeddingData,
inputMatrixFeatures: [
['prod4','prod1','prod4','prod1'],
['prod1','prod4','prod4','prod1'],
['prod3','prod4','prod5'],
]
});
// console.log('UpdatedModel.featureToId', UpdatedModel.featureToId);
// console.log('UpdatedModel.idToFeature', UpdatedModel.idToFeature);
// console.log('UpdatedModel.featureIds', UpdatedModel.featureIds);
// console.log('UpdatedModel.numberOfFeatures', UpdatedModel.numberOfFeatures);
// console.log('UpdatedModel.importedEmbeddings', UpdatedModel.importedEmbeddings);
await UpdatedModel.train([],[]);
const UpdatedEmbeddingData = await UpdatedModel.exportEmbeddings();
const UpdatedModelLoss = UpdatedModel.loss;
// const ConvergedFEModelLoss = ConvergedFEModel.loss;
// const reducedConvergedFEWeights = await ConvergedFEModel.reduceWeights(Object.values(ConvergedEmbeddingData.labeledWeights));
const reducedUpdatedReducedWeights = await UpdatedModel.reduceWeights(Object.values(UpdatedEmbeddingData.labeledWeights));
// const ConvergedFESim = await ConvergedFEModel.findSimilarFeatures([], { labeledWeights: ConvergedEmbeddingData.labeledWeights, limit: 2, features: ['prod1'], });
// const UpdatedSim = await UpdatedModel.findSimilarFeatures([], { labeledWeights: UpdatedEmbeddingData.labeledWeights, limit: 2, features: ['prod1'], });
// console.log('UpdatedSim',UpdatedSim);
// console.log('ConvergedFESim',ConvergedFESim);
console.log('reducedUpdatedReducedWeights', UpdatedModel.labelWeights(reducedUpdatedReducedWeights));
// console.log('reducedConvergedFEWeights', ConvergedFEModel.labelWeights(reducedConvergedFEWeights));
// console.log({ UpdatedModelLoss, ConvergedFEModelLoss });
// expect(reducedUpdatedReducedWeights).toHaveProperty('prop5');
expect(UpdatedModelLoss).toBeLessThan(2);
const moreData = [
['prod5', 'prod2', 'prod7', 'prod2'],
['prod2', 'prod5', 'prod7', 'prod2'],
['prod6', 'prod5', 'prod5'],
];
await UpdatedModel.importEmbeddings({
...UpdatedEmbeddingData,
inputMatrixFeatures: moreData
});
await UpdatedModel.train([],[]);
const UpdatedEmbeddingData2 = await UpdatedModel.exportEmbeddings();
const UpdatedModelLoss2 = UpdatedModel.loss;
// console.log({ UpdatedModelLoss2, UpdatedEmbeddingData2 });
expect(UpdatedModelLoss2).toBeLessThan(1);
});
})