18- TensorFlow模型中Keras进阶 (TensorFlow系列) (深度学习)

news2024/9/28 17:30:10

知识要点

  • 导入数据: (x_train, y_train), (x_test, y_test) = mnist.load_data()
  • 标准化处理:  x_train_scaled = scaler.fit_transform(x_train)          # scaler = StandardScaler()
  • one-hot编码: y_train = tf.keras.utils.to_categorical(y_train, 10) 
  • 定义神经网络: model = tf.keras.Sequential()
  • 第一层输入元组或数字: model.add(Dense(64, input_shape=(784)))
  • 添加selu 层: model.add(Dense(64, activation='selu'))
  • 添加激活层: model.add(Activation('relu'))
  • 添加BN层: model.add(BatchNormalization())        # 优化算法
  • 添加输出层: model.add(Dense(10, activation='softmax'))  输出层的激活, 二分类是sigmoid, 多分类的话是softmax .
    • softmax是个非常常用而且比较重要的函数,尤其在多分类的场景中使用广泛。他把一些输入映射为0-1之间的实数,并且归一化保证和为1,因此多分类的概率之和也刚好为1。
  • model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])   配置网络
  • 训练网络: model.fit(x_train_scaled, y_train, batch_size=64, epochs=5)
  • 查看网络参数量: model.summary()
  • 评估模型: model.evaluate(x_test_scaled, y_test)     # loss: 0.1095 - accuracy: 0.9761
  • 保存模型: model.save('./model.h5')        # 只保存模型, 不保存参数
  • 读取模型: model2 = tf.keras.models.load_model('./model.h5')
  • 模型预测: model.predict(x_test)
  • 随机丢弃神经网络: model.add(Dropout(0.2))
  • model.add(AlphaDropout(0.2))  是一种保持输入均值和方差不变的Dropout, 防止过拟合
    • AlphaDropout是一种保持 self-normalizing 属性的Dropout。对于一个0均值和单位标准差的输入,AphaDropout的输出保持输入的均值和标准差不变
    • AlphaDropout和SELU激活函数一起使用,保证了输出是0均值和单位标准差。
  • l1_l2正则化: model.add(Dense(64, activation='relu', kernel_regularizer='l1_l2'))
    •  对于网络层 𝑦=𝑊𝑥+𝑏 ,他们的作用机制是相似的,区别是作用的对象不同, kernel_regularizer作用于权重𝑊,bias_regularizer作用于𝑏,而activity_regularizer则作用于该层的输出𝑦 .
  • dataset: 通常用于训练数据和目标值的集合, 保存到一起. 可以直接传入model 中 .

正则化参考: Keras 中 L1正则化与L2正则化的用法


1 标准化处理原始数据

  • 导入手写数字
# 手写数字 mnist, cifar10
from tensorflow.keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
  • 标准化处理
from sklearn.preprocessing import StandardScaler
# 对数据做处理
x_train = x_train.reshape(-1, 784) / 255.0
x_test = x_test.reshape(-1, 784) / 255.0

# 对x_train, x_test做标准化处理
scaler = StandardScaler()
x_train_scaled = scaler.fit_transform(x_train)
x_test_scaled = scaler.transform(x_test)

y_train = y_train.astype(np.float32)
y_test = y_test.astype(np.float32)
  • one_hot编码
# tf.one_hot() 
y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)

2 添加BN层

  • 定义模型
  • BN层可以在激活函数之前, 也可以在激活函数之后  # 通常为先激活, 再进行BN
from tensorflow.keras.layers import Dense, BatchNormalization, Activation
# 定义神经网络.
model = tf.keras.Sequential()
# 第一层要多写一个参数, 叫做输入数据的维度. 
# 输入维度有两种写法, 第一种是input_shape, 必须是一个元组, 不要写样本个数
# 只需要写特征的维度即可.
# input_dim, 不需要写元组, 直接指定具体的数字即可
model.add(Dense(64, input_shape=(784, )))
# 先BN再激活
# model.add(BatchNormalization())
# model.add(Activation('relu'))

# 先激活, 再BN
model.add(Activation('relu'))
model.add(BatchNormalization())

model.add(Dense(64))
# model.add(BatchNormalization())
# model.add(Activation('relu'))
model.add(Activation('relu'))
model.add(BatchNormalization())
# 输出层的激活, 二分类是sigmoid, 多分类的话是softmax
model.add(Dense(10, activation='softmax'))
  •  配置网络
# 配置网络
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
# 训练网络
model.fit(x_train_scaled, y_train, batch_size=64, epochs=5,
          validation_data=(x_test_scaled, y_test), )
# 查看网络参数量
model.summary()

 

  • 评估模型
model.evaluate(x_test_scaled, y_test)   # loss: 0.1095 - accuracy: 0.9761
  • 保存模型
