I think python is generally used for AI and data science stuff, so you'd probably be better off learning that.
That said, I think one of the best ways to learn how to do something is dive right into it. I'm currently in the process of writing a deep learning library in C: https://github.com/siekmanj/sieknet
So if you're dead set on C++, I'd say the best way is to try to build something cool right off the bat.
Thanks! Mostly it was out of a desire to learn more about the actual algorithms behind AI, and trying to figure out if it's a field I might enjoy working in. I really enjoy building things from the ground up, and understanding how each part works.
My lab (which does extensive collaboration with industry) is all python... I could see maybe building an application that uses a trained model, but I have to agree that python is the current standard for DL research/work.
Seconding this. Keep in mind you're not in a "normal" C environment when dealing with GPUs. It's a profoundly negative experience dealing with chip manufacturers (Nvidia) that push proprietary hardware and actively thwart your efforts at producing stable and correct code. It made me realize why Linus had such animosity towards them.
Im just going to solder this pins together, and leave you this handcrafted compiler - which is actually just a normal c-compiler, with alot of the normal operations not working or replaced with - undocumented- and well you will find out.
GFX Cards are just a thousand embedded controllers, glued to a pipeline.
C++ is IMO a bit at the deep end of the pool. I would begin with tutorial information (Meyers and Stroustrup) and work with that. At some point you will get tired of tutorial exercises and start to see how you can use C++ for the topic of DL.
I can't comment on Peters as I am not familiar with that.
Hmmm... It seems not possible to search for "The C++ programming language" on amazon. As fast as I type '++' Amazon deletes the characters. >:( Luckily a search for "The C Programming language" also lists the 4th edition of Stroustrups book. ... And after searching via Google, the Amazon page now works. Weird!
I agree with this, but I would offer that #3 is more an integration of #1 and #2 rather than a "learn", as your last sentence points out with "once you have done 1) and 2)".
So I believe you should more strongly recommend 1) and 2) and include what a later poster added about various frameworks: "BLAS, LAPACK, and maybe the whole CUDA family (CUDA, cuBLAS, cuDNN, etc)", see @madenine.
I'm not sure how C++ for DL is different from regular C++ so take my advice with a grain of salt.
I took a class under Bjarne Stroustrup and he highly recommended Tour of C++ [0] as the best way to learn modern C++ for someone who already has some programming experience. That and of course, Effective C++[1] by Scott Meyers.
Just like if you were going to learn Python for Deep Learning, you're going to need 3 things:
1. Understanding of Deep Learning
2. General familiarity with the language
3. Understanding of packages/tools that will help you accomplish your goals. If this were python we'd be talking Numpy/TensorFlow/PyTorch/Keras/etc.
We're talking C++, I'm guessing you'll want to work with less abstraction than TF and the like, so BLAS, LAPACK, and maybe the whole CUDA family (CUDA, cuBLAS, cuDNN, etc).
Otherwise, TensorFlow, Caffe, CNTK, and other popular deep learning frameworks are available for C++, even though they might be better known and more heavily used in other languages.
PyTorch was apparently used in ~43% of the ICLR papers (a big prestigious deep learning conference) (https://www.reddit.com/r/MachineLearning/comments/9kys38/r_f...) and it's market share is growing at an incredible pace. I would expect it to beat Tensorflow in popularity at least for research very soon.
That's definitely where I would start if I absolutely had to do deep learning in C++. Otherwise I would do Python, which is likely used by 95% + of the research field.
I guess for me, having been using c++ as my preferred language for 25 years I just now read api's. When new C++ features are added I get to know then by practicing using them in small programs then into production code.
Stroustrup and Meyers are the two most well known names. I buy all their books and I read them and practice all exercises and problems if the book has them.
Besides the already-mentioned pytorch and tensorflow bindings, http://dlib.net/ is an option if C++ is really a hard requirement. It is opinionated and incomplete, basically being a one-man-show, but it has some weird-but-cool ideas like each neural network topology having its own template type.
What is your reason for learning "C++ for deep learning"?
This will kind of define how to go about doing it.
I can think of a few different reasons you might want to do this:
* You DL code in another framework is slow, and you have some custom C++ you want to write to speed it up. For this, you probably want to learn both high performance C++ and/or CUDA kernel development. You can probably avoid diving completely into C++, and just call a couple of optimized routines from python (and whatever other deep learning framework you are using in python). In this case, it might be worth looking into Tensor Comprehensions.
* You are taking someone elses DL algorithm and moving it to C++. In this case, you still don't need to be diving too much into C++, Ideally, you probably want to use something like ONNX and Caffe, and then call into them with some python wrapper. If you want the whole thing to be in C++, then you are still going to use something like ONNX and Caffe, but you will be writing mostly application code to support it.
* You want to help with the development of Pytorch, Tensorflow, Caffe or anther deep learning framework. In this case, you need to know CUDA kernel development, performant C++ idioms, and good C++ application development idioms.
These are pretty different flavors of C++, which makes it hard to give you a good answer.
DL libraries are pretty complex and sparsely documented which can make for a painful learning experience, even if you already know C++. Maybe go and learn some graphics programming with C++. You’ll encounter plenty of matrix manipulation, shaders, OpenGL and the like, and there are plenty of really good learning resources and the immediate visual feedback makes for a compelling experience. Then you can return to DL and understand where things are coming from.
Make sure you learn how to use a debugger. You’ll need it.
If you are looking for a computational graph toolkit that is based on clean C++ go for Dynet.
It is very complete. Similar to pytorch (which borrowed some ideas from Dynet) and backed up by top academia (not big tech, hence its lower profile). It has a python wrapper as well, as everything nowadays.
If you are into deep learning for sequence to sequence (machine translation) Marian is also C++ centered. Fastest MT around. Complete (transformer and the like), extendable. Not that reading friendly from what I have heard.
If you look into deep learning, I think you'll quickly learn that the programming language doesn't matter that much. I think a great place to start would be the "Two Minute Papers"[1] Youtube channel. A lot of what he presents there is deep learning material, with links to the actual papers and often the source code as well as a plain English explanation of what's going on and why it's important. After looking at the source code of a handful, I think you'll realize that focusing on learning a single language won't be of any use.
I think it's also important to point out that it's not a great way to ask for help without giving some details about your background and your motives. If you've been programming in any language for quite a while, you'll need a completely different approach to "learning C++ for deep learning" than someone who's never programmed before. Likewise, if your goal is to work in the industry producing cutting edge work, you'll take a completely different approach than someone who just wants a rough understanding of the details just to satisfy your curiosity. So, without providing that context, you're going to get answers that are all over the place, almost all of which will be useless to you.
29 comments
[ 2.9 ms ] story [ 61.9 ms ] threadThat said, I think one of the best ways to learn how to do something is dive right into it. I'm currently in the process of writing a deep learning library in C: https://github.com/siekmanj/sieknet
So if you're dead set on C++, I'd say the best way is to try to build something cool right off the bat.
Im just going to solder this pins together, and leave you this handcrafted compiler - which is actually just a normal c-compiler, with alot of the normal operations not working or replaced with - undocumented- and well you will find out.
GFX Cards are just a thousand embedded controllers, glued to a pipeline.
1) learn c++ 2) learn deep learning 3) learn c++ with deep learning: much easier once you have done 1) and 2)
Hmmm... It seems not possible to search for "The C++ programming language" on amazon. As fast as I type '++' Amazon deletes the characters. >:( Luckily a search for "The C Programming language" also lists the 4th edition of Stroustrups book. ... And after searching via Google, the Amazon page now works. Weird!
So I believe you should more strongly recommend 1) and 2) and include what a later poster added about various frameworks: "BLAS, LAPACK, and maybe the whole CUDA family (CUDA, cuBLAS, cuDNN, etc)", see @madenine.
I took a class under Bjarne Stroustrup and he highly recommended Tour of C++ [0] as the best way to learn modern C++ for someone who already has some programming experience. That and of course, Effective C++[1] by Scott Meyers.
[0] - https://www.amazon.com/Tour-C-Depth/dp/0321958314
[1] - https://www.amazon.com/Effective-Specific-Improve-Programs-D...
1. Understanding of Deep Learning
2. General familiarity with the language
3. Understanding of packages/tools that will help you accomplish your goals. If this were python we'd be talking Numpy/TensorFlow/PyTorch/Keras/etc.
We're talking C++, I'm guessing you'll want to work with less abstraction than TF and the like, so BLAS, LAPACK, and maybe the whole CUDA family (CUDA, cuBLAS, cuDNN, etc).
Otherwise, TensorFlow, Caffe, CNTK, and other popular deep learning frameworks are available for C++, even though they might be better known and more heavily used in other languages.
PyTorch was apparently used in ~43% of the ICLR papers (a big prestigious deep learning conference) (https://www.reddit.com/r/MachineLearning/comments/9kys38/r_f...) and it's market share is growing at an incredible pace. I would expect it to beat Tensorflow in popularity at least for research very soon.
That's definitely where I would start if I absolutely had to do deep learning in C++. Otherwise I would do Python, which is likely used by 95% + of the research field.
Stroustrup and Meyers are the two most well known names. I buy all their books and I read them and practice all exercises and problems if the book has them.
This will kind of define how to go about doing it.
I can think of a few different reasons you might want to do this:
* You DL code in another framework is slow, and you have some custom C++ you want to write to speed it up. For this, you probably want to learn both high performance C++ and/or CUDA kernel development. You can probably avoid diving completely into C++, and just call a couple of optimized routines from python (and whatever other deep learning framework you are using in python). In this case, it might be worth looking into Tensor Comprehensions.
* You are taking someone elses DL algorithm and moving it to C++. In this case, you still don't need to be diving too much into C++, Ideally, you probably want to use something like ONNX and Caffe, and then call into them with some python wrapper. If you want the whole thing to be in C++, then you are still going to use something like ONNX and Caffe, but you will be writing mostly application code to support it.
* You want to help with the development of Pytorch, Tensorflow, Caffe or anther deep learning framework. In this case, you need to know CUDA kernel development, performant C++ idioms, and good C++ application development idioms.
These are pretty different flavors of C++, which makes it hard to give you a good answer.
Also Nvidia have a course https://courses.nvidia.com/courses/course-v1:DLI+C-AC-01+V1/...
But I am also curious why... this is deep-end stuff if you’ll forgive the pun. Why not start with Keras and only dip into the C++ if you need to?
Use Java and enjoy C++ like syntax with 80% equivalent performance (based on my experience)
Then try this library - https://deeplearning4j.org/
Make sure you learn how to use a debugger. You’ll need it.
It is very complete. Similar to pytorch (which borrowed some ideas from Dynet) and backed up by top academia (not big tech, hence its lower profile). It has a python wrapper as well, as everything nowadays.
If you are into deep learning for sequence to sequence (machine translation) Marian is also C++ centered. Fastest MT around. Complete (transformer and the like), extendable. Not that reading friendly from what I have heard.
Disclaimer: Python type of guy here.
I think it's also important to point out that it's not a great way to ask for help without giving some details about your background and your motives. If you've been programming in any language for quite a while, you'll need a completely different approach to "learning C++ for deep learning" than someone who's never programmed before. Likewise, if your goal is to work in the industry producing cutting edge work, you'll take a completely different approach than someone who just wants a rough understanding of the details just to satisfy your curiosity. So, without providing that context, you're going to get answers that are all over the place, almost all of which will be useless to you.
https://www.youtube.com/channel/UCbfYPyITQ-7l4upoX8nvctg