Placeholder Image

字幕列表 影片播放

  • And you thought we were done with the ML5 neural network

  • tutorials.

  • But no.

  • There is one more because I am leading to something.

  • I am going to-- you will soon see in this playlist

  • a section on convolutional neural networks.

  • But before I get to convolutional neural networks,

  • I want to look at reasons why a convolutional layer.

  • I have to answer this question like, what is a convolution?

  • I've got to get to that.

  • But before I get to that, I want to just see why

  • they exist in the first place.

  • So I want to start with another scenario

  • for training your own neural network.

  • That scenario is an image classifier.

  • Now you might rightfully be sitting

  • there saying to yourself, you've done videos

  • on image classifiers before.

  • And in fact, I have.

  • The very beginning of this whole series

  • was about using a pre-trained model for an image classifier.

  • And guess what?

  • That pre-trained model had convolutional layers in it.

  • So I want to now take the time to unpack what that means more

  • and look at how you could train your own convolutional neural

  • network.

  • Again, first though, let's just think

  • about how we would make an image classifier

  • with what we have so far.

  • We have an image.

  • And that image is being sent into an ML5 neural network.

  • And out of that neural network comes either a classification

  • or regression.

  • And in fact, we could do an image regression.

  • And I would love to do that.

  • But let me start with a classifier

  • because I think it's a lot simpler to think about

  • and consider.

  • So maybe it comes out with one of two things,

  • either a cat or a dog and some type of confidence score.

  • I previously zoomed in on the ML5 neural network

  • and looked at what's inside, right?

  • We have this hidden layer with some number

  • of units and an output layer, which, in this case,

  • would have just two if there's two classes.

  • Everything is connected, and then there are the inputs.

  • With post net, you might recall, there were 34 inputs

  • because there were 17 points on my body,

  • each with an xy position.

  • What are these?

  • Let's just say, for the sake of argument,

  • that this image is 10 by 10 pixels.

  • So I could consider every single pixel

  • to be an individual input into this ML5 neural network.

  • But each pixel has three channels,

  • and R, G, and B. So that would make 100 times three inputs,

  • 300 inputs.

  • That's reasonable.

  • So this is actually what I want to implement.

  • Take the idea of a two layer neural network

  • to perform classification, the same thing I've

  • done in previous videos, but, this time, use as the input

  • the actual raw pixels.

  • Can we get meaningful results from just doing that?

  • After we do that, I want to return back to here

  • and talk about why this is inadequate or not going

  • to say inadequate but how this can be improved on

  • by adding another layer.

  • So this layer won't--

  • sorry.

  • The inputs will still be there.

  • We're always going to have the inputs.

  • The hidden layer will still be there.

  • And the output layer will still be there.

  • But I want to insert right in here

  • something called a convolutional layer.

  • And I want to do a two dimensional convolutional

  • layer.

  • So I will come back.

  • If you want to just skip to that next video,

  • if and when it exists, that's when I

  • will start talking about that.

  • But let's just get this working as a frame of reference.

  • I'm going to start with some prewritten code.

  • All this does, it's a simple P5JS sketch

  • that opens a connection to the web cam,

  • resizes it to 10 by 10 pixels, and then

  • draws a rectangle in the canvas for each and every pixel.

  • So this could be unfamiliar to you.

  • How do you look at an image in JavaScript in P5

  • and address every single pixel individually?

  • If that's unfamiliar to you, I would refer

  • to my video on that topic.

  • That's appearing over next to me right now.

  • If you go take a look at that and then come back here.

  • But really, this is just looking at every x and y position,

  • getting the R, G, B values, filling a rectangle,

  • and drawing it.

  • So what I want to do next is think about,

  • how do I configure this ML5 neural network,

  • which expects that 10 by 10 image as its input?

  • I'm going to make a variable called pixel brain.

  • And pixel brain will be a new ML5 neural network.

  • I should have mentioned that you could find the link to the code

  • that I'm starting with, in case you

  • wanted to code along with me, both the finished code

  • and the code I'm starting with will

  • be in this video's description.

  • So to create a neural network, I call the neural network

  • function and give it a set of options.

  • One thing I should mention is while in all the videos

  • I've done so far, I've said that you

  • need to specify the number of inputs

  • and the number of outputs to configure your neural network.

  • The truth is ML5 is set up to infer

  • the total number of inputs and outputs

  • based on the data you're training it with.

  • But to be really explicit about things

  • and make the tutorial as clear as possible,

  • I'm going to write those into the options.

  • So how many inputs?

  • Think about that for a second.

  • The number of columns times the number of the rows times

  • R, G, B. Maybe I would have a grayscale image.

  • Maybe I could just make it I don't

  • need a separate input for R, G, and B. But let's do that.

  • Why not?

  • I have the 10 by 10 in a variable called video size.

  • So let's make that video size times video size times three.

  • Let's just make a really simple classifier that's

  • like I'm here or not here.

  • So I'm going to make that two.

  • The task is classification.

  • And I want to see debugging when I train the model.

  • Now I have my pixel brain, my neural network.

  • Oops.

  • That should be three.

  • Let's go with my usual typical, terrible interface,

  • meaning no interface.

  • And I'm just going to train the model based on when

  • I press keys on the keyboard.

  • So I'll add a key press function.

  • And then let me just a little goofy here,

  • which I'm just going to say when I press the key,

  • add example key.

  • So I need a new function called add example.

  • Label.

  • So basically, I'm going to make the key that I press the label.

  • So I'm going to press a bunch of keys

  • when I'm standing in front the camera

  • and then press a different key when I'm not standing

  • in front of the camera.

  • Now comes the harder work.

  • I need to figure out how to make an array of inputs

  • out of all of the pixels.

  • Luckily for me, this is something

  • that I have done before.

  • And in fact, I actually have some code

  • that I could pull from right in here,

  • which is looking at how to go through all the pixels

  • to draw them.

  • But here's the thing.

  • I am going to do something to flatten the data.

  • I am not going to keep the data in its original columns

  • and rows orientation.

  • I'm going to take the pixels and flatten them out

  • into one single array.

  • Guess what?

  • This is actually the problem that

  • convolutional neural networks will address.

  • It's bad to flatten the data because its spatial arrangement

  • is meaningful.

  • I'll start by creating an empty array called inputs.

  • Then I'll loop through all of the pixels.

  • And to be safe, I should probably

  • say video dot load pixels.

  • The pixels may already be loaded because I'm

  • doing that for down here.

  • And I could do something where if I'm drawing them,

  • I might as well create the data here.

  • But I'm going to be redundant about it.

  • And I'm going to say--

  • ah, but this is weird.

  • Here's the weird thing.

  • I thought I wasn't going to talk about the pixel array

  • in this video and just refer you to the previous one.

  • But I can't escape it right now.

  • For every single pixel in an image in P5JS,

  • there are four spots in the array, a red value,

  • a green value, a blue value, and an alpha value.

  • Alpha value for transparency.

  • The alpha value, I can ignore because it's

  • going to be 255 for everything.

  • There's no transparency.

  • If I wanted to learn transparency,

  • I could make that an input and have 10 by 10 times 4.

  • But I don't need to do that here.

  • So in other words, pixel zero starts here, 0, 1, 2, 3.

  • And the second pixel starts at index four.

  • So as I'm iterating over all of the pixels,

  • I want to move through the array four spaces at a time.

  • There's a variety of ways I could approach this,

  • but that's going to make things easiest for me.

  • So that means right over here, this

  • should be plus equals four.

  • Then I can say the red value is video dot pixels index

  • I. The green value is at I plus one.

  • And the blue value is at I plus two.

  • And just to be consistent, I'm going

  • to just put a plus zero in there so everything lines up nicely.

  • So that's the R, G, and B values.

  • Then I want those R, G, and B values

  • for this particular pixel to go in the inputs array.

  • The chat is making a very good point,

  • which is that I have all of the stuff in an array already.

  • And all I'm really doing is making a slightly smaller array

  • that's removing every fourth element.

  • I could do that with the filter function

  • or some kind of higher order function

  • or maybe just use the original array.

  • I'm not really sure why I'm doing it this way.

  • But I'm going to emphasize this data preparation step.

  • So I look forward to hearing your comments about

  • and maybe reimplementations of this that just

  • use the pixel array directly.

  • But I'm going to keep it this way for right now.

  • So I'm taking the R, G, and B and putting them

  • all into my new array.

  • Then the target is just the label,

  • a single label in an array.

  • And I can now add this as training data,

  • pixel brain add data inputs target.

  • Let's console log something just to see that this is working.

  • So I'm going to console log the inputs.

  • And let's also console log the target,

  • just to see that something is coming out.

  • So, a, yeah.

  • We can see there's an array there.

  • And there's the a.

  • And now if I do b, I'm getting a different array with b there.

  • So I'm going to assume this is working.

  • I could say inputs dot length to make sure

  • that that's the right idea.

  • Yeah.

  • It's got 300 things in it.

  • OK.

  • Next step is to train the model.

  • So I'm going to say, if the key pressed is T,

  • don't add an example but rather train the model.

  • And let's give it train it over 50 epochs

  • and have a callback when it's finished training.

  • Let's also add an option to save the data,

  • just in case I want to stop and start a bunch of times

  • and not collect the data again.

  • And I'm ready to go, except I missed something important.

  • I have emphasized before that when

  • working with neural networks, it's

  • important to normalize your data,

  • to take the data that you're using as inputs or outputs,

  • look at its range, and standardize it

  • to some specific range, typically between zero and one

  • or maybe between negative one and one.

  • And it is true that ML5 will do this for you.

  • I could just call normalized data.

  • But this is a nice opportunity to show that I can just

  • do the normalization myself.

  • For example, I know-- this is another reason

  • to make a separate array sort of.

  • I know that the range of any given pixel color

  • is between zero and 255.

  • So let me take the opportunity to just divide every R, G,

  • B value by 255 to squash it, to normalize it

  • between zero and one.

  • Let's see if this works.

  • I'm going to collect it.

  • So I'm going to press-- this is a little bit silly,

  • but I'm going to press H for me being

  • here in front of the camera.

  • Then I'm going to move off to the side,

  • and I'm going to use N for not being in front of the camera.

  • So I'm not here.

  • And I'm just going to do a little bit right now,

  • and then I'm going to hit T for train.

  • And loss function going crazy.

  • But eventually, it gets down.

  • It's a very small amount of data that I gave it to train.

  • But we can see that I'm getting a low loss function.

  • If I had built in the inference stage to the code,

  • it would start to guess Dan or no Dan.

  • So let's add that in.

  • When I'm finished training, then I'll start classifying.

  • The first thing I need to do if I'm going to classify the video

  • is pack all of those pixels into an input array again.

  • Then I can call classify on pixel brain

  • and add a function to receive the results.

  • Let's do something fun and have it say hi to me.

  • So I'm going to make this label a global variable with nothing

  • in it.

  • And then I'll say, label equals results label.

  • After I draw the pixels, let's either write hi or not

  • write hi.

  • So just to see that this works, let's make the label H

  • to start.

  • It says hi.

  • Now let's not make it H. And let's go

  • through the whole process.

  • Train the model.

  • And it says hi.

  • Oh, I forgot to classify the video again

  • after I get the results.

  • So it classified it only once.

  • And I want to then recursively continue

  • after I get the results to classify the video again.

  • Just so we can finish this out, I actually

  • saved all of the data I collected to a file

  • called data dot JSON.

  • And now I can say, pixel brain load data data dot JSON.

  • And when the data is loaded, then I can train the model.

  • So now I've eliminated the need to collect

  • the data every single time.

  • Let's run the sketch.

  • It's going to train the model.

  • I don't really even need to see this.

  • When it gets to the end, hi.

  • Hooray.

  • I'm pleased that that worked.

  • I probably shouldn't, but I just want

  • to try having three outputs.

  • So let's try something similar to what

  • I did in my previous videos using teachable machine

  • to train an image classifier.

  • And we'll look at this ukulele, coding train notebook,

  • and a Rubik's cube.

  • So let me collect a whole lot of data.

  • I'm going to press U for ukulele, R for Rubik's cube,

  • and N for notebook.

  • Save the date in case I need it later and train the model.

  • All right, so now ukulele, U, N for notebook.

  • And can we get an R?

  • I stood to the side when I was doing the Rubik's cube,

  • so that is pretty important.

  • So it's not working so well.

  • So that's not a surprise.

  • I don't expect it to work that well.

  • This is why I want to make another video that

  • covers how to take this very simplistic approach

  • and improve upon it by adding something

  • called a convolutional layer.

  • So what is a convolution?

  • What are the elements of a convolutional layer?

  • How do I add one with the ML5 library?

  • That's what I'm going to start looking at in the next section

  • of videos.

  • But before I go, I can't resist just

  • doing one more thing because I really

  • want to look at and demonstrate to you what happens if you

  • change from using pixel input to perform a classification

  • to a regression.

  • So I took code from my previous examples that just demonstrated

  • how ML5 in regression works, and I

  • changed the task to regression.

  • I had to lower the learning rate.

  • Thank you to the live chat who helped me figure this

  • out after like over an hour of debugging.

  • I had to lower the learning rate to get this to work.

  • I trained the model with me standing

  • in different positions associated

  • with a different frequency that P5 sound library played.

  • And you can see some examples of me training it over here.

  • And now, I am going to run it and see if it works,

  • and that'll be the end of this video.

  • So I had saved the data.

  • And now it's training the model.

  • And as soon as it finishes training,

  • you'll be able to hear.

  • All right, so I will leave that to you as an exercise.

  • I'll obviously include the link to the code

  • for this in the video's description

  • on the web page on the codingtrain.com

  • with this particular video.

  • I can come back and implement it.

  • You can go find the link to a Livestream

  • where I spend over an hour implementing it.

  • But I'll leave that to you as an exercise.

  • See if you followed this video and have image classification

  • working, can you change it to a regression

  • and have it control something with continuous output?

  • OK, if you made it this far, [KISSING NOISE] thank you.

  • And I will be back and start to talk

  • about convolutional neural networks, what

  • they mean in the next video.

  • [MUSIC PLAYING]

And you thought we were done with the ML5 neural network

字幕與單字

單字即點即查 點擊單字可以查詢單字解釋

B1 中級

ml5.js:用像素作為輸入來訓練神經網絡。 (ml5.js: Train a Neural Network with Pixels as Input)

  • 2 0
    林宜悉 發佈於 2021 年 01 月 14 日
影片單字