python深度学习--概念

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import pylab
from pandas import DataFrame, Series
def load_mnist(path='mnist.npz'):
    f = np.load(path)
    x_train, y_train = f['x_train'], f['y_train']
    x_test, y_test = f['x_test'], f['y_test']
    f.close()
    return (x_train, y_train), (x_test, y_test)
(train_images,train_labels),(test_images,test_labels)=load_mnist()
#标量----0维张量
#向量(数组)----1维张量
#矩阵----2维张量
#张量维度为张量轴的个数,可用ndim查看numpy张量的轴的个数
x=np.array(12)
print(x.ndim)
#深度学习处理的一般是 0D 到 4D 的张量,但处理视频数据时可能会遇到 5D 张量
print(x.dtype)#数据类型
print(x.shape)#张量形状

digit=train_images[4]
print(digit.shape)
# plt.imshow(digit,cmap=plt.cm.binary)
# plt.show()

#numpy的张量切片(tensor slicing):沿着某一轴选择张量的特定元素
my_slice=train_images[10:100]#默认第一个轴
print(my_slice.shape)

my_slice1=train_images[10:100,0:28,0:28]#分别沿着每个张量轴的指定索引切片

#通常来说,深度学习中所有数据张量的第一个轴(0 轴,因为索引从 0 开始)都是样本轴(samples axis,有时也叫样本维度)。
#深度学习模型不会同时处理整个数据集,而是将数据拆分成小批量。具体来看,下面是 MNIST 数据集的一个批量,批量大小为 128
batch=train_images[:128]
#对于这种批量张量,第一个轴(0轴)叫作批量轴(batch axis)或批量维度(batch dimension)

'''
现实世界中的数据张量

1.向量数据:2D 张量,形状为 (samples, features)。 
    e.g.   文本文档数据集,我们将每个文档表示为每个单词在其中出现的次数(字典中包含 20 000 个常见单词)。每个文档可以被编码为包含 20 000 个值的向量(每个值对应于 字典中每个单词的出现次数),整个数据集包含 500 个文档,因此可以存储在形状为 (500, 20000) 的张量中。
    
2.时间序列数据或序列数据:3D 张量,形状为 (samples, timesteps, features)。
    e.g. 推文数据集。我们将每条推文编码为 280 个字符组成的序列,而每个字符又来自于 128 个字符组成的字母表。在这种情况下,每个字符可以被编码为大小为 128 的二进制向量 (只有在该字符对应的索引位置取值为 1,其他元素都为 0)。那么每条推文可以被编码 为一个形状为 (280, 128) 的 2D 张量,而包含 100 万条推文的数据集则可以存储在一 个形状为 (1000000, 280, 128) 的张量中
    
3.图像:4D张量,形状为(samples, height, width, channels)或(samples, channels, height, width)。
    e.g. 128 张灰度图像组成的批 量可以保存在一个形状为(128, 256, 256, 1)的张量中,而 128 张彩色图像组成的批量则可以保存在一个形状为(128, 256, 256, 3)的张量中
    
4.视频:5D张量,形状为(samples, frames, height, width, channels)或(samples, frames, channels, height, width)。
    e.g. ,一个以每秒 4 帧采样的 60 秒YouTube 视频片段,视频尺寸为 144×256,这个视频共有 240 帧。4 个这样的视频片段组成的批量将保存在形状为(4, 240, 144, 256, 3) 的张量中

'''

'''
张量运算:深度神经网络学到的所有变换也都可以简化为数值数据张量上的一些张量运算(tensor operation),例如加上张量、乘以张量等。
    keras.layers.Dense(512, activation='relu')
    输入一个2D张量,返回另一个2D张量,即输入张量的新表示
    output=relu(dot(w,input) + b )
    relu(x) 是 max(x, 0)
'''

