《深度学习》鱼书入门 学习笔记Day1

第一章 Python入门

1.3 Python解释器

  1. 列表

列表长度
len(a)

切片
索引两种方式:
0,1,2… 或者 …,-2,-1
a[x:y] 索引x到y,不包含y
a[x:] 索引x到最后
a[:y] 第一个到索引y,不包含y

  1. 字典

键值对
me = {a:b,c:d}

  1. 布尔型bool

True和False
运算符:and,or,not

  1. for语句

for … in …

1.4 类

class 类名:
	# 初始化,构造方法
	def __init__(self, 参数1, 参数2):
		self.参数 # 生成实例变量
	def 方法名(self, 参数1, 参数2):
		.......

1.5 NumPy

  1. 一维数组——向量

import numpy as np
x = np.array([1, 2, 3, 4])

  1. print(x) 打印
  2. type(x) 类型
  3. 基本算数运算,保证x和y元素个数相同
  1. 二维数组——矩阵,多维数组——张量

import numpy as np
A = np.array([1, 2], [3, 4], [5, 6])
print(A) 打印
A.shape 矩阵形状
A.dtype 矩阵中元素类型

  1. 广播

扩展实现不同形状数组运算

  1. 访问元素
  • 索引法访问单个元素

x = np.array([1, 2], [3, 4], [5, 6])
print(x) 直接打印一个二维数组
x[0][1] 索引操作访问矩阵中元素,如2

  • 标记法访问单个元素

除索引操作访问单个元素,还可以使用一维数组
x = np.array([1, 2], [3, 4], [5, 6])
x = x.flatten() 转换为一维数组
x[np,array([0,2,4])] 得到array([1,3,5])

for row in x:print(row) 访问每个元素,如[1,2]

1.6 Matplotlib

import matplotlib.pyplot as plt
from matplotlib.image import imread
plt.plot(x, y, label=“绘制图线标题”, linestlye=“绘制图线形状”)
plt.xlabel(“x轴名字”)
plt.ylabel(“y轴名字”)
plt.title(“标题名字”)
plt.legend() 图例
plt.show() 展示
img = imread(“路径”)
plt.imread(img)

第二章 感知机

2.1 基础知识

感知机的信号只有流和不流两种 0表示不传递信号,1表示传递信号

输入信号送往神经元,乘固定的权重,计算总和,超过阈值则激活
x1w1+x2w2>阈值,神经元被激活

与门 与非门 或门
异或门:(与非门)与(或门)

偏置b和权重w
偏置决定了神经元被激活的容易程度

2.2 多层感知机

第0层的两个神经元先接受输入信号,并将信号发送到第一层的神经元
第1层的神经元将信号发送至第二层的神经元,第二层神经元输出y

第三章 神经网络

3.1 基础知识

  1. 输入层——中间层——输出层
    层号从0开始
  2. x1和x2是输入信号,y是输出
    b是偏置——神经元被激活的容易程度
    w1和w2是权重——信号的重要程度

当w1x1+w2x2+b>0时,y=1,
当w1x1+w2x2+b<=0时,y=0

如图:

简化——引入新函数h(x)

3.2 激活函数

一、阶跃函数

  • 实数:
def step_f(x):
    if x > 0:
        return 1
    else:
        return 0
  • numpy数组——生成bool型变量:
def step_f(x):
	y = x > 0
	return y.astype(np.int)

x为numpy整型数组,不等号运算使其变为bool型
再通过astype(np.int)转换为想要转换的数据类型

import numpy as np
import matplotlib.pyplot as plt
def fun(x):
    return np.array(x > 0, dtype=np.int64)
x = np.arange(-5.0, 5.0, 0.1)
y = fun(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()

二、sigmoid函数

支持numpy数组直接运算——广播

def sigmoid(x):
	return 1/(1 + np.exp(-x))
import numpy as np
import matplotlib.pyplot as plt


def 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()

三、二者比较

  1. 不同点
  • 平滑性不同
  • sigmoid可以返回实数——神经网络流动的是连续的实数值信号
  • 阶跃函数只能返回0或1——感知机流动的的是0或1的二元信号
  1. 相同点
  • 形状相似
  • 输出信号重要,输出的值大
  • 输出信号的值在0和1之间

四、ReLU函数

当x>0时,h(x)=x
当x<=0时,h(x)=0

import numpy as np
import matplotlib.pyplot as plt


def 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.0)
plt.show()

