keras 搭建简单模型

扁平化model.add(Flatten()) 可以用  全局平均池化代替 model.add(GlobalAveragePooling2D())

方法1

# 序列模型
# 序列模型属于通用模型的一种,因为很常见,所以这里单独列出来进行介绍,这种模型各层之间
# 是依次顺序的线性关系,在第k层和第k+1层之间可以加上各种元素来构造神经网络
# 这些元素可以通过一个列表来制定,然后作为参数传递给序列模型来生成相应的模型from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Activation# Dense相当于构建一个全连接层,32指的是全连接层上面神经元的个数
layers = [Dense(32, input_shape=(784,)),Activation('relu'),Dense(10),Activation('softmax')]
model = Sequential(layers)#输出模型结构
model.summary()

方法2

效果同方法1一样

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Activationmodel = Sequential()
model.add(Dense(32, input_shape=(784,)))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))
model.summary()

一个稍复杂的例子

# 通用模型
# 通用模型可以用来设计非常复杂、任意拓扑结构的神经网络,例如有向无环图网络
# 类似于序列模型,通用模型通过函数化的应用接口来定义模型
# 使用函数化的应用接口有好多好处,比如:决定函数执行结果的唯一要素是其返回值,而决定
# 返回值的唯一要素则是其参数,这大大减轻了代码测试的工作量# 在通用模型中,定义的时候,从输入的多维矩阵开始,然后定义各层及其要素,最后定义输出层
# 将输入层和输出层作为参数纳入通用模型中就可以定义一个模型对象from keras.layers import Input
from keras.layers import Dense
from keras.models import Model# 定义输入层
input = Input(shape=(784,))
# 定义各个连接层,假设从输入层开始,定义两个隐含层,都有64个神经元,都使用relu激活函数
x = Dense(64, activation='relu')(input)
x = Dense(64, activation='relu')(x)
# 定义输出层,使用最近的隐含层作为参数
y = Dense(10, activation='softmax')(x)# 所有要素都齐备以后,就可以定义模型对象了,参数很简单,分别是输入和输出,其中包含了
# 中间的各种信息
model = Model(inputs=input, outputs=y)# 当模型对象定义完成之后,就可以进行编译了,并对数据进行拟合,拟合的时候也有两个参数
# 分别对应于输入和输出
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(data, labels)

一个更加复杂的例子

import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D# 先读入数据
(X_train, y_train), (X_test, y_test) = mnist.load_data("../test_data_home")
# 看一下数据集的样子
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] = 1return 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))])# 搭建卷积神经网络
model = Sequential()
# 添加一层卷积层,构造64个过滤器,每个过滤器覆盖范围是3*3*1
# 过滤器步长为1,图像四周补一圈0,并用relu进行非线性变化
model.add(Conv2D(filters=64, kernel_size=(3, 3), strides=(1, 1), padding='same',input_shape=(28, 28, 1), activation='relu'))
# 添加一层最大池化层
model.add(MaxPooling2D(pool_size=(2, 2)))
# 设立Dropout层,Dropout的概率为0.5
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())# 构造全连接层神经网络层
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(10, activation='softmax'))# 定义损失函数,一般来说分类问题的损失函数都选择采用交叉熵
model.compile(loss='categorical_crossentropy', optimizer='adagrad', metrics=['accuracy'])# 放入批量样本,进行训练
model.fit(X_train, y_train_ohe, validation_data=(X_test, y_test_ohe), epochs=20, batch_size=128)# 在测试集上评价模型的准确率
# verbose : 进度表示方式。0表示不显示数据,1表示显示进度条
scores = model.evaluate(X_test, y_test_ohe, verbose=0)

迁移学习的例子

