首页 > 其他分享 >[深度学习] tf

[深度学习] tf

时间:2022-12-19 19:33:30浏览次数:60  
标签:layers Dense keras 模型 学习 深度 tf model

date: 2018-07-17 19:33:48 + 0800                 
tags:
  - 深度学习

目前keras API 已经整合到 tensorflow最新版本1.9.0 中,在tensorflow中通过tf.keras就可以调用keras。

import tensorflow as tf
from tensorflow import keras

官方教程为: https://tensorflow.google.cn/guide/keras

tf.keras可以调用所有的keras编译代码,但是有两个限制:

  1. 版本问题,需要通过tf.keras.version确认版本。
  2. 模型保存问题,tf.keras默认使用 checkpoint format格式,而keras模型的保存格式HDF5需要借用函数save_format='h5'

构建一个简单的模型

序贯(Sequential)模型

序贯模型就是是多个网络层的线性堆叠,比如多层感知机,BP神经网络。

tf.keras构建一个简单的全连通网络(即多层感知器)代码如下:

#建立序贯模型
model = keras.Sequential()
#添加全连接层,节点数为64,激活函数为relu函数,dense表示标准的一维全连接层
model.add(keras.layers.Dense(64, activation='relu'))
#添加全连接层,节点数为64,激活函数为relu函数
model.add(keras.layers.Dense(64, activation='relu'))
#添加输出层,输出节点数为10
model.add(keras.layers.Dense(10, activation='softmax'))

其中激活函数详细信息见keras官方文档

网络层的构造

通常在tf.keras中,网络层的构造参数主要有以下几个:

  1. 激活函数activation function,默认是没有激活函数的。
  2. 参数初始化,默认通过正态分布初始化(Glorot uniform)
  3. 参数正则化,包括权值初始化和偏置的初始化。
#参数调整
#建立一个sigmoid层
layers.Dense(64, activation='sigmoid')
#或者
layers.Dense(64, activation=tf.sigmoid)

#权重L1正则化
layers.Dense(64, kernel_regularizer=keras.regularizers.l1(0.01))
#偏置L2正则化
layers.Dense(64, bias_regularizer=keras.regularizers.l2(0.01))

#权重正交矩阵的随机数初始化
layers.Dense(64, kernel_initializer='orthogonal')
#偏置常数初始化
layers.Dense(64, bias_initializer=keras.initializers.constant(2.0))

模型训练和参数评价

模型训练

模型建立后,通过compile模块确定模型的训练参数(tf.keras.Model.compile)

tf.keras.Model.compile有三个主要参数:

  1. 优化器optimizer:通过tf.train模块调用优化器,可用的优化器类型见: http://keras-cn.readthedocs.io/en/latest/other/ptimizers/
  2. 损失函数loss:通过tf.keras.losses模块调用损失函数,可用的损失函数类型见: http://keras-cn.readthedocs.io/en/latest/other/objectives/
  3. 模型评估方法metrics:通过tf.keras.metrics调用评估参数,可用的模型评估方法见: http://keras-cn.readthedocs.io/en/latest/other/metrics/

具体例子如下:

# 配置均方误差回归模型
model.compile(optimizer=tf.train.AdamOptimizer(0.01),
              loss='mse',       # 均方差
              metrics=['mae'])  # 平均绝对误差

# 配置分类模型
model.compile(optimizer=tf.train.RMSPropOptimizer(0.01),
              loss=keras.losses.categorical_crossentropy, #多类的对数损失
              metrics=[keras.metrics.categorical_accuracy]) #多分类问题,所有预测值上的平均正确率

模型的训练

对于小数据集,使用numpy数组,通过tf.keras.Model.fit模块来训练和评估模型。

import numpy as np
#输入数据(1000,32)
data = np.random.random((1000, 32))
#输入标签(1000,10)
labels = np.random.random((1000, 10))
#模型训练
model.fit(data, labels, epochs=10, batch_size=32)