3.3 多维数组的运算

一、多维数组

x = np.array([1,2,3,4])
np.ndim(x)——数组的维数,1
x.shape——矩阵的形状,(4,)
x.shape[i]——x.shape是一个元组,i=0时返回4

x = np.array([1,2],[3,4],[5,6])
np.ndim(x)——数组的维数,2(行和列)
x.shape——矩阵的形状,(3,2)
x.shape[i]——x.shape是一个元组

np.dot(a,b)——矩阵乘法

  • 一维——数组
  • 二维——矩阵
  • 三维——张量

3.4 三层神经网络的实现

一、符号确认

  1. 权重 w ij(k)
  • i表示w后一层的第i个神经元
  • j表示w前一层的第j个神经元
  • k表示第k层的权重
  1. 神经元a i(j)
  • i表示第i个神经元
  • j表示第j层的神经元
  1. 偏置
  • 权重bi(1)中i的个数取决于后一层神经元的数量,
  • 前一层只有一个神经元1

二、原理

  1. 输入层到第一层——由x1 x2 x3得到a1 a2 a3

A = XW + B
A表示a1(1),a2(1),a3(1)
X表示x1,x2
W表示w11(1) w21(1) w31(1)
w12(1) w22(1) w32(1)
B表示b1(1),b2(1),b3(1)

第一层sigmoid激活,由a1(1),a2(1),a3(1)得到z1(1),z2(1),z3(1)

  1. 第一层到第二层

A = XW + B
A表示a1(2),a2(2)
X表示z1(1),z2(1),z3(1)
W表示w11(2) w21(2)
w12(2) w22(2)
w13(2) w23(2)
B表示b1(2),b2(2)

第二层sigmoid激活,由a1(2),a2(2)得到z1(1),z2(1)

  1. 第二层到输出层

A = XW + B
A表示a1(3),a2(3)
X表示z1(2),z2(2)
W表示w11(3) w21(3)
w12(3) w22(3)
B表示b1(3),b2(3 )

输出层使用恒等函数激活,输入信号会原封不动输出

三、代码

import numpy as np


def sigmoid(x):
    return 1 / (1 + np.exp(-x))


def init_network():
    def init_network():
        network = {}
        # 输入层到第一层 W是2*3,b是1*3
        network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
        network['b1'] = np.array([0.1, 0.2, 0.3])
        # 第一层到第二层 W是3*2 b是1*2
        network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
        network['b2'] = np.array([0.1, 0.2])
        # 第二层到输出层 W是2*2 b是1*2
        network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
        network['b3'] = np.array([0.1, 0.2])
        return network


def forward(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) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y = a3
    return y


network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y)

3.5 输出层的设计

softmax函数

  • 输出函数,回归问题(根据某个输入预测一个连续的数值的问题)使用恒等函数
  • 分类问题使用softmax函数
def softmax(a):
    exp_a = np.exp(a)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    return y

指数函数过大——溢出问题
改进:指数函数运算中加入一个任意的相同的常数值

def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a-c)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    return y

特征:

  1. 输出为0到1的实数
  2. 输出值总和为1——概率
  3. 输出层的神经元数量根据待解决的问题决定

3.6 手写数字识别

识别精度:即在多大程度上能够正确分类。(可以使用:正确分类数/分类总数 来进行计算)
正规化:将数据限制到某一范围内。
预处理:对神经网络的输入数据进行某种既定的转换。
数据白化:将数据整体的分布形状均匀化的方法。
批处理:对数据进行打包处理。好处:减轻数据总线的符合,即相对于数据读入可以将更多的时间用于计算。

from PIL import Image #图像显示模块
img=img.shape #假设这里为(784,)
img=img.reshape(28,28) #改变数组形状
img=Image.fromarray(imgnp.uint(img)) #将numpy数组转化为PIL用的数据对象
img.show()#展示
#---------分割-----------
y=np.array([1,2,3])#获取最大元素的索引,在输出函数的时候可以用来判断最后的分类类别。
print(np.argmax(y,axis=1))#axis=1返回列索引
>>>2
#---------分割-----------
range(start,end,step)#[start,end)间隔为step
#---------分割-----------
y=np.array([1,2,3])
t=np.array([1,1,1])
print(y==t)#array支持比较运算符
>>>[True,False,Flase]
print(np.sum(y==t))
>>>1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值