diff --git a/C1_Browser-based-TF-JS/W1/assignment/C1_W1_Assignment.html b/C1_Browser-based-TF-JS/W1/assignment/C1_W1_Assignment.html index 023c6143..8f0a2fc6 100755 --- a/C1_Browser-based-TF-JS/W1/assignment/C1_W1_Assignment.html +++ b/C1_Browser-based-TF-JS/W1/assignment/C1_W1_Assignment.html @@ -11,6 +11,11 @@ // HINT: Remember that you are trying to build a classifier that // can predict from the data whether the diagnosis is malignant or benign. const trainingData = tf.data.csv(trainingUrl, { + columnConfigs: { + diagnosis: { + isLabel: true + } + } // YOUR CODE HERE @@ -21,7 +26,12 @@ // Therefore, there is no need to convert string labels into // a one-hot encoded array of label values like we did in the // Iris dataset example. - const convertedTrainingData = // YOUR CODE HERE + const convertedTrainingData = trainingData.map(({ xs, ys }) => { + return { + xs: Object.values(xs), + ys: Object.values(ys) + }; + }).batch(32); // YOUR CODE HERE const testingUrl = '/data/wdbc-test.csv'; @@ -30,7 +40,9 @@ // HINT: Remember that you are trying to build a classifier that // can predict from the data whether the diagnosis is malignant or benign. const testingData = tf.data.csv(testingUrl, { - + columnConfigs: { + diagnosis: { isLabel: true } + } // YOUR CODE HERE }); @@ -40,13 +52,18 @@ // Therefore, there is no need to convert string labels into // a one-hot encoded array of label values like we did in the // Iris dataset example. - const convertedTestingData = // YOUR CODE HERE + const convertedTestingData = testingData.map(({ xs, ys }) => { + return { + xs: Object.values(xs), + ys: Object.values(ys) + }; + }).batch(32); // YOUR CODE HERE // Specify the number of features in the space below. // HINT: You can get the number of features from the number of columns // and the number of labels in the training data. - const numOfFeatures = // YOUR CODE HERE + const numOfFeatures = (await trainingData.take(1).toArray())[0].xs.length; // YOUR CODE HERE // In the space below create a neural network that predicts 1 if the diagnosis is malignant @@ -58,28 +75,33 @@ // using ReLu activation functions where applicable. For this dataset only a few // hidden layers should be enough to get a high accuracy. const model = tf.sequential(); - - // YOUR CODE HERE + model.add(tf.layers.dense({ inputShape: [numOfFeatures], units: 16, activation: 'relu' })); + model.add(tf.layers.dense({ units: 8, activation: 'relu' })); + model.add(tf.layers.dense({ units: 1, activation: 'sigmoid' })); - - + // YOUR CODE HERE // Compile the model using the binaryCrossentropy loss, // the rmsprop optimizer, and accuracy for your metrics. - model.compile(// YOUR CODE HERE); + model.compile({ + optimizer: tf.optimizers.rmsprop(), + loss: 'binaryCrossentropy', + metrics: ['accuracy'] + }); + await model.fitDataset(convertedTrainingData, { + epochs: 100, + validationData: convertedTestingData, + callbacks: { + onEpochEnd: async(epoch, logs) => { + console.log("Epoch: " + epoch + " Loss: " + logs.loss + " Accuracy: " + logs.acc); + } + } + }); - await model.fitDataset(convertedTrainingData, - {epochs:100, - validationData: convertedTestingData, - callbacks:{ - onEpochEnd: async(epoch, logs) =>{ - console.log("Epoch: " + epoch + " Loss: " + logs.loss + " Accuracy: " + logs.acc); - } - }}); await model.save('downloads://my_model'); } run(); - \ No newline at end of file +