tf.keras.Model.fit模块有三个重要的参数:

  1. 训练轮数epochs:epochs指的就是训练过程中数据将被训练多少轮,一个epoch指的是当一个完整的数据集通过了神经网络一次并且返回了一次。
  2. 批训练大小batch_size:基本上现在的梯度下降都是基于mini-batch的,即将一个完整数据分为batch_size个批次进行训练。详见 http://keras-cn.readthedocs.io/en/latest/for_beginners/concepts/#epochs
  3. 验证集validation_data:通常一个模型训练,评估要有训练集,验证集和测试集。验证集就是模型调参时用来评估模型的数据集。

tf.data的数据集

对于大型数据集,常常通过tf.data模块来调用数据,详见 https://tensorflow.google.cn/guide/datasets

# 数据实例化
dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32)
dataset = dataset.repeat()

#模型训练,steps_per_epoch表示每次训练的数据大小类似与batch_size
model.fit(dataset, epochs=10, steps_per_epoch=30)

模型评估和预测

通过 tf.keras.Model.evaluate 和tf.keras.Model.predict可以实现模型的评估和预测。

model.evaluate(x, y, batch_size=32)
model.evaluate(dataset, steps=30)

model.predict(x, batch_size=32)
model.predict(dataset, steps=30)

基本模型的建立

网络层模型

通过f.keras.Sequential 可以实现各种的复杂模型,如:

  1. 多输入模型;
  2. 多输出模型;
  3. 参数共享层模型;
  4. 残差网络模型。

具体例子如下:

#输入参数
inputs = keras.Input(shape=(32,))

#网络层的构建
x = keras.layers.Dense(64, activation='relu')(inputs)
x = keras.layers.Dense(64, activation='relu')(x)
#预测
predictions = keras.layers.Dense(10, activation='softmax')(x)

#模型实例化
model = keras.Model(inputs=inputs, outputs=predictions)

#模型构建
model.compile(optimizer=tf.train.RMSPropOptimizer(0.001),
              loss='categorical_crossentropy',
              metrics=['accuracy'])

#模型训练
model.fit(data, labels, batch_size=32, epochs=5)

模型子类函数构建

通常通过tf.keras.Model构建模型结构, __init__方法初始化模型,call方法进行参数传递。如下所示:

class MyModel(keras.Model):
  #模型结构确定
  def __init__(self, num_classes=10):
    super(MyModel, self).__init__(name='my_model')
    self.num_classes = num_classes
    #网络层的定义
    self.dense_1 = keras.layers.Dense(32, activation='relu')
    self.dense_2 = keras.layers.Dense(num_classes, activation='sigmoid')
  #参数调用
  def call(self, inputs):
    #前向传播过程确定
    x = self.dense_1(inputs)
    return self.dense_2(x)

  def compute_output_shape(self, input_shape):
    #输出参数确定
    shape = tf.TensorShape(input_shape).as_list()
    shape[-1] = self.num_classes
    return tf.TensorShape(shape)


#模型初始化
model = MyModel(num_classes=10)

#模型构建
model.compile(optimizer=tf.train.RMSPropOptimizer(0.001),
              loss='categorical_crossentropy',
              metrics=['accuracy'])

#模型训练
model.fit(data, labels, batch_size=32, epochs=5)

回调函数Callbacks

回调函数是一组在训练的特定阶段被调用的函数集,你可以使用回调函数来观察训练过程中网络内部的状态和统计信息。通过传递回调函数列表到模型fit()中,即可在给定的训练阶段调用该函数集中的函数。详见:
http://keras-cn.readthedocs.io/en/latest/other/callbacks/ 。主要回调函数有:

  1. tf.keras.callbacks.ModelCheckpoint:模型保存
  2. tf.keras.callbacks.LearningRateScheduler:学习率调整
  3. tf.keras.callbacks.EarlyStopping:中断训练
  4. tf.keras.callbacks.TensorBoard:tensorboard的使用