# 使用迁移学习的思想,以VGG16作为模板搭建模型,训练识别手写字体
# 引入VGG16模块
from keras.applications.vgg16 import VGG16# 其次加载其他模块
from keras.layers import Input
from keras.layers import Flatten
from keras.layers import Dense
from keras.layers import Dropout
from keras.models import Model
from keras.optimizers import SGD# 加载字体库作为训练样本
from keras.datasets import mnist# 加载OpenCV(在命令行中窗口中输入pip install opencv-python),这里为了后期对图像的处理,
# 大家使用pip install C:\Users\28542\Downloads\opencv_python-3.4.1+contrib-cp35-cp35m-win_amd64.whl
# 比如尺寸变化和Channel变化。这些变化是为了使图像满足VGG16所需要的输入格式
import cv2
import h5py as h5py
import numpy as np# 建立一个模型,其类型是Keras的Model类对象,我们构建的模型会将VGG16顶层去掉,只保留其余的网络
# 结构。这里用include_top = False表明我们迁移除顶层以外的其余网络结构到自己的模型中(意思是顶层不用)
# weights='imagenet'使用imagenet大赛第一名的参数。
# VGG模型对于输入图像数据要求高宽至少为48个像素点,由于硬件配置限制,我们选用48个像素点而不是原来
# VGG16所采用的224个像素点。即使这样仍然需要24GB以上的内存,或者使用数据生成器
model_vgg = VGG16(include_top=False, weights='imagenet', input_shape=(48, 48, 3))
for layer in model_vgg.layers:#遍历vgg模型的每一层layer.trainable = False  #每层的,参数都设置为不可变更的,使用初始参数
model = Flatten(name='flatten')(model_vgg.output) # 扁平化,将vgg模型的输出。当做自己模型的输入
model = Dense(4096, activation='relu', name='fc1')(model)
model = Dense(4096, activation='relu', name='fc2')(model)
model = Dropout(0.5)(model)
model = Dense(10, activation='softmax')(model)
model_vgg_mnist = Model(inputs=model_vgg.input, outputs=model, name='vgg16')# 打印模型结构,包括所需要的参数
model_vgg_mnist.summary()model_vgg = VGG16(include_top=False, weights='imagenet', input_shape=(224, 224, 3))
for layer in model_vgg.layers:layer.trainable = False
model = Flatten()(model_vgg.output)
model = Dense(4096, activation='relu', name='fc1')(model)
model = Dense(4096, activation='relu', name='fc2')(model)
model = Dropout(0.5)(model)
model = Dense(10, activation='softmax', name='prediction')(model)
model_vgg_mnist_pretrain = Model(model_vgg.input, model, name='vgg16_pretrain')model_vgg_mnist_pretrain.summary()# 新的模型不需要训练原有卷积结构里面的1471万个参数,但是注意参数还是来自于最后输出层前的两个
# 全连接层,一共有1.2亿个参数需要训练
sgd = SGD(lr=0.05, decay=1e-5) #sgd 随机梯度下降法,作为优化器
model_vgg_mnist.compile(loss='categorical_crossentropy',optimizer=sgd, metrics=['accuracy'])# 因为VGG16对网络输入层的要求,我们用OpenCV把图像从32*32变成48*48,函数cv2.COLOR_GRAY2RGB 把黑白图像转成RGB图像
# 并把训练数据转化成张量形式,供keras输入
(X_train, y_train), (X_test, y_test) = mnist.load_data("../test_data_home")
X_train, y_train = X_train[:10000], y_train[:10000]
X_test, y_test = X_test[:1000], y_test[:1000]
X_train = [cv2.cvtColor(cv2.resize(i, (48, 48)), cv2.COLOR_GRAY2RGB)for i in X_train]
X_train = np.concatenate([arr[np.newaxis] for arr in X_train]).astype('float32')
X_test = [cv2.cvtColor(cv2.resize(i, (48, 48)), cv2.COLOR_GRAY2RGB)for i in X_test]
X_test = np.concatenate([arr[np.newaxis] for arr in X_test]).astype('float32')print(X_train.shape)
print(X_test.shape)X_train = X_train / 255
X_test = X_test / 255def tran_y(y):y_ohe = np.zeros(10)y_ohe[y] = 1return y_ohey_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))])model_vgg_mnist.fit(X_train, y_train_ohe, validation_data=(X_test, y_test_ohe),epochs=100, batch_size=50)

转载于:https://www.cnblogs.com/HL-blog/p/9437461.html

