撒花!《图解深度学习》已开源,16 章带你无障碍深度学习,高中生数学就 ok!
红色石头的个人网站:www.redstonewill.com
今天给大家介绍一个深度学习入门和进阶的绝佳教程:《Grokking Deep Learning》,中文译名为:《图解深度学习》。这本书是由 Manning 出版社出版,并采用 MEAP(订阅更新方式),从 2016 年 8 月开始,一直采用不定期更新的方式放送。时至今日,这本书终于完本啦,完结撒花。本书主打入门教学,书中各种插画丰富生动,是学习深度学习的入门好书。
作者简介
这本书的作者 Andrew Trask 是 DeepMind 的科学家,同时也是 OpenMinded的负责人,博士毕业于牛津大学。
个人主页是:https://iamtrask.github.io/
书籍简介
这本书会教你的从直觉的角度深入学习的基础知识,这样你就可以了解机器如何使用深度学习进行学习。这本书没有重点学习框架,如 Torch、TensorFlow 或 Keras。相反,它的重点是教你熟悉框架背后的深层次学习方法。一切都将从头开始,只使用 Python 和 NumPy。这样,你就能理解训练神经系统的每一个细节。网络,而不仅仅是如何使用代码库。你应该把这本书当作掌握其中一个主要框架的必要条件。
该书总共分为两大部分,第一部分是介绍神经网络的基础知识,总共包含 9 章内容:
第二部分是介绍深度学习中的高级层和架构,总共包含 7 章内容:
《图解深度学习》最大的特点就是在调包类书籍泛滥的当下,这本书可以说是非常良心了,作者通过 10 多章的铺垫,最终完成了一个微型的深度学习库,这应该也是本书的最大价值。
书籍资源
《图解深度学习》已经开放了在线版阅读并开源了书籍中所有的源代码。
在线阅读地址:
https://livebook.manning.com/#!/book/grokking-deep-learning/brief-contents/v-12/
代码地址:
https://github.com/iamtrask/Grokking-Deep-Learning
本书所有的代码实现都是基于 Python,并没有简单地调用库。这样能够最大程度地帮助你理解深度学习中的概念和原理。例如,CNN 模型的 Python 实现:
import numpy as np, sys
np.random.seed(1)from keras.datasets import mnist(x_train, y_train), (x_test, y_test) = mnist.load_data()images, labels = (x_train[0:1000].reshape(1000,28*28) / 255,
y_train[0:1000])one_hot_labels = np.zeros((len(labels),10))
for i,l in enumerate(labels):
one_hot_labels[i][l] = 1
labels = one_hot_labelstest_images = x_test.reshape(len(x_test),28*28) / 255
test_labels = np.zeros((len(y_test),10))
for i,l in enumerate(y_test):
test_labels[i][l] = 1def tanh(x):
return np.tanh(x)def tanh2deriv(output):
return 1 - (output ** 2)def softmax(x):
temp = np.exp(x)
return temp / np.sum(temp, axis=1, keepdims=True)alpha, iterations = (2, 300)
pixels_per_image, num_labels = (784, 10)
batch_size = 128input_rows = 28
input_cols = 28kernel_rows = 3
kernel_cols = 3
num_kernels = 16hidden_size = ((input_rows - kernel_rows) *
(input_cols - kernel_cols)) * num_kernels# weights_0_1 = 0.02*np.random.random((pixels_per_image,hidden_size))-0.01
kernels = 0.02*np.random.random((kernel_rows*kernel_cols,
num_kernels))-0.01weights_1_2 = 0.2*np.random.random((hidden_size,
num_labels)) - 0.1def get_image_section(layer,row_from, row_to, col_from, col_to):
section = layer[:,row_from:row_to,col_from:col_to]
return section.reshape(-1,1,row_to-row_from, col_to-col_from)for j in range(iterations):
correct_cnt = 0
for i in range(int(len(images) / batch_size)):
batch_start, batch_end=((i * batch_size),((i+1)*batch_size))
layer_0 = images[batch_start:batch_end]
layer_0 = layer_0.reshape(layer_0.shape[0],28,28)
layer_0.shapesects = list()
for row_start in range(layer_0.shape[1]-kernel_rows):
for col_start in range(layer_0.shape[2] - kernel_cols):
sect = get_image_section(layer_0,
row_start,
row_start+kernel_rows,
col_start,
col_start+kernel_cols)
sects.append(sect)expanded_input = np.concatenate(sects,axis=1)
es = expanded_input.shape
flattened_input = expanded_input.reshape(es[0]*es[1],-1)kernel_output = flattened_input.dot(kernels)
layer_1 = tanh(kernel_output.reshape(es[0],-1))
dropout_mask = np.random.randint(2,size=layer_1.shape)
layer_1 *= dropout_mask * 2
layer_2 = softmax(np.dot(layer_1,weights_1_2))for k in range(batch_size):
labelset = labels[batch_start+k:batch_start+k+1]
_inc = int(np.argmax(layer_2[k:k+1]) ==
np.argmax(labelset))
correct_cnt += _inclayer_2_delta = (labels[batch_start:batch_end]-layer_2)\
/ (batch_size * layer_2.shape[0])
layer_1_delta = layer_2_delta.dot(weights_1_2.T) * \
tanh2deriv(layer_1)
layer_1_delta *= dropout_mask
weights_1_2 += alpha * layer_1.T.dot(layer_2_delta)
l1d_reshape = layer_1_delta.reshape(kernel_output.shape)
k_update = flattened_input.T.dot(l1d_reshape)
kernels -= alpha * k_updatetest_correct_cnt = 0for i in range(len(test_images)):layer_0 = test_images[i:i+1]
# layer_1 = tanh(np.dot(layer_0,weights_0_1))
layer_0 = layer_0.reshape(layer_0.shape[0],28,28)
layer_0.shapesects = list()
for row_start in range(layer_0.shape[1]-kernel_rows):
for col_start in range(layer_0.shape[2] - kernel_cols):
sect = get_image_section(layer_0,
row_start,
row_start+kernel_rows,
col_start,
col_start+kernel_cols)
sects.append(sect)expanded_input = np.concatenate(sects,axis=1)
es = expanded_input.shape
flattened_input = expanded_input.reshape(es[0]*es[1],-1)kernel_output = flattened_input.dot(kernels)
layer_1 = tanh(kernel_output.reshape(es[0],-1))
layer_2 = np.dot(layer_1,weights_1_2)test_correct_cnt += int(np.argmax(layer_2) ==
np.argmax(test_labels[i:i+1]))
if(j % 1 == 0):
sys.stdout.write("\n"+ \
"I:" + str(j) + \
" Test-Acc:"+str(test_correct_cnt/float(len(test_images)))+\
" Train-Acc:" + str(correct_cnt/float(len(images))))
资源下载
最后,本书的的前 11 章电子版 pdf 和所有源代码已经打包完毕,需要的可以按照以下方式获取:
1.扫描下方二维码关注 “AI有道” 公众号
2.公众号后台回复关键词:GDL
撒花!《图解深度学习》已开源,16 章带你无障碍深度学习,高中生数学就 ok!相关推荐
- 《图解深度学习》图书及代码,16章带你无障碍深度学习
欢迎关注微信公众号[计算机视觉联盟] 获取更多前沿AI.CV资讯 [导读]Andrew Trask 是DeepMind的科学家,同时也是OpenMinded的负责人.他著作的<Grokking ...
- 一篇文章带你走进深度学习
文章目录 1.深度学习 1.1机器学习的基本流程 1.2深度学习的原理 1.3深度学习的应用 1.4计算机视觉 2.神经网络 2.1前向传播 2.1.1神经网络的基础 2.1.2损失函数 2.1.3S ...
- 西瓜书学习笔记——第十一章:特征选择与稀疏学习
第十一章:特征选择与稀疏学习 11.1 子集搜索与评价 子集搜索 特征子集评价 11.2 过滤式选择 Relief的相关统计量 11.3 包裹式选择 拉斯维加斯方法和蒙特卡罗方法: 11.4 嵌入式选 ...
- Spring MVC学习总结(16)——SpringMVC运行流程深度解析(含代码)
spring mvc简介与运行原理 Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器 ...
- 【算法导论】学习笔记——第16章 贪心算法
贪心算法是使做出的选择看起来都是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解.其实,这个定义旨在说明贪心算法必须伴随做出最优选择,如moving table,我们选择最大重叠数等等.当然 ...
- head first python豆瓣_Head First Python 学习心得(1-6章)
写在前面: "吾尝终日而思矣,不如须臾之所学也:吾尝跂而望矣,不如登高之博见也.登高而招,臂非加长也,而见者远:顺风而呼,声非加疾也,而闻者彰.假舆马者,非利足也,而致千里:假舟楫者,非能水 ...
- NIPS论文系列|复数域RNN,深层生成模型,DRL在MDP中的应用(已开源)
[1] Complex Gated Recurrent Neural Networks Moritz Wolter, Angela Yao University of Bonn, National U ...
- 撒花!《神经网络与深度学习》中文教程正式开源!全书 pdf、ppt 和代码一同放出...
点击上方"AI有道",选择"置顶"公众号 重磅干货,第一时间送达 红色石头之前在某乎上回答"机器学习该怎么入门"这个问题的时候,曾经给入门学 ...
- 单摄像头+深度学习实现伪激光雷达,代码已开源
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 上次介绍了双目摄像头如何估计深度的方案.老板表示两个摄像头还是有点贵呀,只用一个能不能做?嗯,没问题! ...
最新文章
- Nat. Commun. | 机器学习在化学发现中的应用
- 【设计模式】原型模式 ( 浅拷贝 | 深拷贝 | 原型与单例冲突 | 禁用 final )
- 兰州大学萃英学院计算机,兰州大学萃英学院.PDF
- 160 - 22 CarLitoZ.1
- Java编写的统计字符代码
- Go embed 简明教程
- 蠕虫病毒往往是通过进入计算机系统,2011年上海市高校计算机等级考试1级模拟卷题目...
- 再谈 document.documentElement 与 document.body 的 scrollWidth、offsetWidth、clientWidth
- 老表,教你一招啊!!!如何用python实现将csv文件快速导入数据库,建议收藏!!!
- Linux学习笔记(8)
- 苹果6s上市时间_苹果6s主板坏了的症状,苹果6s换主板多少钱
- 地理加权回归简易总结
- 产业互联网周报:博通610亿美元收购VMware;阿里云财报13年来首次年度盈利;华为:对所有供应商提出碳减排要求...
- 【python】微信朋友圈数据分析及可视化(爬虫+数据挖掘)
- 在Ubuntu20.04(Linux Mint)中同步通达信软件的自选股和画线数据
- luogu 2735 电网 皮克公式
- 【服务器】 Windows Server 2008 R2 配置HTTPS TLS1.2
- 3.3V的稳压管,结果电压变成了2.5V
- 一个程序员的个人感悟
- 汉诺塔自动解题动画中的iOS开发技巧