# 保存模型 HDF5 分层的数据结构.
model.save('./model.h5')
  • 加载模型
# 加载模型
model2 = tf.keras.models.load_model('./model.h5')
model2.evaluate(x_test, y_test)   # loss: 8.4811 - accuracy: 0.1039
  • 提取预测值
# 预测
model.predict(x_test, ).shape    # (10000, 10)

3 selu 激活函数

深度学习在卷积神经网络(cnn)和循环神经网络(rnn)取得很大突破,但标准前馈网络(ann)的成功消息却很少。因此引入自归一化的神经网络,来尝试进行高级抽象表示。这种自归一化的神经网络的激活函数就是selu,它也是一种基于激活函数的正则化方案。它具有自归一化特点,即使加入噪声也能收敛到均值为0、方差为1或方差具有上下界。
优点:在全连接层效果好,可以避免梯度消失和爆炸
缺点:在卷积网络效果尚未证明。可能引起过拟合。

# 定义神经网络.
model = tf.keras.Sequential()
# selu : scaled, relu -> elu -> selu
model.add(Dense(64, activation='selu', input_shape=(784, )))
model.add(Dense(64, activation='selu'))
model.add(Dense(10, activation='softmax'))

  •  输入方式:  Flatten
  • 一层网络叫做一层Dense
# 定义神经网络.
model = tf.keras.Sequential()
# 第一层要多写一个参数, 叫做输入数据的维度. 
# 输入维度有两种写法, 第一种是input_shape, 必须是一个元组, 不要写样本个数
# 只需要写特征的维度即可.
# input_dim, 不需要写元组, 直接指定具体的数字即可
# Flatten 即reshape, 展平
model.add(Flatten(input_shape=(28, 28)))
model.add(Dense(64, activation='relu'))
# model.add(Dense(64, activation='relu', input_dim=784))
# 出了第一层需要传输入数据的维度, 其他层不需要, keras会自动的帮我们计算维度.
model.add(Dense(64, activation='relu'))
# 输出层的激活, 二分类是sigmoid, 多分类的话是softmax
model.add(Dense(10, activation='softmax'))

4 dropout 正则化

from tensorflow.keras.layers import Dense, Dropout, AlphaDropout
# 定义神经网络.
model = tf.keras.Sequential()
# 第一层要多写一个参数, 叫做输入数据的维度. 
# 输入维度有两种写法, 第一种是input_shape, 必须是一个元组, 不要写样本个数
# 只需要写特征的维度即可.
# input_dim, 不需要写元组, 直接指定具体的数字即可
model.add(Dense(512, activation='relu', input_shape=(784, )))
# model.add(Dropout(0.2))
# 1. 保持方差和均值不变, 2. 归一化性质不变.
model.add(AlphaDropout(0.2))
# model.add(Dense(64, activation='relu', input_dim=784))
# 出了第一层需要传输入数据的维度, 其他层不需要, keras会自动的帮我们计算维度.
model.add(Dense(512, activation='relu'))
# model.add(Dropout(0.2))
model.add(AlphaDropout(0.2))
# 输出层的激活, 二分类是sigmoid, 多分类的话是softmax
model.add(Dense(10, activation='softmax'))

5 L1 L2正则化

  • l1_l2正则化: model.add(Dense(64, activation='relu', kernel_regularizer='l1_l2'))
    •  对于网络层 𝑦=𝑊𝑥+𝑏 ,他们的作用机制是相似的,区别是作用的对象不同, kernel_regularizer作用于权重𝑊,bias_regularizer作用于偏置𝑏,而activity_regularizer则作用于该层的输出𝑦 .
  • 大多数情况下,使用 kernel_regularizer 就足够了;
  • 如果你希望输入和输出是接近的,你可以使用 bias_regularizer;
  • 如果你希望该层的输出尽量小,你应该使用 activity_regularizer。
# 定义神经网络.
model = tf.keras.Sequential()
# 第一层要多写一个参数, 叫做输入数据的维度. 
# input_dim, 不需要写元组, 直接指定具体的数字即可
model.add(Dense(64,activation='relu',kernel_regularizer='l1_l2',input_shape=(784)))
# model.add(Dense(64, activation='relu', input_dim=784))
# 出了第一层需要传输入数据的维度, 其他层不需要, keras会自动的帮我们计算维度.
model.add(Dense(64, activation='relu', kernel_regularizer='l1_l2'))
# 输出层的激活, 二分类是sigmoid, 多分类的话是softmax
model.add(Dense(10, activation='softmax'))

6 dataset 的使用

6.1 dataset 取值

  • form_tensor_slices, 可以从元组, 列表, 字典, ndarray中创建dataset