keras 的使用例子相关推荐

  1. 带你少走弯路:强烈推荐的Keras快速入门资料和翻译(可下载)

    上次写了TensorFlow和PyTorch的快速入门资料,受到很多好评,读者强烈建议我再出一个keras的快速入门路线,经过翻译和搜索网上资源,我推荐4份入门资料,希望对大家有所帮助. 备注:另外两 ...

  2. 在C#中从Keras.NET开始——训练您的第一个模型

    目录 介绍 背景 使用代码 兴趣点 介绍 由于机器学习已变得非常流行,因此使用Keras和/或后端Tensorflow这样的开源SDK,Python语言也再次变得流行(与预测相反,Python将在未来 ...

  3. 基于RNN的文本生成算法的代码运转

    目录(?)[+] "什么时候能自动生成博客?" 前言 跳过废话,直接看正文 RNN相对于传统的神经网络来说对于把握上下文之间的关系更为擅长,因此现在被大量用在自然语言处理的相关任务 ...

  4. 吴恩达深度学习笔记(四)

    吴恩达深度学习笔记(四) 卷积神经网络CNN-第二版 卷积神经网络 深度卷积网络:实例探究 目标检测 特殊应用:人脸识别和神经风格转换 卷积神经网络编程作业 卷积神经网络CNN-第二版 卷积神经网络 ...

  5. 基于卷积神经网络的高光谱图像分类

    文章目录 引言 1. 基于光谱特征 2. 基于空间特征 3. 基于空谱特征 3.1 空间特征和光谱特征的融合 3.2 基于3D-CNN分类 4. 总结 引言 近年来深度学习的技术在计算机视觉领域中大放 ...

  6. TensorFlow 2.x

    一.TensorFlow层次结构 总共五层:硬件层.内核层.低阶API,中阶API,高阶API. 低阶API:由python实现的操作符,提供封装了C++内核的低级API指令 中阶API:由pytho ...

  7. MSE(均方误差)、MAE(平均绝对误差)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) tensorflow 2.0 画出model网络模型的拓扑图 ...

  8. 多标签分类的Focal loss设计

    多标签分类中存在类别不平衡的问题,想要尝试用focalloss损失函数,但是网上很少有多标签分类的损失函数设计,终于在kaggle上别人做的keras下的focalloss中举例了多标签问题: Foc ...

  9. 通过keras例子理解LSTM 循环神经网络(RNN)

    博文的翻译和实践: Understanding Stateful LSTM Recurrent Neural Networks in Python with Keras 正文 一个强大而流行的循环神经 ...

最新文章

  1. Android---Service(生命周期、启动方式、服务通信、实战演练、思维导图、高级音乐播放器-源码)
  2. maven GroupId 和ArtifactId的含义
  3. antd table设置表格一个单元格的字体颜色_alireacttable:高性能 React 表格组件
  4. 她说她女儿(JAVASCRIPT小时的玩伴,也姓杨)
  5. MVC公司架构介绍-工具类(一)
  6. 2018世界杯最帅射手-C罗,嗯,没得跑了!
  7. 常用缓存Cache机制的实现
  8. 设计模式之Interpreter(解释器)
  9. vscode 格式化不加分号_大前端时代你的 VSCode 插件
  10. PyCharm安装LabelImg
  11. 阿里播放器的使用Aliplayer
  12. cck8graphpad作图_新经验 | CCK8 实验心得
  13. 同步发电机转子的转动惯量与运动方程(一) 基本物理概念
  14. 域名排名(前100万)
  15. 苹果手机扫描文件并转换格式,怎么把扫描文件转换成文字,扫描出来的文件格式换个可以复制的文字
  16. 公钥密码学中的三大难解数学问题
  17. 信息收集之基础端口扫描《诸神之眼——Nmap网络安全审计技术揭秘》总结一
  18. HCIP(华为高级网络安全工程师)(实验五)(OSPF综合实验)
  19. 数据分析面试题-面试话术
  20. android第三方应用商店,Android第三方应用商店成长迅猛

热门文章

  1. starUML--面向对象的设计过程
  2. python笔记之面向对象
  3. python中.append()和.extend()的区别
  4. ie浏览器 杂项样式错乱
  5. strtok_r 和 strsep 使用实例
  6. 简单谈Tomcat的实现原理
  7. S5PV210开发 -- 串口驱动开发
  8. 以太坊智能合约安全 Dasp Top10
  9. 使用Android Studio打Andorid apk包的流程
  10. JZOJ 3786. 【NOI2015模拟8.19】图