21、(DNN)深度神经网络

一、神经网络(DNN算法)

实例网站:[http://playground.tensorflow.org

深度神经.png
image.png
image.png
image.png
  • 激活函数:relu,sigmoid,
  • 作用:由直变曲
  • 值代表线性问题

    image.png
    image.png

三、神经网络算法代码实现

  • prefetch ---预先取出数据,加快计算的数据、
    *什么是激活函数?激活函数有哪些?

(1)代码--自己写多层隐藏层

import warnings
warnings.filterwarnings('ignore')
import numpy as np

import tensorflow as tf

from tensorflow.keras.datasets import mnist

加载数据,处理数据

(X_train,y_train),(X_test,y_test) = mnist.load_data()

# 归一化
X_train = (X_train/255.0).astype(np.float32)
X_test = (X_test/255.0).astype(np.float32)

# reshape,二维的数据,矩阵运算了
X_train = X_train.reshape(-1,784)
X_test = X_test.reshape(-1,784)

# one-hot 概率表示类别
y_train = tf.one_hot(y_train,depth=10)
y_test = tf.one_hot(y_test,depth=10)

# prefetch fetch取出来的意思,预先取出来,更快,加快计算速度
# 训练数据
data_train = tf.data.Dataset.from_tensor_slices((X_train,y_train)).repeat(50).shuffle(1000).batch(512).prefetch(1)
# 测试数据,验证模型好坏!每训练50次,取出一批测试数据,进行测试准确率
data_test = tf.data.Dataset.from_tensor_slices((X_test,y_test)).repeat(10).shuffle(1000).batch(512).prefetch(1)

构建模型

# 系数,3层隐含层
# 数据 X_train 样本,特征 784
# 第一层隐含层,多少个神经元:256个神经元,相当于线性方程,矩阵运算批量的计算
w1 = tf.Variable(tf.random.normal(shape = [784,256],stddev = 0.01))
b1 = tf.Variable(tf.random.normal(shape = [256],stddev = 0.01))

# 第二层隐含层,给256个神经元
w2 = tf.Variable(tf.random.normal(shape = [256,256],stddev = 0.01))
b2 = tf.Variable(tf.random.normal(shape = [256],stddev = 0.01))

#第三层,使用第二层数据的输出为数据
# 第三层给,512个神经元
w3 = tf.Variable(tf.random.normal(shape = [256,512],stddev = 0.01))
b3 = tf.Variable(tf.random.normal(shape = [512],stddev = 0.01))

# 输出层,输出几个类别,10分类问题,确定了,输出的类别是10个

out_w = tf.Variable(tf.random.normal(shape = [512,10],stddev = 0.01))
out_b = tf.Variable(tf.random.normal(shape = [10],stddev = 0.01))

def dnn(X):#深度神经网络
#     第一层的连接:矩阵运算
    d1 = tf.matmul(X,w1) + b1
    d1 = tf.nn.relu(d1) # 激活函数
    
#     第二层的连接,矩阵运算
    d2 = tf.nn.relu(tf.matmul(d1,w2) + b2)
    
#     第三层的连接,矩阵预算
    d3 = tf.nn.relu(tf.matmul(d2,w3) + b3)
    
#     输出层连接,矩阵运算,softmax概率问题
    y_pred = tf.nn.softmax(tf.matmul(d3,out_w) + out_b)
    return y_pred

# 损失函数,样本平均cross_entropy交叉熵
def cross_entropy(y_true,y_pred):
    y_pred = tf.clip_by_value(y_pred,1e-9,1.0)
    loss = tf.reduce_mean(tf.reduce_sum(y_true*tf.math.log(1/y_pred),axis = -1))#数据是二维的
    return loss

# 计算准确率
def accuracy(y_pred,y_true):#y_和y_true,都是tensor
    y_pred = y_pred.numpy().argmax(axis = -1)
    y_true = y_true.numpy().argmax(axis = -1)
    acc = (y_pred == y_true).mean()
    return acc #返回准确率
# 优化算法,梯度下降
# 学习率,太小,学的太慢!
sgd = tf.optimizers.SGD(learning_rate=0.2)

定义运行方法

def run_optimizer(X_train,y_train):
    with tf.GradientTape() as g:
        y_pred = dnn(X_train)
        loss = cross_entropy(y_train,y_pred)
    gradients = g.gradient(loss,[w1,b1,w2,b2,w3,b3,out_w,out_b])
    sgd.apply_gradients(zip(gradients,[w1,b1,w2,b2,w3,b3,out_w,out_b]))

for循环运行代码

for i,(X_train,y_train) in enumerate(data_train.take(1000),1):
    run_optimizer(X_train,y_train)
    if i%10 == 0:
        #计算准确率
        for (X_test,y_test) in data_test.take(1):
            y_pred = dnn(X_test)
            acc = accuracy(y_pred,y_test)
            print('执行次数:%d。准确率是:%0.4f'%(i,acc))
执行次数:10。准确率是:0.1348
执行次数:20。准确率是:0.1191
执行次数:30。准确率是:0.1133
执行次数:40。准确率是:0.1270
执行次数:50。准确率是:0.1152
执行次数:60。准确率是:0.1270
执行次数:70。准确率是:0.1016
执行次数:80。准确率是:0.1328
执行次数:90。准确率是:0.1211
执行次数:100。准确率是:0.1191
执行次数:110。准确率是:0.1406
执行次数:120。准确率是:0.1289
执行次数:130。准确率是:0.1309
执行次数:140。准确率是:0.1348
执行次数:150。准确率是:0.1367
执行次数:160。准确率是:0.1309
执行次数:170。准确率是:0.1191
执行次数:180。准确率是:0.1113
执行次数:190。准确率是:0.1250
执行次数:200。准确率是:0.1191
执行次数:210。准确率是:0.1309
执行次数:220。准确率是:0.1348
执行次数:230。准确率是:0.1191
执行次数:240。准确率是:0.1074
执行次数:250。准确率是:0.1035
执行次数:260。准确率是:0.1328
执行次数:270。准确率是:0.1250
执行次数:280。准确率是:0.1035
执行次数:290。准确率是:0.1348
执行次数:300。准确率是:0.1211
执行次数:310。准确率是:0.1367
执行次数:320。准确率是:0.1426
执行次数:330。准确率是:0.1309
执行次数:340。准确率是:0.1426
执行次数:350。准确率是:0.1973
执行次数:360。准确率是:0.2012
执行次数:370。准确率是:0.2129
执行次数:380。准确率是:0.2285
执行次数:390。准确率是:0.2461
执行次数:400。准确率是:0.3496
执行次数:410。准确率是:0.4570
执行次数:420。准确率是:0.3867
执行次数:430。准确率是:0.4336
执行次数:440。准确率是:0.5566
执行次数:450。准确率是:0.5293
执行次数:460。准确率是:0.5938
执行次数:470。准确率是:0.5664
执行次数:480。准确率是:0.6406
执行次数:490。准确率是:0.5977
执行次数:500。准确率是:0.5488
执行次数:510。准确率是:0.6602
执行次数:520。准确率是:0.5996
执行次数:530。准确率是:0.7031
执行次数:540。准确率是:0.7227
执行次数:550。准确率是:0.7520
执行次数:560。准确率是:0.7246
执行次数:570。准确率是:0.8223
执行次数:580。准确率是:0.8047
执行次数:590。准确率是:0.8301
执行次数:600。准确率是:0.8105
执行次数:610。准确率是:0.7988
执行次数:620。准确率是:0.8633
执行次数:630。准确率是:0.8047
执行次数:640。准确率是:0.8594
执行次数:650。准确率是:0.8516
执行次数:660。准确率是:0.8594
执行次数:670。准确率是:0.8887
执行次数:680。准确率是:0.8594
执行次数:690。准确率是:0.8555
执行次数:700。准确率是:0.8848
执行次数:710。准确率是:0.8789
执行次数:720。准确率是:0.8574
执行次数:730。准确率是:0.8848
执行次数:740。准确率是:0.9023
执行次数:750。准确率是:0.8711
执行次数:760。准确率是:0.8945
执行次数:770。准确率是:0.8242
执行次数:780。准确率是:0.8887
执行次数:790。准确率是:0.8906
执行次数:800。准确率是:0.8945
执行次数:810。准确率是:0.9023
执行次数:820。准确率是:0.8984
执行次数:830。准确率是:0.9102
执行次数:840。准确率是:0.9160
执行次数:850。准确率是:0.8906
执行次数:860。准确率是:0.9141
执行次数:870。准确率是:0.9277
执行次数:880。准确率是:0.9023
执行次数:890。准确率是:0.9141
执行次数:900。准确率是:0.9180
执行次数:910。准确率是:0.9258
执行次数:920。准确率是:0.9238
执行次数:930。准确率是:0.9277
执行次数:940。准确率是:0.9297
执行次数:950。准确率是:0.9336
执行次数:960。准确率是:0.9199
执行次数:970。准确率是:0.9277
执行次数:980。准确率是:0.9336
执行次数:990。准确率是:0.9336
执行次数:1000。准确率是:0.9199

(2)代码(tensorflow封装好的):

import warnings
warnings.filterwarnings('ignore')
import numpy as np

import tensorflow as tf

from tensorflow.keras.datasets import mnist
from tensorflow.keras import Model,layers
# model 模型--就是算法数学的公式,深度神经网络,3层的隐含层
# layers 定义好的层
(X_train,y_train),(X_test,y_test) = mnist.load_data()

# 归一化
X_train = (X_train/255.0).astype(np.float32)
X_test = (X_test/255.0).astype(np.float32)

# reshape,二维的数据,矩阵运算了
X_train = X_train.reshape(-1,784)
X_test = X_test.reshape(-1,784)

# one-hot 概率表示类别
y_train = tf.one_hot(y_train,depth=10)
y_test = tf.one_hot(y_test,depth=10)

# prefetch fetch取出来的意思,预先取出来,更快,加快计算速度
# 训练数据
data_train = tf.data.Dataset.from_tensor_slices((X_train,y_train)).repeat(50).shuffle(1000).batch(512).prefetch(1)
# 测试数据,验证模型好坏!每训练50次,取出一批测试数据,进行测试准确率
data_test = tf.data.Dataset.from_tensor_slices((X_test,y_test)).repeat(10).shuffle(1000).batch(512).prefetch(1)

构建模型--tf2.0写法,损失,准确率\学习率

class Dnn(Model):
#     layers 会自动的帮助我们写出变量
#     变量是对应神经元的数量
    def __init__(self):
        super(Dnn,self).__init__() #调用父类的方法
        self.h1=layers.Dense(256,activation="relu") # Dense相当于矩阵运算128神经元
        self.h2=layers.Dense(256,activation="relu")
        self.h3=layers.Dense(512,activation="relu")
        self.out=layers.Dense(10,activation=tf.nn.softmax)
#       #tf.nn.softmax--转为概率的问题
    def call(self,x,is_training=False): 
        # is_training=False区分训练和测试的情况
        x=self.h1(x)
        x=self.h2(x)
        x=self.h3(x)
        y_pred=self.out(x)
        return y_pred
dnn=Dnn()
# 损失函数,样本平均cross_entropy交叉熵
def cross_entropy(y_true,y_pred):
    y_pred = tf.clip_by_value(y_pred,1e-9,1.0)
    loss = tf.reduce_mean(tf.reduce_sum(tf.multiply(y_true,tf.math.log(1/y_pred)),axis=1))#数据是二维的
    return loss


# 声明准确率
def accuracy(y_pred,y_true):#y_和y_true,都是tensor
    y_pred =tf.argmax(y_pred,axis = -1)
    y_true =tf.argmax(y_true,axis = -1)
#     acc = (y_pred == y_true).mean()
    acc=tf.reduce_mean(tf.cast(tf.equal(y_true,y_pred),tf.float16)).numpy()
    return acc #返回准确率
sgd = tf.optimizers.SGD(learning_rate=0.1)

优化算法

def run_optimizer(X_train,y_train):
    with tf.GradientTape() as g:
        y_pred = dnn(X_train)
        loss = cross_entropy(y_train,y_pred)
#  cross_entropy交叉熵       
    gradients = g.gradient(loss,dnn.trainable_variables)
#     dnn可以直接获取到系数--dnn为我们声明好的
    sgd.apply_gradients(zip(gradients,dnn.trainable_variables))

for循环运行代码

for i,(X_train,y_train) in enumerate(data_train.take(1000),1):
    run_optimizer(X_train,y_train)
    if i%10 == 0:
        #计算准确率
        for (X_test,y_test) in data_test.take(1):
            y_pred = dnn(X_test)
            acc = accuracy(y_pred,y_test)
            print('执行次数:%d。准确率是:%0.4f'%(i,acc))
执行次数:10。准确率是:0.5723
执行次数:20。准确率是:0.6660
执行次数:30。准确率是:0.7402
执行次数:40。准确率是:0.7422
执行次数:50。准确率是:0.7422
执行次数:60。准确率是:0.8496
执行次数:70。准确率是:0.7910
执行次数:80。准确率是:0.8496
执行次数:90。准确率是:0.8691
执行次数:100。准确率是:0.8535
执行次数:110。准确率是:0.8750
执行次数:120。准确率是:0.8652
执行次数:130。准确率是:0.8809
执行次数:140。准确率是:0.8359
执行次数:150。准确率是:0.8906
执行次数:160。准确率是:0.8730
执行次数:170。准确率是:0.8887
执行次数:180。准确率是:0.9043
执行次数:190。准确率是:0.8867
执行次数:200。准确率是:0.8906
执行次数:210。准确率是:0.8848
执行次数:220。准确率是:0.8984
执行次数:230。准确率是:0.9082
执行次数:240。准确率是:0.8945
执行次数:250。准确率是:0.9180
执行次数:260。准确率是:0.9395
执行次数:270。准确率是:0.9180
执行次数:280。准确率是:0.9082
执行次数:290。准确率是:0.9219
执行次数:300。准确率是:0.9141
执行次数:310。准确率是:0.9277
执行次数:320。准确率是:0.9160
执行次数:330。准确率是:0.9141
执行次数:340。准确率是:0.9004
执行次数:350。准确率是:0.9082
执行次数:360。准确率是:0.9121
执行次数:370。准确率是:0.9238
执行次数:380。准确率是:0.9102
执行次数:390。准确率是:0.9238
执行次数:400。准确率是:0.9219
执行次数:410。准确率是:0.9355
执行次数:420。准确率是:0.9141
执行次数:430。准确率是:0.9336
执行次数:440。准确率是:0.9180
执行次数:450。准确率是:0.9336
执行次数:460。准确率是:0.9316
执行次数:470。准确率是:0.9238
执行次数:480。准确率是:0.9395
执行次数:490。准确率是:0.9219
执行次数:500。准确率是:0.9297
执行次数:510。准确率是:0.9355
执行次数:520。准确率是:0.9258
执行次数:530。准确率是:0.9258
执行次数:540。准确率是:0.9297
执行次数:550。准确率是:0.9375
执行次数:560。准确率是:0.9336
执行次数:570。准确率是:0.9238
执行次数:580。准确率是:0.9180
执行次数:590。准确率是:0.9180
执行次数:600。准确率是:0.9297
执行次数:610。准确率是:0.9375
执行次数:620。准确率是:0.9414
执行次数:630。准确率是:0.9375
执行次数:640。准确率是:0.9238
执行次数:650。准确率是:0.9199
执行次数:660。准确率是:0.9355
执行次数:670。准确率是:0.9375
执行次数:680。准确率是:0.9316
执行次数:690。准确率是:0.9570
执行次数:700。准确率是:0.9531
执行次数:710。准确率是:0.9453
执行次数:720。准确率是:0.9395
执行次数:730。准确率是:0.9512
执行次数:740。准确率是:0.9336
执行次数:750。准确率是:0.9512
执行次数:760。准确率是:0.9375
执行次数:770。准确率是:0.9414
执行次数:780。准确率是:0.9453
执行次数:790。准确率是:0.9277
执行次数:800。准确率是:0.9336
执行次数:810。准确率是:0.9414
执行次数:820。准确率是:0.9570
执行次数:830。准确率是:0.9473
执行次数:840。准确率是:0.9609
执行次数:850。准确率是:0.9473
执行次数:860。准确率是:0.9570
执行次数:870。准确率是:0.9414
执行次数:880。准确率是:0.9434
执行次数:890。准确率是:0.9434
执行次数:900。准确率是:0.9629
执行次数:910。准确率是:0.9414
执行次数:920。准确率是:0.9492
执行次数:930。准确率是:0.9473
执行次数:940。准确率是:0.9590
执行次数:950。准确率是:0.9473
执行次数:960。准确率是:0.9492
执行次数:970。准确率是:0.9531
执行次数:980。准确率是:0.9375
执行次数:990。准确率是:0.9570
执行次数:1000。准确率是:0.9590
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值