# 所有数据相关的内容在tf.data中
# form_tensor_slices,可以从元组, 列表, 字典, ndarray中创建dataset
dataset = tf.data.Dataset.from_tensor_slices(np.arange(10))
# 数据集最基础的用法就是取数据
for item in dataset:
    print(item.numpy())    # 0,1,2,3,4,5,6,7,8,9
  • 数据重复三次    # 结果为3次 1-9
# repeat 重复三次
dataset = dataset.repeat(3)
  • 每次取7个数值
# 重复三次, 每次取7个
dataset = dataset.repeat(3).batch(7)
for i in dataset:
    print(i)

 6.2 创建 dataset

  • 通过numpy数组创建
# 从元组创建dataset, (x, y)
x = np.array([[1, 2], [3, 4], [5, 6]])
y = np.array(['cat', 'dog', 'fox'])

dataset = tf.data.Dataset.from_tensor_slices((x, y))
for item_x, item_y in dataset:
    print(item_x.numpy(), item_y.numpy())

  •  使用字典创建 dataset
# 字典的做法
dataset = tf.data.Dataset.from_tensor_slices({
    'feature': x,
    'label' : y
})
for item in dataset:
    print(item['feature'].numpy(), item['label'].numpy())

6.3 dataset.interleave

  • 对现有datasets中的每个元素做处理,产生新的结果,interleave将新的结果合并,并产生新的数据集case:
# interleave
# 最常见用法: 文件名dataset --> 具体数据集
dataset = tf.data.Dataset.from_tensor_slices(np.arange(10))
dataset = dataset.repeat(3).batch(7)
# map_func, 执行操作, cycle_length,并行长度, block_length 
dataset = dataset.interleave(lambda v: tf.data.Dataset.from_tensor_slices(v),
                   cycle_length = 5, 
                   block_length = 5)

for i in dataset:
    print(i.numpy())

官网地址: tf.data.Dataset  |  TensorFlow v2.0.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/375636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《数据库系统概论》学习笔记——第四章 数据库安全

教材为数据库系统概论第五版(王珊) 这一章简单记一下那几条sql的用法和两种存取控制和审计(今年期末考了)吧,不知道有啥好考的 数据库安全性 问题的提出 数据库的一大特点是数据可以共享数据共享必然带来数据库的安全…

算法练习(八)计数质数(素数)

1、问题描述&#xff1a; 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 2、示例如下&#xff1a; 3、代码如下&#xff1a; 第一种&#xff1a;比较暴力的算法 class Solution {public int countPrimes(int n) {int count1;if(n<2) return 0;for(in…

【数据结构必会基础】关于树,你所必须知道的亿些概念

目录 1.什么是树 1.1浅显的理解树 1.2 数据结构中树的概念 2.树的各种结构概念 2.1 节点的度 2.2 根节点/叶节点/分支节点 2.3 父节点/子节点 2.4祖先节点/子孙节点 2.5兄弟节点 2.6树的度 2.7节点的层次 2.8森林 3. 如何用代码表示一棵树 3.1链式结构 3.1.1 树节…

01-mybatis-快速入门、代理、CRUD练习

文章目录MybatisMybatis入门案例1、创建User表&#xff0c;添加数据2、创建模块&#xff0c;搭建框架2.1 创建模块注意&#xff1a;完善项目目录2.2 导入坐标2.3 编写 MyBatis 核心配置文件2.4 编写sql映射文件2.5 编码3、解决SQL映射文件的警告提示Mapper代理开发1、定义同名接…

python下如何安装并使用matplotlib(画图模块)

在搜索命令中输入cmd&#xff0c;以管理员身份运行。 输入以下命令&#xff0c;先对pip安装工具进行升级 pip install --upgrade pip 升级完成 之后使用pip安装matplotlib pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple 也可以使用pycharm来安装matp…

《嵌入式应用开发》实验一、开发环境搭建与布局(上)

1. 搭建开发环境 去官网&#xff08;https://developer.android.google.cn/studio&#xff09;下载 Android Studio。 安装SDK&#xff08;默认Android 7.0即可&#xff09; 全局 gradle 镜像配置 在用户主目录下的 .gradle 文件夹下面新建文件 init.gradle&#xff0c;内容为…

弹性盒子布局

目录一、弹性盒子属性二、认识flex的坐标轴三、简单学习父级盒子属性三、属性说明3.1、flex-grow一、弹性盒子属性 说明&#xff1a; div的默认样式&#xff1a;display:block 块盒子 display:flex弹性盒子&#xff08;可以控制下级盒子的位置&#xff09; 当两种盒子单独出现…

springboot 虚拟线程demo

