源码笔记【仅为个人笔记记录】

第三章

sigmoid函数

# coding: utf-8
import numpy as np
import matplotlib.pylab as pltdef sigmoid(x):return 1 / (1 + np.exp(-x))    X = np.arange(-5.0, 5.0, 0.1)
Y = sigmoid(X)plt.plot(X, Y)
plt.ylim(-0.1, 1.1)
plt.show()

阶跃函数

# coding: utf-8
import numpy as np
import matplotlib.pylab as pltdef step_function(x):return np.array(x > 0, dtype=int)X = np.arange(-5.0, 5.0, 0.1)
Y = step_function(X)
plt.plot(X, Y)
plt.ylim(-0.1, 1.1)  # 指定图中绘制的y轴的范围
plt.show()

ReLU函数

# coding: utf-8
import numpy as np
import matplotlib.pylab as pltdef relu(x):return np.maximum(0, x)x = np.arange(-5.0, 5.0, 0.1)
y = relu(x)plt.plot(x, y)
plt.ylim(-1.0, 5.5)
plt.show()

MNIST数据集的显示

# coding: utf-8import numpy as np
from dataset.mnist import load_mnist
from PIL import Imageimport sys
import os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定def img_show(image):pil_img = Image.fromarray(np.uint8(image))pil_img.show()(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)# 读取训练集中的第一张图片
img = x_train[0]
# 读取训练集中的第一张图片的标签
label = t_train[0]
print(label)  # 5print(img.shape)  # (784,)
img = img.reshape(28, 28)  # 把图像的形状变为原来的尺寸
print(img.shape)  # (28, 28)img_show(img)


使用已训练好的参数进行手写数字图片的预测

# coding: utf-8
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmaximport sys
import os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定# 获取训练、测试数据
# x:图片
# t:标签
def get_data():(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)return x_test, t_test# 获取已训练好的网络参数
def init_network():with open("sample_weight.pkl", 'rb') as f:network = pickle.load(f)return network# 进行图片的预测
def predict(network, x):# 参数设置W1, W2, W3 = network['W1'], network['W2'], network['W3']b1, b2, b3 = network['b1'], network['b2'], network['b3']# 输入 + 两层层隐藏层 + 输出层# 输入 1 * 784 (784 = 28 * 28)# 第一层 50个神经元 784 * 50# 第二层 100个神经元 50 * 100# 输出层 10个神经元 100 * 10a1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2z2 = sigmoid(a2)a3 = np.dot(z2, W3) + b3y = softmax(a3)# 返回一个1*10的数组# 表示10个分类对应的概率return yx, t = get_data()
network = init_network()
print("***")
print(network['W1'].shape)
print("***")
print(network['W2'].shape)
accuracy_cnt = 0
print(x[0].shape)
for i in range(len(x)):y = predict(network, x[i])p= np.argmax(y) # 获取概率最高的元素的索引if p == t[i]:accuracy_cnt += 1print("Accuracy:" + str(float(accuracy_cnt) / len(x)))

使用已训练好的参数进行手写数字图片的预测(批处理)

区别:每次预测是使用多个图片同时进行预测

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmaxdef get_data():(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)return x_test, t_testdef init_network():with open("sample_weight.pkl", 'rb') as f:network = pickle.load(f)return networkdef predict(network, x):w1, w2, w3 = network['W1'], network['W2'], network['W3']b1, b2, b3 = network['b1'], network['b2'], network['b3']a1 = np.dot(x, w1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, w2) + b2z2 = sigmoid(a2)a3 = np.dot(z2, w3) + b3y = softmax(a3)return yx, t = get_data()
network = init_network()batch_size = 100 # 批数量
accuracy_cnt = 0for i in range(0, len(x), batch_size):x_batch = x[i:i+batch_size]y_batch = predict(network, x_batch)p = np.argmax(y_batch, axis=1)accuracy_cnt += np.sum(p == t[i:i+batch_size])print("Accuracy:" + str(float(accuracy_cnt) / len(x)))
# Accuracy:0.9352

第四章

损失函数

均方误差

交叉熵误差

导数(一维)

# coding: utf-8
import numpy as np
import matplotlib.pylab as pltdef numerical_diff(f, x):h = 1e-4 # 0.0001return (f(x+h) - f(x-h)) / (2*h)def function_1(x):return 0.01*x**2 + 0.1*x def tangent_line(f, x):d = numerical_diff(f, x)print(d)y = f(x) - d*xreturn lambda t: d*t + yx = np.arange(0.0, 20.0, 0.1)
y = function_1(x)
plt.xlabel("x")
plt.ylabel("f(x)")tf = tangent_line(function_1, 5)
y2 = tf(x)plt.plot(x, y)
plt.plot(x, y2)
plt.show()

