【Tensorflow+keras】Keras API三种搭建神经网络的方式及以mnist举例实现

简介: 使用Keras API构建神经网络的三种方法:使用Sequential模型、使用函数式API以及通过继承Model类来自定义模型,并提供了基于MNIST数据集的示例代码。

1 第一种:Sequential

(1)简介
序列模型,官网介绍
代码参考:https://github.com/eriklindernoren/Keras-GAN/blob/master/gan/gan.py
理论参考:https://zhuanlan.zhihu.com/p/113385350
Keras Sequential API是实现Keras模型最简单的方式,就行它的名字所形容的一样,它将按照序列的方式实现模型,模型中的各个层就像一个队列一样排列起来组成一个完整的模型。但是Keras Sequential API有一定局限性,它不能创建以下模型结构:
• 共享层
• 模型分支
• 多个输入分支
• 多个输出分支
(2)举例实现

import sys
reload(sys)
sys.setdefaultencoding('utf-8')
###导入keras相关卷积模块,包含Dropout、Conv2D和MaxPoling2D
import numpy as np
from keras.datasets import mnist
import keras
import gc
import time
from keras.models import Sequential, Model
from keras.layers import Input, Dense, Dropout, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
time1 = time.time()
######读入数据
(X_train, y_train), (X_test, y_test) = mnist.load_data()
##看一下数据集大小
# print(X_train[0].shape)
# print(y_train[0])
##把训练集中的手写黑白字体变成标准的四维张量形式(样本数量,长,宽,1),并把像素值变成浮点格式。
X_train = X_train.reshape(X_train.shape[0],28,28,1).astype('float32') 
X_test = X_test.reshape(X_test.shape[0],28,28,1).astype('float32')
####归一化:由于每个像素值都是介于0-255,所以这里统一除以255,把像素值控制在0~1范围。
X_train /= 255 
X_test /= 255
##由于输入层需要10个节点,所以最好把目标数字0-9做成one Hot编码的形式。
def tran_y(y): 
    y_ohe = np.zeros(10) 
    y_ohe[y] = 1 
    return y_ohe
########把标签用one Hot编码重新表示一下
y_train_ohe = np.array([tran_y(y_train[i]) for i in range(len(y_train))]) 
y_test_ohe = np.array([tran_y(y_test[i]) for i in range(len(y_test))])
y_train_ohe = y_train_ohe.astype('float32')
y_test_ohe = y_test_ohe.astype('float32')
###接着搭建卷积神经网络
model = Sequential() 
###添加1层卷积层,构造64个过滤器,每个过滤器覆盖范围是3*3*1,过滤器挪动步长为1,图像四周补一圈0,并用relu 进行非线性变换
model.add(Conv2D(filters = 64, kernel_size = (3, 3), strides = (1, 1), padding = 'same', activation = 'relu',
          input_shape = (28,28,1)))
###添加1层Max pooling,在2*2的格子中取最大值
model.add(MaxPooling2D(pool_size = (2, 2)))
##设立Dropout层,将dropout的概率设为0.5。也可以尝试用0.2,0.3这些常用的值
model.add(Dropout(0.5))
##重复构造,搭建神经网络
model.add(Conv2D(128, kernel_size = (3, 3), strides = (1, 1), padding = 'same', activation = 'relu')) 
model.add(MaxPooling2D(pool_size = (2, 2))) 
model.add(Dropout(0.5)) 
model.add(Conv2D(256, kernel_size = (3, 3), strides = (1, 1), padding = 'same', activation = 'relu')) 
model.add(MaxPooling2D(pool_size = (2, 2))) 
model.add(Dropout(0.5))
###把当前层节点展平
model.add(Flatten())
######构造全连接神经网络层(3层)
model.add(Dense(128, activation = 'relu')) 
model.add(Dense(64, activation = 'relu')) 
model.add(Dense(32, activation = 'relu')) 
model.add(Dense(10, activation = 'softmax'))
#定义损失函数,一般来说分类问题的损失函数都选择采用交叉熵(Crossentropy)
# 我们可以定制各种选项,比如下面就定制了优化器选项。
adamoptimizer = keras.optimizers.Adam(lr = 1e-4)
model.compile(loss = 'categorical_crossentropy', 
              optimizer = adamoptimizer, metrics = ['accuracy'])
######放入批量样本,进行训练
model.fit(X_train, y_train_ohe, validation_data = (X_test, y_test_ohe), 
          epochs = 20, batch_size = 128)
#######在测试集上评价模型精确度
scores=model.evaluate(X_test,y_test_ohe,verbose=0)
#####打印精确度
print scores
time2 = time.time()
print u'ok,结束!'
print u'总共耗时:' + str(time2 - time1) + 's'

2 第二种:函数式API

