深度学习TF—3.神经网络全连接层

1147-柳同学

发表文章数:593

首页 » 算法 » 正文

一、数据集的加载

1.tf.data.Dataset.from_tensor_slices()

描述
它的作用是切分传入Tensor的第一个维度,生成相应的dataset。
将输入的张量的第一个维度看做样本的个数,沿其第一个维度将tensor切片,得到的每个切片是一个样本数据。实现了输入张量的自动切片。

输入数据可以是numpy格式,也可以是tensorflow的tensor的格式,函数会自动将numpy格式转为tensorflow的tensor格式
输入可以是一个tensor 或 一个tensor字典(字典的每个key对应的value是一个tensor,要求各tensor的
第一个维度相等) 或 一个tensor tuple(tuple 的每个元素是一个tensor,要求各tensor的第一个维度
相等)

# from_tensor_slices 为输入张量的每一行创建一个带有单独元素的数据集
ts = tf.constant([[1, 2], [3, 4]])
ds = tf.data.Dataset.from_tensor_slices(ts)   # [1, 2], [3, 4]

方法

  • shuffle—打乱
    shuffle-打散-注意:x和y的相对顺序不能打散
    可以利用idx来记录打散顺序,以确保x和y的相对顺序
    深度学习TF—3.神经网络全连接层

  • batch—多个样本数据转换成一个batch,非常有利于加速计算
    batch-读取batch个(x,y)
    深度学习TF—3.神经网络全连接层

  • map—转换(数据预处理)
    深度学习TF—3.神经网络全连接层

  • repeat—重复
    深度学习TF—3.神经网络全连接层

案例
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets

# 数据预处理
def prepare_mnist_features_and_labels(x,y):
    x = tf.cast(x,dtype=tf.float32) / 255.0
    y = tf.cast(y,dtype=tf.int64)
    y = tf.one_hot(y,depth=10)
    return x,y

# 数据集
# 数据集加载-->dataset-->ont_hot等数据预处理-->shuffle-->batchm
def mnist_dataset():
    (x,y),(x_val,y_val) = datasets.fashion_mnist.load_data()

    ds = tf.data.Dataset.from_tensor_slices((x,y))
    ds = ds.map(prepare_mnist_features_and_labels)
    ds = ds.shuffle(60000).batch(100)

    ds_val = tf.data.Dataset.from_tensor_slices((x_val,y_val))
    ds_val = ds_val.map(prepare_mnist_features_and_labels)
    ds_val = ds_val.shuffle(10000).batch(100)

    return ds,ds_val

if __name__ == '__main__':
    ds,ds_val = mnist_dataset()

2.keras.datasets—小型常用数据集的API接口

常用的数据集有:

  • boston housing
  • mnist/fashion mnist
  • cifar10/100
  • imdb
    深度学习TF—3.神经网络全连接层
    深度学习TF—3.神经网络全连接层

二、张量实战

深度学习TF—3.神经网络全连接层

  • 前向传播
  • 梯度下降
  • 评估/测试
# 将无关信息屏蔽掉
import os
# 取值有四个:0,1,2,3,分别对应INFO,WARNING,ERROR,FATAL
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets

# 加载数据集 x:[60k,28,28]  y:[60k]
(x, y), (x_test,y_test) = datasets.mnist.load_data()
# x: [0~255] => [0~1.]
x = tf.convert_to_tensor(x, dtype=tf.float32) / 255
y = tf.convert_to_tensor(y, dtype=tf.int32)

x_test = tf.convert_to_tensor(x_test, dtype=tf.float32) / 255
y_test = tf.convert_to_tensor(y_test, dtype=tf.int32)

print(x.shape, y.shape, x.dtype, y.dtype)
# 查看数据范围
print(tf.reduce_min(x), tf.reduce_max(x))
print(tf.reduce_min(y), tf.reduce_max(y))

# from_tensor_slices表示切分传入Tensor的第一个维度,生成相应的dataset
train_db = tf.data.Dataset.from_tensor_slices((x,y)).batch(128)
test_db = tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(128)

train_iter = iter(train_db)
test_iter = iter(test_db)

sample = next(train_iter)
print('batch:', sample[0].shape, sample[1].shape)      # batch: (128, 28, 28) (128,)


# 构建权值
# X: [b,784] => [b,256] => [b,128] => [b,10]
# W: [dim_in,dim_out]   b: [dim_out]
# truncated_normal表示正态分布,设置为均值为0,方差为0.1的范围,可解决梯度爆炸与梯度离散的情况
w1 = tf.Variable(tf.random.truncated_normal([784, 256], stddev=0.1))
b1 = tf.Variable(tf.zeros([256]))
w2 = tf.Variable(tf.random.truncated_normal([256, 128], stddev=0.1))
b2 = tf.Variable(tf.zeros([128]))
w3 = tf.Variable(tf.random.truncated_normal([128, 10], stddev=0.1))
b3 = tf.Variable(tf.zeros([10]))