'''
广播:较小的张量会被广播(broadcast),以匹配较大张量的形状。
步骤:
(1) 向较小的张量添加轴(叫作广播轴),使其 ndim 与较大的张量相同。 
(2) 将较小的张量沿着新轴重复,使其形状与较大的张量相同。
np.dot()#点积
np.reshape()#变形
np.transpose()#转置
'''
x = np.random.random((64, 3, 32, 10))
y = np.random.random((32, 10))
# x 是形状为(64, 3, 32, 10)的随机张量 y 是形状为 (32, 10) 的随机张量
z = np.maximum(x, y)#numpy会自动使两个张量广播到相同维度

print(x.shape,y.shape,z.shape)

'''
深度学习的几何表示(举例)
通过深度学习,这一过程可以用三维空间中一系列简单的变换来实现,比如你用手指对纸球做的变换,每次做一个动作,让纸球恢复平整就是机器学习的内容:为复杂的、高度折叠的数据流形找到简洁的表示。 现在你应该能够很好地理解,为什么深度学习特别擅长这一点:它将复杂的几何变换逐步分解 为一长串基本的几何变换,这与人类展开纸球所采取的策略大致相同。深度网络的每一层都通过变换使数据解开一点点——许多层堆叠在一起,可以实现非常复杂的解开过程
'''

'''
深度学习的引擎:基于梯度的优化
例如下式:
output = relu(dot(W, input) + b) 
在这个表达式中,W 和 b 都是张量,均为该层的属性。它们被称为该层的权重(weight)或可训练参数(trainable parameter),分别对应 kernel 和 bias 属性。这些权重包含网络从观察训练数据中学到的信息

一开始,这些权重矩阵取较小的随机值,这一步叫作随机初始化(random initialization)。当然,W 和 b 都是随机的,relu(dot(W, input) + b)肯定不会得到任何有用的表示。虽然得到的表示是没有意义的,但这是一个起点。
下一步则是根据反馈信号逐渐调节这些权重。这 个逐渐调节的过程叫作训练,也就是机器学习中的学习。

训练循环:
    (1) 抽取训练样本 x 和对应目标 y 组成的数据批量。 
    (2) 在 x 上运行网络[这一步叫作前向传播(forward pass)],得到预测值 y_pred。 
    (3) 计算网络在这批数据上的损失,用于衡量 y_pred 和 y 之间的距离。 
--》(4) 更新网络的所有权重,使网络在这批数据上的损失略微下降。《考虑网络中某个权重系数,你怎么知道这个系数应该增大还是减小,以及变化多少》

    一种更好的方法是
        利用网络中所有运算都是可微(differentiable)的这一事实,计算损失    相对于网络系数的梯度(gradient),然后向梯度的反方向改变系数,从而使     损失降低。[梯度:张量运算的导数,多元函数(以张量作为输入)的导数]
        --------------
        假设有一个输入向量 x、一个矩阵 W、一个目标 y 和一个损失函数 loss。你可以用 W 来计算预测值 y_pred,然后计算损失,或者说预测值 y_pred 和目标 y 之间的距离
        y_pred = dot(W, x)
        loss_value = loss(y_pred, y) 
        如果输入数据 x 和 y 保持不变,那么这可以看作将 W 映射到损失值的函数。 
        loss_value = f(W) 
        张量 gradient(f)(W0) 是函数 f(W) = loss_value 在 W0 的导数
        ------------------
        
    (5)将参数沿着梯度的反方向移动一点,比如W -= step * gradient,从而使这批数据上的损失减小一点。
    
'''