# coding: utf-8
# cf.http://d.hatena.ne.jp/white_wheels/20100327/p3
import numpy as np
import matplotlib.pylab as plt
from mpl_toolkits.mplot3d import Axes3Ddef _numerical_gradient_no_batch(f, x):h = 1e-4 # 0.0001grad = np.zeros_like(x)for idx in range(x.size):tmp_val = x[idx]x[idx] = float(tmp_val) + hfxh1 = f(x) # f(x+h)x[idx] = tmp_val - h fxh2 = f(x) # f(x-h)grad[idx] = (fxh1 - fxh2) / (2*h)x[idx] = tmp_val # 还原值return graddef numerical_gradient(f, X):if X.ndim == 1:return _numerical_gradient_no_batch(f, X)else:grad = np.zeros_like(X)for idx, x in enumerate(X):grad[idx] = _numerical_gradient_no_batch(f, x)return graddef function_2(x):if x.ndim == 1:return np.sum(x**2)else:return np.sum(x**2, axis=1)def tangent_line(f, x):d = numerical_gradient(f, x)print(d)y = f(x) - d*xreturn lambda t: d*t + yif __name__ == '__main__':x0 = np.arange(-2, 2.5, 0.25)x1 = np.arange(-2, 2.5, 0.25)X, Y = np.meshgrid(x0, x1)X = X.flatten()Y = Y.flatten()grad = numerical_gradient(function_2, np.array([X, Y]) )plt.figure()plt.quiver(X, Y, -grad[0], -grad[1],  angles="xy",color="#666666")#,headwidth=10,scale=40,color="#444444")plt.xlim([-2, 2])plt.ylim([-2, 2])plt.xlabel('x0')plt.ylabel('x1')plt.grid()plt.legend()plt.draw()plt.show()

使用梯度下降求解 f ( x ) = x 0 2 + x 1 2 f(x) = x_0^{2} + x_1^{2} f(x)=x02​+x12​的最小值

# coding: utf-8
import numpy as np
import matplotlib.pylab as plt
from gradient_2d import numerical_gradientdef gradient_descent(f, init_x, lr=0.01, step_num=100):x = init_xx_history = []for i in range(step_num):x_history.append( x.copy() )grad = numerical_gradient(f, x)x -= lr * gradreturn x, np.array(x_history)def function_2(x):return x[0]**2 + x[1]**2init_x = np.array([-3.0, 4.0])    lr = 0.1
step_num = 20
x, x_history = gradient_descent(function_2, init_x, lr=lr, step_num=step_num)plt.plot( [-5, 5], [0,0], '--b')
plt.plot( [0,0], [-5, 5], '--b')
plt.plot(x_history[:,0], x_history[:,1], 'o')plt.xlim(-3.5, 3.5)
plt.ylim(-4.5, 4.5)
plt.xlabel("X0")
plt.ylabel("X1")
plt.show()

个人理解

求一个函数在某一点的斜率

比如 f ( x ) = 0.01 x 2 + 0.1 x f(x) = 0.01x^2 + 0.1x f(x)=0.01x2+0.1x在点 x = 5 x=5 x=5的斜率

# coding: utf-8
import numpy as np
import matplotlib.pylab as plt# 计算f(x)在x的斜率
def numerical_diff(f, x):h = 1e-4 # 0.0001return (f(x+h) - f(x-h)) / (2*h)# 定义f(x)
def function_1(x):return 0.01*x**2 + 0.1*x # 返回f(x)在点x的切线方程
def tangent_line(f, x):# d:斜率d = numerical_diff(f, x)print(d)# y:偏移量y = f(x) - d*xreturn lambda t: d*t + yx = np.arange(0.0, 20.0, 0.1)
y = function_1(x)
plt.xlabel("x")
plt.ylabel("f(x)")tf = tangent_line(function_1, 5)
y2 = tf(x)plt.plot(x, y)
plt.plot(x, y2)
plt.show()