lr = 1e-3
for epoch in range(100):         # 迭代整个数据集,一般次数越多,准确率越高
    for step, (x, y) in enumerate(train_db):        # for every batch
        # x:[128,28,28]  y:[128]
        # [b,28,28] => [b,28*28]
        x = tf.reshape(x, [-1, 28*28])

        # 求梯度
        # GradientTape默认只会跟踪类型为tf.Variable
        with tf.GradientTape() as tape:
            # x: [b, 28*28]
            # h1 = x@w1 + b1
            # [b, 784]@[784, 256] + [256] => [b, 256] + [256] => [b, 256] + [b, 256]
            h1 = x @ w1 + tf.broadcast_to(b1, [x.shape[0], 256])
            h1 = tf.nn.relu(h1)
            # [b, 256] => [b, 128]
            h2 = h1 @ w2 + b2
            h2 = tf.nn.relu(h2)
            # [b, 128] => [b, 10]
            out = h2 @ w3 + b3

            # compute loss
            # out: [b, 10]
            # y: [b] => [b, 10]
            y_onehot = tf.one_hot(y, depth=10)

            # mse = mean(sum(y-out)^2)
            # [b, 10]
            loss = tf.square(y_onehot - out)
            # mean: scalar
            loss = tf.reduce_mean(loss)

        # 计算梯度,返回对应的梯度列表
        grads = tape.gradient(loss, [w1, b1, w2, b2, w3, b3])
        # print(grads)
        # 更新可训练参数
        # w1.assign_sub表示原地更新,保持tf.Variable
        w1.assign_sub(lr * grads[0])
        b1.assign_sub(lr * grads[1])
        w2.assign_sub(lr * grads[2])
        b2.assign_sub(lr * grads[3])
        w3.assign_sub(lr * grads[4])
        b3.assign_sub(lr * grads[5])

        if step % 100 == 0:
            print(epoch,step, 'loss', float(loss))

    # test/evluation
    # [w1,b1,w2,b2,w3,b3]
    total_correct,total_num = 0,0
    for step,(x,y) in enumerate(test_db):
        # x:[b,28,28]-->[b,28*28]
        x = tf.reshape(x,[-1,28*28])

        # [b,784] => [b,256] => [b,128] => [b,10]
        h1 = tf.nn.relu(x@w1 + b1)
        h2 = tf.nn.relu(h1@w2 + b2)
        out = h2@w3 + b3

        # out:[b,10](R) --> [b,10](0,1)
        prob = tf.nn.softmax(out,axis=1)
        # [b,10] -> [b]  取出最大值所在的索引
        pred = tf.argmax(prob,axis=1)
        pred = tf.cast(pred,dtype=tf.int32)
        # y--> int32
        correct = tf.cast(tf.equal(pred,y),dtype=tf.int32)
        correct = tf.reduce_sum(correct)

        total_correct += int(correct)
        total_num += x.shape[0]

    # 准确率
    acc = total_correct / total_num
    print('准确率=',acc)

97 0 loss 0.040837474167346954
97 100 loss 0.04371170699596405
97 200 loss 0.039664216339588165
97 300 loss 0.040850065648555756
97 400 loss 0.04408892244100571
准确率= 0.8363
98 0 loss 0.040709733963012695
98 100 loss 0.04357054457068443
98 200 loss 0.03953211382031441
98 300 loss 0.04072430729866028
98 400 loss 0.04395816847681999
准确率= 0.837
99 0 loss 0.04058240354061127
99 100 loss 0.04343107342720032
99 200 loss 0.03940089792013168
99 300 loss 0.040600381791591644
99 400 loss 0.043828316032886505
准确率= 0.8376

三、神经网路全连接层

1.神经网络快速发展原因

  • 硬件提升
  • bigdata—数据量的提升使得网路性能提高,给AI时代带来了可能性
  • ReLU激活函数—较好的解决了梯度离散的现象((3~5)—>12)
  • Dropout
  • BatchNorm
  • ResNet—使得10层网络变成100+层网路具有了可能性
  • Initialization—神经网络初始化
  • 网络加速框架—TensorFlow/Pytorch

2.全连接层-keras.layers.Dense

深度学习TF—3.神经网络全连接层
深度学习TF—3.神经网络全连接层

3.多层全连接网络

深度学习TF—3.神经网络全连接层

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
from tensorflow import keras

x = tf.random.normal([2, 3])
# 多层全连接层
model = keras.Sequential([
    keras.layers.Dense(2, activation='relu'),
    keras.layers.Dense(2, activation='relu'),
    keras.layers.Dense(2)
])
model.build(input_shape=[None, 3])
# 查看网络结构
model.summary()

# [w1,b1,w2,b2,w3,b3]
for p in model.trainable_variables:
    print(p.name, p.shape)


Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                multiple                  8 = 3*2+2    
_________________________________________________________________
dense_1 (Dense)              multiple                  6 = 2*2+2    
_________________________________________________________________
dense_2 (Dense)              multiple                  6         
=================================================================
Total params: 20
Trainable params: 20
Non-trainable params: 0
_________________________________________________________________
dense/kernel:0 (3, 2)
dense/bias:0 (2,)
dense_1/kernel:0 (2, 2)
dense_1/bias:0 (2,)
dense_2/kernel:0 (2, 2)
dense_2/bias:0 (2,)

4.输出方式

  • y∈Rd—实数
  • y∈[0,1]

tf.sigmoid,二分类问题时常见
图片[0,255]—>[0,1]有利于神经网络优化

深度学习TF—3.神经网络全连接层

  • yi∈[0,1]—tf.nn.softmax
    深度学习TF—3.神经网络全连接层
    深度学习TF—3.神经网络全连接层
  • yi ∈ [-1,1] —tf.tanh
    深度学习TF—3.神经网络全连接层
    深度学习TF—3.神经网络全连接层

5.误差计算

  • MSE
    深度学习TF—3.神经网络全连接层
    深度学习TF—3.神经网络全连接层
  • 交叉熵损失函数—tf.losses.categorical_crossentropy
    深度学习TF—3.神经网络全连接层
    深度学习TF—3.神经网络全连接层

未经允许不得转载:作者:1147-柳同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《深度学习TF—3.神经网络全连接层》 发布于2021-02-23

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录