美文网首页
23、keras

23、keras

作者: 羽天驿 | 来源:发表于2020-05-12 11:09 被阅读0次

一、keras

1.关于Keras

   ( 1)简介          

     Keras是由纯python编写的基于theano/tensorflow的深度学习框架。

     Keras是一个高层神经网络API,支持快速实验,能够把你的idea迅速转换为结果,如果有如下需求,可以优先选择Keras:

            a)简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)

            b)支持CNN和RNN,或二者的结合

            c)无缝CPU和GPU切换

二、代码

代码:

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
(X_train,y_train),(X_test,y_test) = mnist.load_data()
X_train = tf.cast(X_train/255.0,tf.float32)
y_train = tf.one_hot(y_train,depth=10)#10分类问题
X_test = tf.cast(X_test/255,tf.float32)
y_test = tf.one_hot(y_test,depth=10)

# 将数据X_train,X_test reshape一下,数据形状满足神经网络要求
X_train = tf.reshape(X_train,shape = [-1,28,28,1])
X_test = tf.reshape(X_test,shape = [-1,28,28,1])

# X_train 60000个,重复了100次,每次取512
data_train = tf.data.Dataset.from_tensor_slices((X_train,y_train)).repeat(100).shuffle(2000).batch(128).prefetch(1)
# X_test 10000个,可以取5次,重复50次,250次
data_test = tf.data.Dataset.from_tensor_slices((X_test,y_test)).repeat(50).shuffle(2000).batch(128).prefetch(1)

声明模型、损失、准确率、优化算法Adam

class Cnn(Model):
    def __init__(self):
        super(Cnn,self).__init__()
#         第一层卷积网络
        self.conv1 = layers.Conv2D(filters = 32,kernel_size=(3,3),padding='same',activation='relu')
#      strides: Integer, tuple of 2 integers, or None.
#     Strides values.
#     If None, it will default to `pool_size`.
        self.pool1 = layers.MaxPool2D(padding='same')
    
#         第二层卷积网络
        self.conv2 = layers.Conv2D(filters=64,kernel_size=(3,3),padding='same',activation=tf.nn.relu)
        self.pool2 = layers.MaxPool2D(padding='same')
        
#         第三层卷积网络
        self.conv3 = layers.Conv2D(filters=64,kernel_size=(3,3),padding='same',activation=tf.nn.relu)
        self.pool3 = layers.MaxPool2D(padding='same')
        
#         全连接层,self.pool3返回的数据是4维,降维
        self.flattern = layers.Flatten() # reshape
        self.fc = layers.Dense(1024,activation=tf.nn.relu)
        
#         dropout,防止过拟合,掩盖一些神经元,不让其工作,系数表少了
#         普通算法,sklearn中通过L1、L2正则化,实现防止过拟合
#          训练时,dropout,测试的时候,依然是完全的网络
        self.dropout = layers.Dropout(rate = 0.5)
#         输出层
        self.out = layers.Dense(10)#Dense相当于,矩阵运算
    def call(self,X,is_training = False):
        X = self.conv1(X)
        X = self.pool1(X)
        X = self.conv2(X)
        X = self.pool2(X)
#         X = self.conv3(X)
#         X = self.pool3(X)
        X = self.flattern(X)#reshape
        X = self.fc(X)
#         X = self.dropout(X,training = is_training)
        y_pred = self.out(X)#输出层,模型的结果,预测,此处,没有进行softmax。神经网络中称为:logits
        if not is_training:# 测试
            y_pred = tf.nn.softmax(y_pred)
        return y_pred

cnn = Cnn()

#损失
def cross_entropy(y_true,y_pred):
    y_pred = tf.clip_by_value(y_pred,1e-9,1.0)
#     logits 表示,模型的输出结果(没有进行softmax的结果)
    loss = tf.nn.softmax_cross_entropy_with_logits(labels = y_true,logits=y_pred)
    return loss

# 准确率
def accuracy(y_true,y_pred):
    y_true = tf.argmax(y_true,axis = -1)
    y_pred = tf.argmax(y_pred,axis = -1)
    acc = tf.reduce_mean(tf.cast(tf.equal(y_true,y_pred),dtype=tf.float16))
    return acc

# 优化,Adam优化算法,是在SGD的基础上,进行的优化
# Adam optimization is a stochastic gradient descent method that is based on
# adaptive estimation of first-order and second-order moments.
adam = tf.optimizers.Adam(learning_rate=0.0005)

定义优化过程

def run_optimizer(X_train,y_train):
    with tf.GradientTape() as g:
        y_pred = cnn(X_train,is_training = True)
        loss = cross_entropy(y_train,y_pred)
    gradients = g.gradient(loss,cnn.trainable_variables)
    adam.apply_gradients(zip(gradients,cnn.trainable_variables))

for循环进行训练

for i,(X_train,y_train) in enumerate(data_train.take(100),101):
    run_optimizer(X_train,y_train)
    if i %10 == 0:
        for (X_test,y_test) in data_test.take(1):
            y_pred = cnn(X_test,is_training = False)
            acc = accuracy(y_test,y_pred)
            y_pred2 = cnn(X_train,is_training = False)
            acc2 = accuracy(y_train,y_pred2)
            print('执行次数:%d。训练数据准确率:%0.4f。测试数据准确率:%0.4f'%(i,acc2,acc))
执行次数:110。训练数据准确率:0.4766。测试数据准确率:0.4453
执行次数:120。训练数据准确率:0.4766。测试数据准确率:0.5391
执行次数:130。训练数据准确率:0.5312。测试数据准确率:0.5312
执行次数:140。训练数据准确率:0.5781。测试数据准确率:0.5703
执行次数:150。训练数据准确率:0.5312。测试数据准确率:0.5391
执行次数:160。训练数据准确率:0.5859。测试数据准确率:0.5391
执行次数:170。训练数据准确率:0.6094。测试数据准确率:0.5703
执行次数:180。训练数据准确率:0.6172。测试数据准确率:0.5625
执行次数:190。训练数据准确率:0.5469。测试数据准确率:0.6328
执行次数:200。训练数据准确率:0.6562。测试数据准确率:0.5859

相关文章

网友评论

      本文标题:23、keras

      本文链接:https://www.haomeiwen.com/subject/tyxoihtx.html