《深度学习入门 基于Python的理论与实现》书中代码笔记相关推荐

  1. 深度学习入门 基于Python的理论与实现

    作者:斋藤康毅 出版社:人民邮电出版社 品牌:iTuring 出版时间:2018-07-01 深度学习入门 基于Python的理论与实现

  2. 《深度学习入门——基于Python的理论与实现》笔记

    PS:写这篇博客主要是记录下自己认为重要的部分以及阅读中遇到的些问题,加深自己的印象. 附上电子书及源代码: 链接:https://pan.baidu.com/s/1f2VFcnXSSK-u3wuvg ...

  3. 深度学习入门-基于Python的理论入门与实现源代码加mnist数据集下载推荐

    深度学习入门-基于Python的理论入门与实现源代码加mnist数据集下载推荐 书籍封面 1-图灵网站下载 书里也说了,可以图灵网站下载https://www.ituring.com.cn/book/ ...

  4. 《深度学习入门-基于Python的理论与实现》学习笔记1

    <深度学习入门-基于Python的理论与实现>学习笔记1 第一章Python入门 Python是一个简单.易读.易记的编程语言,可以用类似于英语的语法进行编写程序,可读性高,且能写出高性能 ...

  5. 《深度学习入门--基于python的理论与实现》——斋藤康毅读书笔记

    <深度学习入门--基于python的理论与实现>读书笔记(第二章) 写在前面 第二章:感知机 2.1感知机是什么 2.2简单的逻辑电路 2.2.1与门(and gate) 2.2.2与非门 ...

  6. 深度学习入门基于Python的理论与实现_第一章_Python入门(原创笔记)

    前言 此书使用Python作为编程语言,尽可能地少使用外部库,从零开始实现深度学习的程序. 此书从简单的机器学习问题开始,最终实现一个能高精度地识别图像的系统. 此书以图像识别为主题,主要学习使用深度 ...

  7. python从入门到精通 邮电出版社_《人民邮电出版社Python深度学习入门:基于PYTHON的理论与实现》【价格 目录 书评 正版】_中国图书网...

    译者序 xiii 前言 xv 第 1 章 Python入门 1 1.1 Python是什么 1 1.2 Python的安装 2 1.2.1 Python版本 2 1.2.2 使用的外部库 2 1.2. ...

  8. 《深度学习入门——基于Python的理论与实现》斋藤康毅学习笔记(二)

    第二章 感知机 1逻辑门 错误:python 出现的异常 inconsistent use of tabs and spaces in indentation 意思是:在缩进中不一致地使用制表符和空格 ...

  9. 深度学习入门-基于Python的理论与实现-斋藤康毅(待续)

    神经网络的学习 损失函数 一般用均方误差和交叉熵误差函数 均方误差: 交叉熵误差函数: 基于im2col展开 因为老实做卷积,会有很多for循环,而且很慢 所以用im2col函数来避免使用for循环 ...

  10. 《深度学习入门——基于Python的理论与实现》斋藤康毅学习笔记(一)

    第一章 (只将自己有疑惑并得到解决的学习内容作以下笔记) 1.python解释器 1.1数组 错误:a[ : -1] 不是获取所有元素 修改:a[ : -1]表示获取从第一个元素到最后一个元素之间的元 ...

最新文章

  1. 【前端学习日记】用reveal.js实现制作网页幻灯片
  2. 【转】采购订单行项目检查增强
  3. 积分梯度:一种新颖的神经网络可视化方法
  4. python面向对象-4类的继承与方法的重载
  5. Opencv——图像膨胀
  6. 反思,今天总体感觉事情很简单,但项目比较多,没有掌握住很好的技巧,所以感觉很混乱
  7. linux共享内存变量 tiaojianbianliang,低压集抄系统中Linux共享内存使用分析
  8. ~~试除法分解质因数(附模板题)
  9. C++:数组的输入、排序与去重操作
  10. 计算机网络课后作业习题1
  11. 水晶报表相关官方软件下载
  12. 利用计算机网线传东西,2台电脑一根网线传文件(两台电脑直连网线做法)
  13. vue项目的elementui表格合并
  14. 图灵测试是人工智能的标准吗?
  15. Unity模拟经营类游戏Demo部分代码及技术总结
  16. 农行网上银行交电费痛苦经历
  17. 6款原型产品设计软件
  18. windows安装perl
  19. MySQL的TIMESTAMP数据类型
  20. php微擎Goto2C解密研究

热门文章

  1. 堆栈的区别及增长方向
  2. LPCSTR,LPCTSTR,LPCWSTR的区别
  3. 服务器五大相关基础知识【转】
  4. 2021年9月22日-忆阻神经网络综述
  5. 最新版本EasyRecovery15个人免费版电脑数据恢复工具
  6. 蓝桥杯泊松分酒java_蓝桥杯-泊松分酒 - steven_wjg的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. 七大视频剪辑软件,达人必备,你用过几个?
  8. 圣思园——Java SE Lesson 11
  9. Linux 下的dd命令使用详解以及dd if=/dev/zero of=的含义
  10. 日志工具类——Log