(1)简介
参考:https://www.tensorflow.org/guide/keras/functional?hl=zh-cn
相比Sequential API,Functional API是我们实现模型更加常用的方式。Functional API更加灵活。使用Functional API,我们可以创建出更加复杂的模型:
• 在模型中设置多个输入或多个输出
• 在模型中定义分支结构
• 在模型中使用共享层
• 在模型中使用循环结构
(2)举例实现

def build_model():
    inputs = keras.Input(shape=(784,))
    x = layers.Dense(64, activation="relu")(inputs)
    x = layers.Dense(64, activation="relu")(x)
    outputs = layers.Dense(10)(x)
    model = keras.Model(inputs=inputs, outputs=outputs, name="mnist_model")
    (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
    x_train = x_train.reshape(60000, 784).astype("float32") / 255
    x_test = x_test.reshape(10000, 784).astype("float32") / 255
    model.compile(
        loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
        optimizer=keras.optimizers.RMSprop(),
        metrics=["accuracy"],
    )
    return model

(X_train, y_train), (X_test, y_test) = mnist.load_data()
##把训练集中的手写黑白字体变成标准的四维张量形式(样本数量,长,宽,1),并把像素值变成浮点格式。
X_train = X_train.reshape(X_train.shape[0],28,28,1).astype('float32') 
X_test = X_test.reshape(X_test.shape[0],28,28,1).astype('float32')
####归一化:由于每个像素值都是介于0-255,所以这里统一除以255,把像素值控制在0~1范围。
X_train /= 255 
X_test /= 255
model = build_model()
history = model.fit(x_train, y_train, batch_size=64, epochs=2, validation_split=0.2)
test_scores = model.evaluate(x_test, y_test, verbose=2)
print("Test loss:", test_scores[0])
print("Test accuracy:", test_scores[1])

3 第三种:class

(1)简介
封装成子类
代码参考:https://zhuanlan.zhihu.com/p/58825020
Model subclassing顾名思义就是继承Model类。这有点类似于面向对象编程,实际上Keras中的所有模型都继承了Model类。使用这种方式我们可以完全按照我们的意愿编写我们的模型,我么可以在网络中使用我们自定义的层,自定义的损失函数,自定义的激活函数等等。
(2)举例实现

class MyModel(tf.keras.Model):
    def __init__(self, num_classes=10):
        super(MyModel, self).__init__(name='my_model')
        self.num_classes = num_classes
        self.layer1 = layers.Dense(32, activation='relu')
        self.layer2 = layers.Dense(num_classes, activation='softmax')
    def call(self, inputs):
        h1 = self.layer1(inputs)
        out = self.layer2(h1)
        return out
    def compute_output_shape(self, input_shape):
        shape = tf.TensorShape(input_shape).as_list()
        shape[-1] = self.num_classes
        return tf.TensorShape(shape)
(X_train, y_train), (X_test, y_test) = mnist.load_data()
##把训练集中的手写黑白字体变成标准的四维张量形式(样本数量,长,宽,1),并把像素值变成浮点格式。
X_train = X_train.reshape(X_train.shape[0],28,28,1).astype('float32') 
X_test = X_test.reshape(X_test.shape[0],28,28,1).astype('float32')
####归一化:由于每个像素值都是介于0-255,所以这里统一除以255,把像素值控制在0~1范围。
X_train /= 255 
X_test /= 255
model = MyModel(num_classes=10)
model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001),
             loss=tf.keras.losses.categorical_crossentropy,
             metrics=['accuracy'])
model.fit(train_x, train_y, batch_size=16, epochs=5)
目录
相关文章
|
7天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
蘑菇识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了9种常见的蘑菇种类数据集【"香菇(Agaricus)", "毒鹅膏菌(Amanita)", "牛肝菌(Boletus)", "网状菌(Cortinarius)", "毒镰孢(Entoloma)", "湿孢菌(Hygrocybe)", "乳菇(Lactarius)", "红菇(Russula)", "松茸(Suillus)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,
51 11
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
2月前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
356 55
|
2月前
|
Kubernetes 安全 Devops
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
97 10
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
|
2月前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
220 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
3月前
|
存储 数据可视化 API
重磅干货,免费三方网络验证[用户系统+CDK]全套API接口分享教程。
本套网络验证系统提供全面的API接口,支持用户注册、登录、数据查询与修改、留言板管理等功能,适用于不想自建用户系统的APP开发者。系统还包含CDK管理功能,如生成、使用、查询和删除CDK等。支持高自定义性,包括20个自定义字段,满足不同需求。详细接口参数及示例请参考官方文档。
|
3月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
141 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
3月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
91 3
|
3月前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
145 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
4月前
|
机器学习/深度学习 SQL 数据采集
基于tensorflow、CNN网络识别花卉的种类(图像识别)
基于tensorflow、CNN网络识别花卉的种类(图像识别)
108 1
|
4月前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
104 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练

热门文章

最新文章