-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfashion-script_exercise.js
156 lines (125 loc) · 5.32 KB
/
fashion-script_exercise.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import {FMnistData} from './fashion-data.js';
var canvas, ctx, saveButton, clearButton;
var pos = {x:0, y:0};
var rawImage;
var model;
function getModel() {
// In the space below create a convolutional neural network that can classify the
// images of articles of clothing in the Fashion MNIST dataset. Your convolutional
// neural network should only use the following layers: conv2d, maxPooling2d,
// flatten, and dense. Since the Fashion MNIST has 10 classes, your output layer
// should have 10 units and a softmax activation function. You are free to use as
// many layers, filters, and neurons as you like.
// HINT: Take a look at the MNIST example.
model = tf.sequential();
model.add(tf.layers.conv2d({inputShape:[28,28,1],kernelSize:3,filters:16,padding:"same",activation:'relu'}));
model.add(tf.layers.maxPooling2d({poolSize:[2, 2]}));
model.add(tf.layers.conv2d({kernelSize:3,filters:32,padding:"same",activation:'relu'}));
model.add(tf.layers.maxPooling2d({poolSize:[2,2]}));
model.add(tf.layers.conv2d({kernelSize:3,filters:64,padding:"same",activation:'relu'}));
model.add(tf.layers.maxPooling2d({poolSize:[2,2]}));
model.add(tf.layers.flatten());
model.add(tf.layers.dense({units: 128, activation: 'relu'}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));
// Compile the model using the categoricalCrossentropy loss,
// the tf.train.adam() optimizer, and accuracy for your metrics.
model.compile({loss:'categoricalCrossentropy',optimizer:tf.train.adam(),metrics:['accuracy']});
return model;
}
async function train(model, data) {
// Set the following metrics for the callback: 'loss', 'val_loss', 'accuracy', 'val_accuracy'.
const metrics = ['loss','val_loss','accuracy','val_accuracy'];
// Create the container for the callback. Set the name to 'Model Training' and
// use a height of 1000px for the styles.
const container = {name:"Model Training",styles:{height:"1000px"}};
// Use tfvis.show.fitCallbacks() to setup the callbacks.
// Use the container and metrics defined above as the parameters.
const fitCallbacks = tfvis.show.fitCallbacks(container,metrics);
const BATCH_SIZE = 512;
const TRAIN_DATA_SIZE = 6000;
const TEST_DATA_SIZE = 1000;
// Get the training batches and resize them. Remember to put your code
// inside a tf.tidy() clause to clean up all the intermediate tensors.
// HINT: Take a look at the MNIST example.
const [trainXs, trainYs] = tf.tidy(()=>{
const d=data.nextTrainBatch(TRAIN_DATA_SIZE);
return[
d.xs.reshape([TRAIN_DATA_SIZE,28,28,1]),
d.labels
];
});
// Get the testing batches and resize them. Remember to put your code
// inside a tf.tidy() clause to clean up all the intermediate tensors.
// HINT: Take a look at the MNIST example.
const [testXs, testYs] = tf.tidy(()=>{
const d=data.nextTrainBatch(TEST_DATA_SIZE);
return[
d.xs.reshape([TEST_DATA_SIZE,28,28,1]),
d.labels
];
});
return model.fit(trainXs, trainYs, {
batchSize: BATCH_SIZE,
validationData: [testXs, testYs],
epochs: 10,
shuffle: true,
callbacks: fitCallbacks
});
}
function setPosition(e){
pos.x = e.clientX-100;
pos.y = e.clientY-100;
}
function draw(e) {
if(e.buttons!=1) return;
ctx.beginPath();
ctx.lineWidth = 24;
ctx.lineCap = 'round';
ctx.strokeStyle = 'white';
ctx.moveTo(pos.x, pos.y);
setPosition(e);
ctx.lineTo(pos.x, pos.y);
ctx.stroke();
rawImage.src = canvas.toDataURL('image/png');
}
function erase() {
ctx.fillStyle = "black";
ctx.fillRect(0,0,280,280);
}
function save() {
var raw = tf.browser.fromPixels(rawImage,1);
var resized = tf.image.resizeBilinear(raw, [28,28]);
var tensor = resized.expandDims(0);
var prediction = model.predict(tensor);
var pIndex = tf.argMax(prediction, 1).dataSync();
var classNames = ["T-shirt/top", "Trouser", "Pullover",
"Dress", "Coat", "Sandal", "Shirt",
"Sneaker", "Bag", "Ankle boot"];
alert(classNames[pIndex]);
}
function init() {
canvas = document.getElementById('canvas');
rawImage = document.getElementById('canvasimg');
ctx = canvas.getContext("2d");
ctx.fillStyle = "black";
ctx.fillRect(0,0,280,280);
canvas.addEventListener("mousemove", draw);
canvas.addEventListener("mousedown", setPosition);
canvas.addEventListener("mouseenter", setPosition);
saveButton = document.getElementById('sb');
saveButton.addEventListener("click", save);
clearButton = document.getElementById('cb');
clearButton.addEventListener("click", erase);
}
async function run() {
const data = new FMnistData();
await data.load();
const model = getModel();
tfvis.show.modelSummary({name: 'Model Architecture'}, model);
await train(model, data);
//await model.save('downloads://my_model');
init();
alert("Training is done, try classifying your drawings!");
}
document.addEventListener('DOMContentLoaded', run);
//to check the errors use the console in chrome more tools->developer tools->console or by pressing ctrl+shift+I