模型保存和载入

tf.keras有两种模型保存方式

网络参数保存Weights only

#模型保存为tensorflow默认格式
model.save_weights('./my_model')

#载入模型
model.load_weights('my_model')

#模型保存为keras默认格式,包含其他优化参数
model.save_weights('my_model.h5', save_format='h5')

#载入模型
model.load_weights('my_model.h5')

配置参数保存Configuration only

保存一个没有模型参数只有配置参数的模型, Keras支持 JSON和YAML序列化格式:

# 模型保存
json_string = model.to_json()
yaml_string = model.to_yaml()
#模型载入
fresh_model = keras.models.from_json(json_string)
fresh_model = keras.models.from_yaml(yaml_string)

完整模型保存

将原来模型所用信息进行保存:

#模型建立
model = keras.Sequential([
  keras.layers.Dense(10, activation='softmax', input_shape=(32,)),
  keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(data, targets, batch_size=32, epochs=5)


#保存为keras格式文件
model.save('my_model.h5')

# 模型载入
model = keras.models.load_model('my_model.h5')

标签:layers,Dense,keras,模型,学习,深度,tf,model
From: https://www.cnblogs.com/luohenyueji/p/16992928.html

相关文章

  • [深度学习] imgaug库使用笔记
    date:2020-10-2410:07:39+0800tags:-图像处理-深度学习-Pythonimgaug是一款非常有用的python图像增强库,非常值得推荐应用于深度学习图像增强。其包含许......
  • [深度学习] ImageAI库使用笔记
    dates:2020-08-0713:31:38+0800tags:-深度学习-PythonImageAI是一个Python库,旨在使开发人员,研究人员和学生能够使用简单的几行代码来构建具有独立的深度学习......
  • [深度学习] CCPD车牌数据集介绍
    date:2021-06-0919:03:20+0800tag:-深度学习-图像处理-机器学习CCPD是一个大型的、多样化的、经过仔细标注的中国城市车牌开源数据集。CCPD数据......
  • 第二次学习C语言--2022.12.19
    接下来是一串Helloworld的代码编写#include<stdio.h>intmain(void){printf("HelloWorld!");return0;} int表明main()函数返回一个整数,void表明main()不带任......
  • WaitForSingleObject与WaitForMultipleObjects用法详解
    在多线程下面,有时候会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用WindowsAPI函数WaitForSingleObject,或者WaitForMultipleObjects。这两个函数都会等待......
  • Markdown学习
    Markdown学习字体hello,worldhello,worldhello,worldhello,world引用努力学编程分割线图片超链接点击跳转到列表有序列表ABC无序列表zhuke成表......
  • FreeRTOS的学习(十)——事件标志组
    背景说明:以前从来没有用过这个事件组,现在做的项目是第一次使用,用了之后感觉很方便,比二值信号量方便太多了参考链接如下:(21条消息)FreeRTOS的学习(十)——......
  • 【总结】有三AI所有原创GAN相关的学习资料汇总(2022年12月)
    GAN的研究和应用在这几年发展可以说是非常迅猛,无疑是这几年深度学习计算机视觉领域里落地性最酷的技术之一,包括图像与视频生成,数据仿真与增强,各种各样的图像风格化任务,人脸......
  • WCF学习-第二个示例
    二、WCF服务端应用程序第一步,创建WCF服务应用程序项目打开VisualStudio2015,在菜单上点击文件—>新建—>项目—>WCF服务应用程序。在弹出界面的“名称”对应的文本框中......
  • NeurIPS 2022:基于语义聚合的对比式自监督学习方法
    摘要:该论文将同一图像不同视角图像块内的语义一致的图像区域视为正样本对,语义不同的图像区域视为负样本对。本文分享自华为云社区《[NeurIPS2022]基于语义聚合的对比式自......