jd19支持虚拟线程&#xff0c;虚拟线程是轻量级的线程&#xff0c;它们不与操作系统线程绑定&#xff0c;而是由 JVM 来管理。它们适用于“每个请求一个线程”的编程风格&#xff0c;同时没有操作系统线程的限制。我们能够创建数以百万计的虚拟线程而不会影响吞吐。 做个 spri…

实验心理学笔记01:引论

原视频链接&#xff1a; https://www.bilibili.com/video/BV1Qt41137Kv 目录 一、实验心理学&#xff1a;定义、内容及简要历史回顾 二、实验心理学和普通心理学、认知心理学的区别 三、实验方法与非实验方法 四、实验范式 五、实验中的各种变量 六、The science of psy…

Java项目---博客系统

博客系统url : 链接 项目已上传gitee : 链接 前言 之前笔者已经使用Servlet结合MySQL实现了第一版的个人博客。在这一版的博客系统中&#xff0c;将进行以下功能的升级&#xff1a; 框架升级&#xff1a;SSM版本&#xff0c;即&#xff08;Spring SpringMVC MyBatis&…

@Import注解的原理

此注解是springboot自动注入的关键注解&#xff0c;所以拿出来单独分析一下。 启动类的run方法跟进去最终找到refresh方法&#xff1b; 这里直接看这个org.springframework.context.support.AbstractApplicationContext#refresh方法即可&#xff0c;它下面有一个方法 invoke…

Linux基础命令-fdisk管理磁盘分区表

文章目录 fdisk 命令介绍 命令格式 基本参数 1&#xff09;常用参数 2&#xff09;fdisk菜单操作说明 创建一个磁盘分区 1&#xff09;创建分区 2&#xff09;创建交换分区 参考实例 1&#xff09; 显示当前分区的信息 2&#xff09; 显示每个磁盘的分区信息 命令…

关于单目标约束优化问题的讲解及实现过程

一、前沿 优化问题一直是工程领域、路径规划领域等绕不开的话题,而真正的实际问题不是只是单目标优化问题,而是涉及到高维度且带多约束的问题,其中约束包含等式约束、不等式约束或者二者都有,这给优化研究提高了难度。 在中学的时候,应该都遇到过线性规划问题,类似于如…

LeetCode 热题 C++ 200. 岛屿数量 206. 反转链表 207. 课程表 208. 实现 Trie (前缀树)

LeetCode200 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设…

虹科新闻|虹科与iX systems正式建立合作伙伴关系

近日&#xff0c;虹科与美国iXsystems公司达成战略合作&#xff0c;虹科正式成为iXsystems公司在中国区域的认证授权代理商。未来&#xff0c;虹科将携手iXsystems&#xff0c;共同致力于提供企业级存储解决方案。虹科及iXsystems双方的高层领导人员都对彼此的合作有很大的信心…

【JVM】垃圾回收

6、垃圾回收机制 6.1、对象成为垃圾的判断依据 在堆空间和元空间中&#xff0c;GC这条守护线程会对这些空间开展垃圾回收⼯作&#xff0c;那么GC如何判断这些空间的对象是否是垃圾&#xff0c;有两种算法&#xff1a; 引用计数法&#xff1a; 对象被引用&#xff0c;则计数…

搜广推 NeuralCF - 改进协同过滤+矩阵分解的思想

😄 NeuralCF:2017新加坡国立大学提出。【后文简称NCF】 😄 PNN:2016年上海交通大学提出。 文章目录 NeuralCF动机原理general NCFNCF终极版(GMF+MLP的结合)缺点优点ReferenceNeuralCF 动机 前面学了MF,可知MF在用户-物品评分矩阵的基础上做矩阵分解(用户矩阵Q和物品…

Codeforces Round #851 (Div. 2)(A~D)

A. One and Two给出一个数组&#xff0c;该数组仅由1和2组成&#xff0c;问是否有最小的k使得k位置的前缀积和后缀积相等。思路&#xff1a;计算2个数的前缀和即可&#xff0c;遍历判断。AC Code&#xff1a;#include <bits/stdc.h>typedef long long ll; const int N 1…

Maxwell系列:Maxwell采集Mysql到Kafka

目录 Apache Hadoop生态-目录汇总-持续更新 1&#xff1a;直接命令行启动(开发环境使用) 1.1&#xff1a;创建topic&#xff08;可忽略&#xff0c;默认会自动创建&#xff09; 1.2&#xff1a;命令行方式启动maxwell采集通道 1.3&#xff1a;测试流程 2&#xff1a;通过配…

taobao.top.once.token.get( 网关一次性token获取 )

&#xffe5;开放平台免费API必须用户授权聚石塔内调用 网关一次性token获取&#xff0c;对接文档: 公共参数 HTTP地址:http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 请求参数 响应参数 点击获取key和secret 请求示例 TaobaoClient client new Defa…