'''
随机梯度下降(SGD):随机(stochastic)是指每批数据都是随机抽取的
        对于一个函数 f(x),你可以通过将 x 向导数的反方向移动一小步来减小 f(x) 的值。同样,对于张量的函数 f(W),你也可以通过将 W向梯度的反方向移动来减小 f(W),比如W1 = W0 - step * gradient(f)(W0),其中 step是一个很小的比例因子。也就是说,沿着曲率的反方向移动,直观上来看在曲线上的位置会更低。注意,比例因子 step 是必需的,因为 gradient(f)(W0) 只是 W0 附近曲率的近似值,不能离 W0 太远。[step:步长,学习率]
           
    此外,SGD 还有多种变体,其区别在于计算下一次权重更新时还要考虑上一次权重更新,而不是仅仅考虑当前梯度值,比如带动量的 SGD、Adagrad、RMSProp 等变体。这些变体被称为优化方法(optimization method)或优化器(optimizer)。其中动量的概念尤其值得关注,动量解决了 SGD 的两个问题:收敛速度和局部极小点.
    
    有一种有用的思维图像, 就是将优化过程想象成一个小球从损失函数曲线上滚下来。如果小球的动量足够大,那么它不会 卡在峡谷里,最终会到达全局最小点。动量方法的实现过程是每一步都移动小球,不仅要考虑当 前的斜率值(当前的加速度),还要考虑当前的速度(来自于之前的加速度)。这在实践中的是指, 更新参数 w 不仅要考虑当前的梯度值,还要考虑上一次的参数更新,其简单实现如下所示。

'''
# past_velocity = 0.
# momentum = 0.1#不变的动量因子
# while loss > 0.01:#优化循环
#     w, loss, gradient = get_current_parameters()
#     velocity = past_velocity * momentum - learning_rate * gradient
#     w = w + momentum * velocity - learning_rate * gradient
#     past_velocity = velocity
#     update_parameter(w)

'''
链式求导:反向传播算法
    链式法则(chain rule):(f(g(x)))' = f'(g(x)) * g'(x)。将链式法则应用于神经网络梯度值的计算,得到的算法叫作反向传播(backpropagation,有时也叫反式微分,reverse-mode differentiation)。反向传播从最终损失值开始,从最顶层反向作用至最底层,利用链式法则计算每个参数对损失值的贡献大小
'''

#神经网络入门
'''
简单的向量数据保存在形状为 (samples, features) 的 2D 张量中,通常用密集连接层[densely connected layer,也叫全连接层(fully connected layer)或密集层(dense layer),对应于 Keras 的 Dense 类]来处 理。

序列数据保存在形状为 (samples, timesteps, features) 的 3D张量中,通常用循环层(recurrent layer,比如 Keras 的 LSTM 层)来处理。

图像数据保存在4D张量中,通常用二维卷积层(Keras 的 Conv2D)来处理

'''
from keras import models,layers

#一、层
model=models.Sequential()
model.add(layers.Dense(32,input_shape=(784,)))#输入第一个维度(axis=1)大小为784的2D张量,返回第一个维度大小为32的张量,未指定第0轴即批量大小任意
model.add(layers.Dense(32))#其中第二层没有输入形状(input_shape)的参数,相反,它可以自动推导出输入形状等 于上一层的输出形状。

# 下面是用函数式 API 定义的相同模型。
input_tensor = layers.Input(shape=(784,))
x = layers.Dense(32, activation='relu')(input_tensor)
output_tensor = layers.Dense(10, activation='softmax')(x)
model = models.Model(inputs=input_tensor, outputs=output_tensor)

#二、模型:层构成的网络
    # 常见的网络拓扑结构如下:
    #     双分支(two-branch)网络
    #     多头(multihead)网络
    #     Inception 模块
    # 网络的拓扑结构定义了一个假设空间(hypothesis space)

#三、损失函数与优化器:配置学习过程的关键
    # 损失函数(目标函数)——在训练过程中需要将其最小化。它能够衡量当前任务是否已成功完成。
    # 优化器——决定如何基于损失函数对网络进行更新。它执行的是随机梯度下降(SGD)的某个变体。

    #具有多个输出的神经网络可能具有多个损失函数(每个输出对应一个损失函数)。但是,梯 度下降过程必须基于单个标量损失值。因此,对于具有多个损失函数的网络,需要将所有损失 函数取平均,变为一个标量值。

    # 构建的所有神经网络在降低损失函数时,一定要明智地选择目标函数,否则你将会遇到意想不到的副作用

# 对于二分类问题,你可以使用二元交叉熵(binary crossentropy)损失函数;对于多分类问题,可以用分类交叉熵(categorical crossentropy)损失函数;对于回归 问题,可以用均方误差(mean-squared error)损失函数;对于序列学习问题,可以用联结主义 时序分类(CTC,connectionist temporal classification)损失函数,等等。只有在面对真正全新的研究问题时,你才需要自主开发目标函数。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值