Subtitles section Play video Print subtitles [MUSIC PLAYING] JOSH GORDAN: OK, so we have a bunch of cool topics, and we'll definitely hit the Getting Started resources in a moment, but because we talk about mnist a lot, and very basic problems in computer vision a lot, I wanted to actually start the talk by sharing a couple of my favorite recent examples, all of which have complete code in TensorFlow 2.0. So even if you're new to TensorFlow, and these concepts can take a long time to learn-- like to talk about neural machine translation, you would need to take a class-- you can still try the code. And most of them are 50 lines or less. And they run very quickly. So anyway, they're great. Anyway, TensorFlow 2.0 is currently in alpha. It is all about ease of use, which is the number one thing I care about. And it's ease of use at all levels. So both for novices that are totally starting out, as well as PhD students that want to be able to do their research in a slightly easier way. I'm not going to spend too much time on this slide. I just wanted to call out the most important thing about TensorFlow is the user and the contributor community. And as of now we've had over 1,800 people contribute code to the code base, which is huge if you think about how many seats that would fill up here. So thank you very much to everyone who has contributed, and the many more who have done docs and have done teaching and meetups and stuff like that. So it's super cool. Anyway, the alpha of TensorFlow 2 is available today. Also going to fly through this slide. And what you should know is, every single example linked from the following slides will automatically install the correct version of TensorFlow at the very top. And they'll all run in Colaboratory, which is the best thing since the microwave. And if you run it in Colab, there's nothing to install on your local machine. So if you want to try out the latest version of TensorFlow 2.0, you literally can follow these links and with a single click you'll be in Colab and you're good to go. So before we get into Hello World, I wanted to very quickly talk about things like Deep Dream. So what deep learning is, is really representation learning. And we don't have as much time as I'd like to go into that in great detail. But there's been a couple pieces of really amazing work in the last few years. And on the left we're seeing a psychedelic image generated by a program called Deep Dream. And what's really interesting, I just wanted to say that the goal of Deep Dream was not to generate psychedelic images. It was to investigate how convolutional neural networks are so effective at classifying images. And it was discovered that every neuron in every layer of a CNN learns to detect different features when you train it on a large corpus of training data. And you can use TensorFlow to write a loss function to try and maximally excite one of those neurons. So anyway, the TLDR is, the fact that we can take an image and supersaturate it with dogs is possible as an artifact of training a CNN on a large database of images. Anyway, there's a notebook there where you can try it out. It runs very quickly in Colab. And like less than 50 lines of code. It's surprisingly short. Once you know the idea, the implementation in TensorFlow 2 is super easy. On the right is an example called Style Transfer, which I'm going to fly through. But it comes from exactly the same idea. It's given that we've trained an image classifier on a very large amount of data. What else can we do with it? And it exploits very similar ideas, Deep Dream. Another really, really cool example that I wanted to share with you is for something called neural machine translation. And this is like 50 lines of code, give or take, that out of the box will train you an English to Spanish translator. And the only input you need to provide-- this is totally open source. We're not hitting the Google Translate API. The reason I like this example, it's all the code you need to implement a mini version of Google Translate. The simplest possible Hello World version of Google Translate can be done in 50 lines. And the one thing I wanted to mention very briefly is I'm a little bit envious of people that are bilingual and trilingual. I have English and barely high school Spanish. And so translation has always interested in me. And the way that the translation example works, it uses something called a sequence to sequence model. Briefly, what that does is it takes a sentence in English or the source language, and it maps it down to a vector, which you can actually see and print out in the code and explore. And that vector is just an array of numbers. That's called an encoder. There's a second neural network-- it's two natural networks working parallel-- there's a second network called a decoder. The only input to the decoder is that vector, and the decoder produces a sentence in the target language. And what this means is that the encoder takes a sentence and it compresses it. So before, we saw that deep learning can be seen as representation learning because as an artifact of training a network on a large corpus of images to train an image classifier, we find neurons that learn to recognize different shapes and objects and textures. And here we can think about deep learning as compression, because we can take a sentence which contains a huge amount of information and map it down to a short list of numbers. And the reason I wanted to mention this trilingual aspect is you can actually come up with something called an interlingual representation, just by modifying this example. Say we wanted to translate from English to Spanish and also from French to Spanish. Just by modifying this code to include a small number of French to Spanish sentences in the input data that you provide, that vector that comes out of the encoder will encode a sentence either in English or in French into the same representation. And what that means is, you're finding a way to represent concepts independently of language. And I know this is a little bit out of scope for Hello TensorFlow World, which we'll get to in a sec. But the reason I want to mention things like this is there's incredible opportunities at the intersection of deep learning and other fields. So for example, if you were a linguist, perhaps you're not super interested in the details of the TensorFlow implementation, but what you could do is look at this interlingual representation that we get almost for free, and investigate it. And right there, that would be a killer PhD paper or thesis or something like that. And so when we put these fields together, we get super, super cool things. I'm taking way too long. I'm going to skip this entirely. I just wanted to mention we can also take an image and using the same encoder decoder architecture, map the image into a vector and reusing the decoder, which maps from vectors to sentences that we have in the translation tutorial, almost copying and pasting it, we can learn to caption an image. And this tutorial has a little bit more code, but it's the same idea. It's absolutely mind-blowing. So there's a lot of value in learning about deep learning, and it has a lot of potential impact. Also we have two really excellent resources for total beginners. The first is linear regression, finding the best fit line, which is probably the most boring thing ever, but it's a perfect way to learn about gradient descent and even back propagation if you wanted to. And what's awesome is the gradient descent and back propagation concepts that you learn about in linear regression are exactly the same concepts that apply to every other model you see in TensorFlow. And then, as always, we have a great collection of Hello World examples on the website. And we just launched a Udacity course and a Coursera course that will go into the Hello World examples in much more depth than we have time for here. So Paige-- who I've learned a lot from, by the way-- is going to tell us about the differences between TensorFlow 1 and TensorFlow 2. PAIGE BAILEY: Absolutely. Thank you, Josh. So-- [APPLAUSE] Excellent. So who here tried to use TensorFlow around 2015, 2016? Show of hands. So a few of you. And if you tried using it then, you probably saw something very similar to what you see on the screen there. And if you're coming from the scikit learn world, this doesn't feel very Pythonic at all, right? So you're defining some variables. You're assigning some values to them, but you can't immediately use them. You have to initialize those variables. You have to start these weird things called queue runners, and you have to do it all from this sess.run statement. So creating sessions, defining variables, but not being able to use them immediately, this wasn't straightforward. And the user experience, we found, with the original version of TensorFlow left a lot to be desired. So we've learned a lot since TensorFlow 2.0, or since TensorFlow 1.0, I should say. We've learned that there's a lot to be gained through usability. So we've adopted Keras as the default higher-level API. We've decided to pursue eager execution by default. And this means that you can do crazy things, like add two numbers together and immediately get a response. We've also made a big push towards clarity by removing duplicate functionality, by making consistent intuitive syntax across all of our APIs. So instead of having thousands of endpoints, some of which do very similar things, and none of which have standardized conventions, now everything feels a little bit more consistent. And instead of having a large series of tf.foo, we now have things like tf.signal.foo or tf.math.foo. We've also decided to improve the compatibility throughout the entire TensorFlow ecosystem. So instead of having multiple ways to save models, we've standardized on something called saved model. And I think we'll see an architecture slide later in the presentation speaking to that. We've also made a huge push towards flexibility. We have a full lower-level API, so if you like using the lower level ops you're still having that capability we've made everything accessible in tf.rawops. And we've had inheritable interfaces added for variables, check points, layers, and more. So if you like staying at a high level, we support that. If you want to go a little bit lower, you can do subclassing with Keras, and if you want to go even lower, you have access to the full capabilities with TensorFlow Raw Ops. This is all with one API. And I think to talk a little bit more about it, Josh is going to mention how much we love Keras, and love its subclassing capabilities. JOSH GORDAN: Which is completely true. Thank you so much. OK, so I know I'm talking fast, but we have a lot of content to cover. Basically one of the huge changes of TensorFlow-- well, we did this technically in TensorFlow 1.x, but this is the standard for 2.0. So we've standardized on the Keras API, and we've extended it. Briefly, because we might not get to the slide, if you go to keras.io, that is the reference implementation for an open source deep learning API spec. Keras is basically an API without an implementation. It's a set of layers that describes a very clear way to implement your neural networks. But traditionally, Keras runs on top of other frameworks. So if you do PIP install Keras, you get Keras with TensorFlow behind the scenes, and you never see TensorFlow. And this is a perfectly fine way to get started with machine learning. In fact, you can do like 90% of what you need to do just with that. It's phenomenally good. In TensorFlow, if you do PIP install TensorFlow, you get the complete Keras API and some additional stuff that we've added. There's no need to install Keras separately. Briefly, I just want to show you two APIs. And it says for beginners and experts, but you can do 95% of ML, including some of the cool examples I showed you, with the beginner's API. The beginner's API, this is called Sequential. And we're defining a neural network as a stack of layers. And I know people that I've worked with deep learning before have almost certainly seen this. There's a couple important points. You might not realize it, but what you're doing here when you're defining a sequential model is you're defining a data structure. Because your model is a stack of layers. Keras or TensorFlow, depending on which way you're running this, can look at your layers and make sure they're compatible. So it can help you debug. And what this means is if you define a model this way, you're not likely to have errors in the model definition itself. Your errors are going to be conceptual errors. They're not going to be programming errors when you define your model. And that's very valuable. Here's how that looked in TensorFlow 1, and here's how that looked in TensorFlow 2. Or here's how that looks now. So this hasn't changed at all. And if you're familiar with it, great. We've added a second style, and this is called model subclassing. And I love this, but it's very different. So this basically feels like object oriented NumPy development. So many libraries do something similar to this. The idea came from Chainer a few years back. And what we're doing is we're extending a class provided by the library. Here we call it model. In the constructor-- so if you're coming from Java, this will be great-- in the constructor we define our layers. And in the call method we define the forward pass of our model. And what's nice is the call method is, in TensorFlow 2, this is just regular imperative Python, exactly how you would always write it, and it works the way you'd expect. This makes it super easy to debug, and my friend Sarah, she works on custom activation functions. If Sarah wants to quickly try her activation function, you can write it as you would expect. And this is a huge difference from TensorFlow 1. This is phenomenal. For people reading at home, you can look at the slide and the article link from that to learn a lot more about that. Anyway, both types of models, if you're familiar with Keras, can be trained using model.fit, as you always would. Or if you would like, you can use what we call the gradient tape. And so this is a perfect way, if you're doing research or if you're a student and you want to learn about back prop and gradient descent, if you'd like to know what the gradients of your loss function are with respect to the weights, you can simply print them out. If you print out grads there, you will just get a list of showing all the gradients, which makes them extremely easy to modify and log and debug. It's great. So this style of code gives you complete flexibility, which is awesome. But you're much more likely to have programming errors. So basically, if you do model.fit, it works out of the box, it's fast, It's performing, you don't have to think about it. You can focus on the problems that you care about. If you wanted to research and write from scratch, you can, but there's a cost. The other cost that I wanted to mention is actually tech debt, which is not something you might think of off the bat. So deep learning aside, if you implement your model using the sequential API, I can look at any code written that way. For instance, if I'm helping a student debug, and immediately see what the bug is because there's a standard, conventional way to write it. If I have students that write code this way and they come to me with a problem, it can take me 15 minutes to find it. And if you think about what happens to code that you write in a company, if you have deep learning code that lives for five years worked on by 50 engineers, there's a huge cost to this style. And so I know this is obvious, but basically software engineering best practices apply to deep learning too. So we have the style, but use it when you need it. More details on Keras versus TensorFlow. Briefly, another really awesome thing about Keras API in TensorFlow is distributed training. So most of the work that I care about happens on one machine. Like, what I'm personally excited by is like a really clear implementation of GaN. A friend of mine is working on cycle GaN. We'll have a tutorial available soon. But for people training large-scale models in production, we've greatly simplified distributed training in TensorFlow too. So here's a Keras model, and these are the lines of code that you need to run that model using data parallelism on one machine with many GPUs. And that's it. So assuming you have a performing input pipeline, which, to be honest, takes time to write and is an engineering discipline, but once you have that done, distributing your model is very easy. And we're working on additional distribution strategies for different machine and network configurations just to encapsulate this logic so you can train your models quickly and focus on the problems that you care about. Another thing that's really special about TensorFlow is I want to call out the documentation. So if you visit tensorflow.org, this is just a screenshot of one of our tutorials. You'll see most of the editorials have these buttons at the top. One is view on GitHub, which will give you the Jupyter notebook. The other is run in Colab. And all of the tutorials for the alpha version of TensorFlow 2 run end to end out of the box with no code changes. And this is important because it means they're easy to use and they're reproducible. So what they do is they install the right version of TensorFlow. They download any data sets you need. So in this GaN example, they'll download-- I actually forget the name of the university. The paper, I believe, is from Berkeley, but I'm not sure that's where the data set is hosted. Anyway, we thank them in the tutorial. They'll download the data set. They'll train a model. They'll display the results that you see, and from there you have a great starting point that you can modify and hack on. OK. And now Paige will tell you more about TensorFlow 2. PAIGE BAILEY: Excellent. Thanks, Josh. So as we mentioned before, we've tried to standardize and to provide compatibility throughout the entire TensorFlow ecosystem. If you were here a little bit earlier, you saw a really cool demo from the TensorFlow Lite team, where you had object segmentation and you were able to have a human being dance and immediately have their body shape sort of transposed and make it look like I could dance, even though that's usually not so much the case. The way that this is standardized is through something called saved model. So with historic TensorFlow, so TensorFlow 1.x, there were a variety of ways to save your models. And it made it very, very difficult to port it to different locations where you might want to use them. So for example, mobile or embedded devices or servers. Now, as part of the standardization with TensorFlow 2.0, you can take your saved model and deploy it to TensorFlow Serving, TensorFlow Lite for mobile and [INAUDIBLE] embedded devices, TensorFlow JS for deep learning in the browser or on a server, and then also for other language bindings. We offer support for Rust, for Java, for Scala, and many more. So as I mentioned, you can use TensorFlow on servers, for edge devices and browsers. We have an entire training workflow pipeline, including data ingestion and transformation with TF data and feature columns. From model building with Keras, premade estimators, if you would still like to use those, and then also custom estimators or custom Keras models. For training we've defaulted with eager execution, so you'll be able to get your responses immediately instead of doing that frustrating thing with initializing variables and starting queue runners, as I mentioned before. You can visualize all of it with TensorBoard and then export again, as with the saved model. If you haven't already seen it-- and this is really, really cool-- TensorBoard is now offered fully supported in Google Colab so you're able to start it to run it to inspect and to visualize your models, all without those sort of frustrating local host commands. This support is also additive for Jupyter notebooks, so if you want to use this with Google Cloud instances or with Jupyter notebooks locally, you absolutely can. We've also included built-in performance profiling for Colab. This is for GPUs and also for TPUs. So you're able to understand how your models are interacting with hardware and then also ways that you can improve your performance. We heard you loud and clear that the documentation could be improved, so a big push for 2.0 has been improving documentation, adding API reference docs. We'll also be having a global docs sprint in collaboration with our Google developer experts and GDC groups later this year. And if you're interested in collaborating for documentation, we would love to have it. Please submit it as a pull request to TensorFlow/examples on GitHub. We also understand that developers and researchers need great performance, and we did not want to sacrifice that as part of TensorFlow 2.0. So since last year, we've seen a 1.8 training speed up on NVIDIA Teslas. That's almost twice as fast as some earlier versions of TensorFlow. We've seen increased performance with Cloud TPUs, and then also great performance in collaboration with our partners at Intel. Not just for training, though. If you're interested in inferencing for TensorFlow Lite, we've brought down the speed for edge TPUs to just two milliseconds for quantized models. So underneath the hood, TensorFlow Lite and TensorFlow are all about performance. We've also extended the ecosystem in a number of ways. When TensorFlow was first open sourced in 2015, it was a single repository for numerical computing. And now it's grown into an entire ecosystem. So if you're interested in Bayesian modeling, you can use something like TensorFlow Probability. If you're interested in reinforcement learning, you can use TensorFlow Agents. If you're interested in text processing you can use TF Text. If you're interested in privacy or insecure computing you can use Federated or Privacy. We also have a variety of other projects-- about 80 right now. And if you're interested in any of them, I strongly suggest you go and take a look at the TensorFlow GitHub. And now the question I'm sure all of you are very, very interested in is how do I upgrade? All of this sounds great. How do I make sure that all of my historic legacy models continue to run with TensorFlow 2.0? And the answer is, we've tried to make it as easy as we possibly can. We have an escape to backwards compatibility mode as part of tf.compat.v1. We have migration guides and best practices that have all been placed on tensorflow.org/alpha. We've also created something called tf_upgrade_v2. It's a conversion utility that you can run from the command line. And it takes your existing model and imports the code to 2.0. Not to 2.0 syntax, but it makes all of the changes that would be required in order for it to run compatible with 2.0. So what does that look like? All you would have to do is take your model, export it as a Jupyter Notebook or as a Python file, and then run it from the command line with tf_upgrade_v2, the input file name, and then what you want the output file name to be. You can do this even for a directory of files. The files then cycle through and you get something that looks a little bit like this. It's a report.txt file that tells you all of the API endpoints that have been renamed, all of the keywords that have been added, and then all of the instances that need to have this escape to backwards compatibility mode. So prefixed with tf.compat.v1. Once all of that's done, you should be able to run your model as expected and see no performance regressions. And if you do, please file an issue. That's a bug, and we would be delighted to resolve it. I'd also like to highlight one of the projects that our Google developer experts has created called tf2up.ml. So if you don't want to run the upgrade utility from your command line, you're free to take a GitHub URL, use tf2up, and see it displayed with the changes in line in a browser window. This is really, really cool. Strongly suggest taking a look. So our timeline for TensorFlow 2.0. Right now we're in alpha. We expect to launch an RC release very soon, and we should have an official release before the end of the year. You can also track all of this progress publicly on GitHub. We've tried to increase the transparency, and also the collaboration that we see from the community as much as we possibly can, because TensorFlow 2.0 really is all about community. And if you have questions about any of the projects or about any of the issues that you care about, we would love to hear them. And we would love to prioritize them appropriately. And now to talk a little bit about under-the-hood activities for TensorFlow. JOSH GORDAN: Thanks, Paige. Due to talking fast, we might now actually have some time. So I will ask-- this is very basic, but I think a question that a lot of people ask is, what exactly is TensorFlow? And if I asked you that, what I would have said when I first heard about it is, like, right, that's an open source machine learning library. Great, but what is it really? What does the code look like? How is it implemented, and what problems is it actually solving that we care about? And rather than give you the next slide, which is a lot of text and the answer, the way to start thinking about this question is actually with Python. So if you think about scientific computing in general-- and this is the whole field, not just machine learning. Let's say you're doing weather forecasting, and as part of weather forecasting, you need to multiply a whole bunch of matrices. Probably you're writing your code in Python. But if you think about it, how much slower is Python than C for multiplying matrices? Ballpark? And like a horribly non-reproducible rough benchmark would be Python's about 100 times slower than C. And that's the difference between six seconds and 10 minutes, which is also the difference between running on a treadmill or having a drink, sitting in an airplane flying to California. So Python is horribly slow, and yet it's extremely popular for performance-intensive tasks. One of the huge reasons why is NumPy. And what NumPy is, it's a matrix multiplier implemented in C that you can call from Python. And this gives you this combination of Python ease of use but C performance. And most deep learning libraries have the same inspiration. So TensorFlow is a C++ back end. But usually-- not always, but usually, we write our code in Python. On top of NumPy, what TensorFlow and other deep learning libraries add is the ability to run on GPUs. So in addition to being in C, you can multiply your matrices on GPUs. And if you take a deep learning class you'll end up learning that the forward and backward paths in neural networks are both matrix multiplications. So we care about this a lot. All deep learning libraries, they add automatic differentiation. So you get the gradient so you know how to update the variables of your model. And TensorFlow adds something special. And there's a lot of text on the slide in details, whatever, you can look at later. But when you write a program in TensorFlow in Python, one thing we care a lot about-- and I know there are a lot of mobile developers here-- is we want to run it on devices that don't have a Python interpreter. Examples of that would be a web browser or a phone. And so what TensorFlow does is your TensorFlow program is compiled to what we call a graph. And it's a data flow graph. The word TensorFlow, tensor is a fancy word for an array. Scalar is a tensor, an array's a tensor, matrix is a tensor, a cube of numbers is a tensor, it's an n-dimensional array. Flow means data flow graph. Your TensorFlow program gets compiled behind the scenes in TensorFlow 2-- you don't need to know the details of this unless you're interested-- into a graph. And that graph can be run on different devices. And what's interesting is it can be accelerated. So just so you know, because I've been talking about NumPy a lot, TensorFlow 2, if you feel like it, works basically the same way as NumPy. The syntax is slightly different, but the ideas are the same. So here I'm creating some data, a tensor instead of a NumPy array, and I'm multiplying it by itself or whatever, and it just works like regular NumPy. I should mention that instead of being NumPy and [? D ?] arrays, TensorFlow tensors are different data type, but they all have this really nice NumPy method. So for any reason you're tired of TensorFlow, you just call a NumPy and you're back in NumPy land, which is awesome. But TensorFlow can do something really special and cool, thanks to a really amazing group of compiler engineers that are working on it. So here's just some random code I wrote in TensorFlow, and I'm taking some layer and I'm calling it on some data. And I have this horrible non-reproducible benchmark that I ran at the bottom there using timeit, and staring into the sun, I think this took about 3/100 of a second to run. And in TensorFlow 2.0, we can accelerate this code further. And the way this works is there's only one line of code change. So if you look closely here, I've just added an annotation and I've added a second benchmark. So if we go back one slide, that's before. Whoops. Let's go-- perfect. So here's before and here's after. And with just that annotation, this is running something like eight or nine times faster. And your mileage will vary depending on the type of code that you accelerate. You won't always get a performance benefit, but the only non-standard Python syntax that you need to be aware of optionally in TensorFlow 2 is just the sanitation. So you don't need to worry about-- if you learned TensorFlow 1, this is really valuable knowledge, because there's so many papers with really awesome implementations in TensorFlow 1. But the only nonstand-- you don't need to worry anymore about like sessions, place holders, feed dictionaries, that's just not necessary. This is the only thing. Otherwise it's regular Python. And the way this works behind the scenes-- I'm showing you this just for fun. You can totally ignore it. I personally never look at this because I'm not a compilers person. But it works with something called AutoGraph. And AutoGraph is a source-to-source Python transformer. And basically it generates a version of this code which can be accelerated to a greater extent by the back end. And we can actually see what's generated. We can print out AutoGraph. And basically what we're looking at is more or less assembly code for that function we just wrote. But in TensorFlow 2, you get this for free, which I think is a really awesome thing. And it's super cool. That said, the fact that we need a compilers engineer to write something as powerful and amazing as this points us-- I mean, you might want to think-- is we're really starting to run into the wall with Python. And Python is by far my favorite language of all time. It's going to be probably the standard for machine learning for many years to come. But there's a huge amount of value in investigating compiled languages like Swift. And if you're a Swift developer, there's an excellent implementation of TensorFlow in Swift, which you can learn and all the same concepts that you learned about in Python will apply in Swift. Likewise, TensorFlow JS is incredible. If you're a JavaScript developer, there's no need to learn Python. You can just go directly in JavaScript. And this is something really special about TensorFlow. OK, due to, as I said earlier, talking way too fast because I thought this talk was longer than it was, here is the best way to learn about TensorFlow 2. Right now all of our tutorials are hosted on tensorflow.org/alpha. If you're new to TensorFlow and you're a Python developer, you should ignore everything else on the website. Just go to Alpha and this will give you the latest stuff for 2. Everything else is outdated and totally not necessary. Because this is complicated, I put some keywords there. And if you see any of those keywords in a book or a video or tutorial, just skip it. It's outdated, and we should be finished with TensorFlow 2 in a few months, at which point we will roll the entire website over to the new stuff. So that's absolutely key. Speaking of things that are coming up soon, here are two awesome books. And I want to mention, just so you know what you're getting, I'm not going pronounce the names. I mentioned earlier I'm terrible at languages. I can't pronounce French at all. They're both brilliant, awesome people. The first is the second edition of the Hands-On Machine Learning book. The first uses TensorFlow 1, so I'd recommend skipping that one. This one is coming out in a few months. The GitHub repo is available now. It's excellent, so you can start with this. The second book, I'll pronounce this one. It's Francois Chollet. Hope I got it right. And then Aurelien Geron, which I probably got wrong. The second book doesn't use TensorFlow at all. It uses the Keras reference implementation. Every concept you learn in that book will work in TensorFlow 2 just by changing the import. So you don't waste your time at all. It's an outstanding reference. And yeah. We'll be around after if we can answer any questions or help with anything. So thank you very much. [MUSIC PLAYING]
B1 model numpy learning api deep learning data Getting Started with TensorFlow 2.0 (Google I/O'19) 2 0 林宜悉 posted on 2020/04/04 More Share Save Report Video vocabulary