I don't know where you arrived from,
but if you didn't arrive from the previous videos
about training your own neural network,
you might feel a little bit lost because what I'm going to do
here entirely depends on the previous few videos
where I trained model to classify musical notes based
on mouse clicks in a P5 canvas.
So what I'm going to do in this video
is change this word from classification--
I'm going to do it right now-- to regression,
and this is going to drastically change
what the neural network outputs and how I use that output.
But before I start changing anything else in the code,
let me talk about what I mean by regression in the context
of machine learning.
First, let's recap classification.
The idea of classification is that the neural network
is going to receive some input and end up
with a discrete, categorical output,
meaning it's going to assign a label C, D, or E.
We can think of that as there's three light bulbs.
Are those like little drawings of light bulbs?
Each light bulb is associated with one of the possible labels
or categories, classifications.
And if the neural network decides
that this particular input corresponds to the label E,
then maybe this light bulb would light up.
And you could do this.
You could build an Arduino with some LEDs
and have the results of the machine learning classification
light up a particular LED.
A regression, you could think of the output
being a slider or maybe a dial.
As the data comes into the neural network,
the dial ends up at some value between some minimum
and maximum.
The output is numerical continuous output.
So classification is one of a discrete set of possibilities,
and regression is any value between a given range.
Now you can still have multiple outputs in a regression
because you can have multiple continuous values,
but in this case, I want to redo this example
by having a single output and that output
be the frequency value.
So if I change the task to regression,
now I want my output to be tied to a frequency.
No longer do I want during the training process
to give target labels.
I want to give target numbers so that it
will get the number as part of the regression output.
So this is my code for data collection.
When I click the mouse, the inputs are in x and y,
and the target is a target label.
But I don't want it to be a target label anymore.
I want it to be a frequency.
And I can figure out what that target frequency
is by looking it up in this particular JavaScript object.
So I can say let target frequency equal notes
target label, and in fact, that's
something that I'm already doing down here.
So let's replace this with target frequency.
Now, ordinarily, I might remove target label
completely as a variable in the system
because I don't need the label anymore
for the machine learning model, not using CDE and not
using the note name for training the model.
But while I'm collecting the data,
I still would like to see the note C or A or G
because I think that's less awkward than drawing
the frequency number in the window.
So crazily, I think I've actually
done with all that I need for the first two steps--
the first two steps being collect the data
and train the model.
I've changed the task to regression,
and now I obtained the output to a single output node that
just has a frequency value.
So I should be able to run all of the bits of code
that I did before and have a train the model.
Let's see if that works.
[MUSIC PLAYING]
All right, collected some data-- let's train the model.
And it worked.
I mean, it worked in the sense that I
didn't don't see any errors in the console,
and I see a nice graph with the loss going all the way down.
Incidentally, the lost went way down very, very quickly.
/ I probably don't need 200 epochs.
Maybe this regression problem is a little bit easier for it
to learn more accurately.
Who knows?
But it optimized very quickly.
So now that collecting data and training the model is done,
I need to just do that last stage of basically deploying
the model and making predictions with new data.
And I don't think this is going to work.
I haven't adjusted the code at all.
It's still looking for a label and all that.
So who knows what will happen.
First of all, it's writing the word frequency here and just
playing one particular note.
So let's go look at the prediction code
and see what need to adjust for a regression.
First thing is because we're no longer doing classification,
we shouldn't call model.classify with the given inputs.
We want to change this to model.classify.
So predict is the function name for a regression.
Classify is the function name for a classification.
Let's collect it again and retrain the model.
It's trained.
Let me click into the canvas, and let's look and see
what came out here.
So this is what I get back.
I get back an array.
I only have one output in this particular model,
and so I look at the 0 element of that array.
This is the value it predicted.
And I have a label that in case I had multiple things,
I could sort of know which goes with which.
So based on what's here, I want to change this to results index
0 .value.
That's the frequency that I want to play.
Now what do I want to draw?
Maybe I'll actually look at the number.
So let's actually also draw that,
but maybe we'll take away the decimal place
by using floor just so it's less busy,
takes up less room in the canvas itself.
OK, all right, let me add that save data feature.
Before I collect the data, let me just change
that for epochs to 50 because I don't need 200 epochs.
Now I'm going to collect a bunch of data,
so let me make a bunch of Cs.
I clicked around somewhat arbitrarily,
but let me now actually save this,
so I don't have to always collect the data again
every single time.
So I'm saying that to a JSON file.
I am now going to train the model.
What do I expect to happen?
Before when I was doing classification,
I would expect to hear a C when I click near the Cs and F
when I click near the Fs.
And I would hopefully get something similar to that.
Like does this sound like a C to you?
You can hear it's changing, though, f.
But look, I'm getting a different note every time
because the regression, once again, remember is like a dial.
So if I have the notes C over here
and I have the note E over here, ideally,
when I click here, I'm going to get a note that's
in between like D.
But the notes are completely irrelevant here.
It's really all about the numbers, the idea
being that if I have the number 200 here
and I have the number 300 here, clicking in between
is like having a slider or a dial
going between 200 all the way up to 300.
And while this works in a somewhat obvious way
in this two-dimensional space with me putting
a lot of Cs over here and a lot of Gs over there,
you could imagine how this could become a much more
sophisticated musical instrument,
or the output doesn't even have to be a musical frequency,
a sound frequency.
There's so many possibilities.
But now we've seen that in addition
to using the ML5 neural network for classification.
You can also use it for regression.
So what's next?
Let's think of some exercises for you to do.
So first of all, I right now I have
to click around to hear the note,
but there's no reason why, in this particular example,
I couldn't move the mouse around and have that frequency adjust.
I don't need an envelope anymore maybe
on this continuously playing a note.
So that may be something that you try.
You can play around with saving the model,
saving the data, all that stuff that I showed you
in the previous two videos with this regression example
as well.
But ultimately, I think what I want to look at here--
and I will come back and do another video-- is what are
some ideas for inputs that allow for more creative or surprising
results than just mouse clicks?
And I think the one that I want to show you is using Poe's net.
So Poe's net is also a machine learning model
that takes an image as the input and guesses
where you parts of your body are,
so it can find your nose and your eyes
and your hands and your elbows--
a whole set of key points on a human body.
Why not train a model to recognize
as the inputs certain poses and then
have a particular output associated with that.
So I'm going to build a project using
all of this stuff in the next video.
I think I'll make it a coding challenge,
build a project that does pose classification
with the ML5 neural network library,
or maybe it'll be posed regression.
I don't know.
We'll see.
It'll be in the next video.
Thanks for watching, and I look forward
to all of your questions and comments
and all that sort of stuff.
Goodbye.
[MUSIC PLAYING]