深度学习

深度学习

深度学习第二天

学习内容 : 神经网络

神经网络:输入层 -> 中间层 -> 输出层

激活函数:对于感知机,使用的是阶跃函数 其余时候可以使用sigmoid函数来出现 还有ReLU函数,大于0时候,输出自身,小于0的时候输出为0

sigmod函数相比于阶跃函数更加的平滑,感知机中流动的是0,1这种二元信号,而神经网络中流动的是连续的实数值信号;二者的共同点是当其小的时候靠近0,大的时候靠近1; 同时激活函数不能使用线型函数,因为如果是线型函数,那么神经层数的增加遍显得毫无意义 接下来介绍了矩阵乘法,即线性代数的相关知识 接下来介绍神经网络的结构

$a_1^{(1)} = \omega_1^{(1)}x1+\omega_2^{(1)}x2+\omega_3^{(1)}x3+b_1^{(1)}$

以下是包含激活函数的神经元的截图, ../alt text

输出层使用的激活函数一般根据具体问题来分析。回归问题用的是恒等函数,二分类问题用sigmoid函数,多元分类用softmax函数来实现

alt text 这就是softmax公式,用这个公式可以把输出的总和为1,但是在过程中会用到一些问题,比如指数的计算是有范围的,我们可以通过下式的增加和修改常数来实现使得计算结果不溢出。 alt text alt text

softmax函数又被称为是概率,他最终得出的输出和原始数据通过比较大小得到的输出是一致的。 所以在输出层,我们一般不需要进行softmax操作,毕竟计算也是需要时间的。但是在训练神经网络的时候,你需要让你的神经网络知道自己错了多少,错的有多离谱。通过softmax函数,存在所谓的跷跷板效应,统一度量衡(归一化),且存在比较光滑的可导性 想区分一些简单的概念:

  • 导数:导数 = 只有一条路时的坡度
  • 梯度:先求各个变量的偏导数,再将其组合成一个向量,这个向量指向参数变化最快的方向
  • 学习率:$W = W - 学习率*梯度$

在这个过程中,我们想实现的是让损失函数往小的方向发展

损失函数

在此过程中,我们使用的是独热码,使用我们可以提取出所预测目标的参数值,如果是索引,那直接取这个参数的预测概率即可。

从而引入了一个检测数的一个训练好的神经网络,然后让你进行一个简简单单的体验。 在此过程中所学习了很多的python语法,比如

sys.path.append(os.pardir)
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

展平的意义是因为神经网络不能处理多纬的数据,所以需要将28*28的图片数据转化为线形的数组

img = x_train[0]           # 取出第一张图的数据
print(img.shape)           # 输出 (784,) -> 这就是刚才 flatten=True 的结果

img = img.reshape(28, 28)  # 【关键步】把图像的形状变为原来的尺寸
print(img.shape)           # 输出 (28, 28) -> 变回正方形
def img_show(img):
    pil_img = Image.fromarray(np.uint8(img))
    pil_img.show()

img_show(img)

np,unit8(img)是为了实现将图片转化为合适的图片像素,

Image.fromarray(…):把 Numpy 的数组(纯数字矩阵)转换成 PIL 的图像对象。

os (Operating System): 它的作用:和你的操作系统(Windows/Mac/Linux)打交道。

你可以把它想象成 Python 里的 “文件资源管理器”或“命令行终端”。凡是跟文件、文件夹、路径、环境变量有关的操作,都找它。

常用功能:

os.getcwd(): 告诉我当前在哪里?(Get Current Working Directory)

os.mkdir('新文件夹'): 帮我建个文件夹。

os.path.exists('a.jpg'): 看看这个文件存不存在?

在你代码中的作用 (os.pardir):

pardir 是 Parent Directory(父目录/上一级目录)的缩写。

在大多数系统里,它等同于字符串 ’..’。

意思就是: “指代当前文件夹的上一层”。

  1. sys (System-specific parameters)

它的作用:和 Python 解释器(Python 程序本身)打交道。

你可以把它想象成 Python 的**“系统设置”或“控制面板”**。凡是跟 Python 运行环境、模块搜索路径、解释器版本有关的,都找它。

常用功能:

sys.version: 告诉我现在的 Python 是几点几版本?

sys.exit(): 立刻强制退出程序,不跑了。

sys.argv: 获取命令行运行时输入的参数。

非常重要: 当你写 import xxx 时,Python 不会全盘扫描你的硬盘,它只会去 sys.path 列表里列出的那些文件夹里找 xxx.py。如果这些文件夹里都没有,它就报错说找不到。

    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)

在这里我们使用的是让其正则化,这样就可以实现在sigmod的中间导数比较大的区域进行计算,从而会避免梯度消失的风险

在训练过程中我们可以使用矩阵进行计算,即一次性传入多个输入数据

batch_size = 100 # 批数量:每次打包处理 100 张图片
accuracy_cnt = 0 # 计数器:用来记录一共猜对了多少张

# 循环遍历数据集 x
# range(start, end, step):从0开始,每次跳跃 batch_size (100) 步
# 比如:i 会依次变成 0, 100, 200, 300...
for i in range(0, len(x), batch_size):
    
    # 1. 取出一批数据
    # x[i : i+batch_size] 是切片操作
    # 比如第1轮:取出 x[0:100] 这100张图
    # 比如第2轮:取出 x[100:200] 这100张图
    x_batch = x[i:i+batch_size]
    
    # 2. 批量推理(预测)
    # 把这 100 张图一次性扔给神经网络
    # y_batch 的形状是 (100, 10) -> 100张图,每张图有10个类别的概率
    y_batch = predict(network, x_batch)
    
    # 3. 找出最大概率的索引(获取预测结果)
    # axis=1 非常关键!表示“沿着行”找最大值。
    # 因为每一行代表一张图片,我们要分别找出这100张图各自概率最高的那个数字。
    # 结果 p 是一个长度为 100 的数组,比如 [7, 2, 1, 0, 4, ...]
    p = np.argmax(y_batch, axis=1)
    
    # 4. 对比答案并统计
    # t[i:i+batch_size] 取出这 100 张图对应的标准答案(标签)
    # (p == t[...]) 会生成一个布尔数组,比如 [True, False, True, ...]
    # np.sum() 会把 True 当作 1,False 当作 0 进行累加
    # 算出来的结果就是这一批里猜对的个数,加到总计数器里
    accuracy_cnt += np.sum(p == t[i:i+batch_size])

# 循环结束后,accuracy_cnt 就是整个数据集中预测正确的总数量
# 最后通常会算准确率: float(accuracy_cnt) / len(x)