【TensorFlow-windows】keras接口学习——线性回归与简单的分类

前言

之前有写过几篇TensorFlow相关文章,但是用的比较底层的写法,比如tf.nntf.layers,也写了部分基本模型如自编码和对抗网络等,感觉写起来不太舒服,最近看官方文档发现它的教程基本都使用的keras API,这就尴尬了,学一波
国际惯例,参考博客:
官方开始案例
keras比tensorflow差在哪里?

其实网上有很多博客了,但是为实验了一下跑不起来,而且按照官方文档理解的使用算法和网络上的博客又不同,比如这位大佬的博客中有这样一行代码:

model.add(Dense(input_dim=1, output_dim=1, init='uniform', activation='linear'))

但是我去找官方文档tf.keras.Dense发现并没input_dim,output_dim这两个参数,很多博客都有这样写,难道是keras而非是以keras为前端的Tensorflow的参数?感觉看着迷迷糊糊,还不如自己按照官方文档手撸一波。
学习步骤还是之前的思路:线性回归,全连接的手写数字分类,卷积,RNN,RBM

【注】如果本地电脑没有TensorFlow环境,可以试用官方提供的在线编辑调试网站colab,灰常方便,而且还能启动GPU和TPU,这也太良心了吧,在colab的修改->笔记本设置->硬件加速可以启用

线性回归

直接用 $ y=3x+5$ 这个函数

  • 引入相关包

    import tensorflow as tf
    import numpy as np
    from tensorflow import keras
    
  • 建立数据集

    trX=np.linspace(-1,1,101)
    trY=3*trX+5
    
  • 创建模型:只具有一个单隐层,三种写法,其实我更喜欢第三种写法

    #写法一
    #model=tf.keras.models.Sequential([
    #    keras.layers.Flatten(),
    #    keras.layers.Dense(1)
    ])
    #写法二
    # model= keras.Sequential()
    # model.add(keras.layers.Flatten())
    # model.add(keras.layers.Dense(units=1,use_bias=True))
    #写法三
    inputs = tf.keras.Input(shape=[1,])
    x= tf.keras.layers.Dense(1)(inputs)
    model = tf.keras.models.Model(inputs=inputs,outputs=x)
    

    这里注意的就是层的使用方法了,首先要用Sequential建立一个序列容器,然后再将模型逐层add进来,Flatten是展平向量,Dense是全连接。或者第三种方法tf.keras.models.Model将输入输出嵌入模型中。
    【注意】
    写法一和二是无法直接打印网络结构的,因为没指定网络输入大小,或者没开始训练,强行打印的方法就是,在Sequential的第一层加入input_shape=[x,x]这样的参数,比如

    model=tf.keras.models.Sequential([keras.layers.Dense(1,input_shape=[1,])
    ])
    

这样上述三种方法都可以用model.summary()打印网络结构了。

  • 编译优化算法:

    model.compile(optimizer=tf.train.RMSPropOptimizer(learning_rate=0.01),loss='mse',metrics=['mae'])
    

    这里需要注意的是三个参数optimizer,不建议直接写adam,sgd之类的,最好是用tf自带的优化器,loss表示损失,这个不太清楚MSE在tf中怎么点出来,只好用mse的形式写了,评估函数是mae,这个回头看看怎么去掉引号

  • 训练:

    model.fit(trX,trY,epochs=1000)
    
  • 查看权重
    以上基本是完成了参数学习过程,有时候我们希望看看参数,这里可以先输出每层的名称看看都存了啥

    print(model.layers)
    '''
    [<tensorflow.python.keras.layers.core.Flatten object at 0x0000027AED6A3978>, <tensorflow.python.keras.layers.core.Dense object at 0x0000027AED6A3D68>]
    '''
    

    我们需要的权重在第二个layers里面,因为从0开始编号,所以取权重的方法是

    model.layers[1].get_weights()
    '''
    [array([[2.987659]], dtype=float32), array([5.0043736], dtype=float32)]
    '''
    

    很容易发现不仅把权重输出了,偏置项也在

  • 评估模型
    我们也可以制作训练集查看误差

    model.evaluate(trX,trY)
    '''
    101/101 [==============================] - 0s 594us/step
    [4.496799705845147e-07, 0.000640394664046788]
    '''
    

    感觉第一个应该是损失,第二个是误差

  • 预测数值
    输入10,那么y=3*10+5=35

    model.predict([10])
    '''
    array([[34.997227]], dtype=float32)
    '''
    

基本的使用都在这里了,相对于使用更底层的TensorFlow代码,貌似用keras更加方面了,尤其是建立模型和预测结果上

分类

  • 导入相关包

    import tensorflow as tf
    
  • 导入数据:手写数字

    mnist=tf.keras.datasets.mnist
    (x_train,y_train),(x_test,y_test)=mnist.load_data()
    x_train,x_test=x_train/255.0,x_test/255.0#归一化
    
  • 创建模型

    #创建模型
    model=tf.keras.models.Sequential([tf.keras.layers.Flatten(),tf.keras.layers.Dense(512,activation=tf.nn.relu),tf.keras.layers.Dropout(0.2),tf.keras.layers.Dense(10,activation=tf.nn.softmax)
    ])
    
  • 编译优化算法

    #编译模型
    model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    
  • 训练和评估

    model.fit(x_train,y_train,epochs=5)
    model.evaluate(x_test, y_test)
    '''
    Epoch 1/5
    60000/60000 [==============================] - 15s 250us/step - loss: 0.2026 - acc: 0.9406
    Epoch 2/5
    60000/60000 [==============================] - 13s 213us/step - loss: 0.0809 - acc: 0.9751
    Epoch 3/5
    60000/60000 [==============================] - 13s 209us/step - loss: 0.0524 - acc: 0.9832
    Epoch 4/5
    60000/60000 [==============================] - 12s 206us/step - loss: 0.0374 - acc: 0.9880
    Epoch 5/5
    60000/60000 [==============================] - 12s 202us/step - loss: 0.0280 - acc: 0.9913
    10000/10000 [==============================] - 1s 70us/step
    [0.0750152821913769, 0.9798]
    '''
    

后记

感觉前面还是不够简化,因为学到这里,我们在编译模型时,只会使用引号定义优化方法,作为一名码农,还是喜欢点点点地点出来
看官网的介绍:

compile(optimizer,loss=None,metrics=None,loss_weights=None,sample_weight_mode=None,weighted_metrics=None,target_tensors=None,distribute=None,**kwargs
)

部分参数描述:

  • optimizer:优化器的字符串名字,或者优化器实例,具体看optimizers
  • loss:目标函数的名字或者目标函数,看loss
  • metrics:训练或测试模型所使用的评估方法,一般使用metrics=['accuracy']

当我们点击优化器和loss的时候,很容易发现,这两个东东都隶属于tf.keras的类,尝试点一下

在这里插入图片描述

在这里插入图片描述

除了最后一个常用accuracy,不清楚还能用什么以外,差不多已经达到了解放双手的效果,我们只需要尝试点点点就能依据智能提示构建一个非常简单的keras模型,其实后来想了想有时候我们的目标函数和评估函数是一样的,那么能否直接使用tf.keras.losses里面的损失函数作为评估函数呢,然后试了一下,稳如狗,可以,但是要注意是列表形式放进去

比如上面分类例子中使用的:

model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])

可以换成

#初始化一个优化方法实例
optim=tf.keras.optimizers.Adam();
#编译模型
#编译模型
model.compile(optimizer= optim,loss=tf.keras.losses.sparse_categorical_crossentropy,metrics=[tf.keras.losses.MSE])

后记

接下来就要看看如何使用自己的数据去训练keras构建的模型,从第一个回归的例子来看,好像没有之前学tensorflow一样那么麻烦,需要使用比较复杂的数据流。

下节预告,构建手写数字分类系统,使用卷积的方法,并且要能保存和调用模型

本章代码戳这里 ,记得使用colab打开,可以直接运行,美滋滋

在这里插入图片描述

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

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

相关文章

【TensorFlow-windows】keras接口——卷积手写数字识别,模型保存和调用

前言 上一节学习了以TensorFlow为底端的keras接口最简单的使用&#xff0c;这里就继续学习怎么写卷积分类模型和各种保存方法(仅保存权重、权重和网络结构同时保存) 国际惯例&#xff0c;参考博客&#xff1a; 官方教程 【注】其实不用看博客&#xff0c;直接翻到文末看我的c…

【TensorFlow-windows】keras接口——BatchNorm和ResNet

前言 之前学习利用Keras简单地堆叠卷积网络去构建分类模型的方法&#xff0c;但是对于很深的网络结构很难保证梯度在各层能够正常传播&#xff0c;经常发生梯度消失、梯度爆炸或者其它奇奇怪怪的问题。为了解决这类问题&#xff0c;大佬们想了各种办法&#xff0c;比如最原始的…

【TensorFlow-windows】keras接口——卷积核可视化

前言 在机器之心上看到了关于卷积核可视化相关理论&#xff0c;但是作者的源代码是基于fastai写的&#xff0c;而fastai的底层是pytorch&#xff0c;本来准备自己用Keras复现一遍的&#xff0c;但是尴尬地发现Keras还没玩熟练&#xff0c;随后发现了一个keras-vis包可以用于做…

【TensorFlow-windows】投影变换

前言 没什么重要的&#xff0c;就是想测试一下tensorflow的投影变换函数tf.contrib.image.transform中每个参数的含义 国际惯例&#xff0c;参考文档 官方文档 描述 调用方法与默认参数&#xff1a; tf.contrib.image.transform(images,transforms,interpolationNEAREST,…

【TensorFlow-windows】扩展层之STN

前言 读TensorFlow相关代码看到了STN的应用&#xff0c;搜索以后发现可替代池化&#xff0c;增强网络对图像变换(旋转、缩放、偏移等)的抗干扰能力&#xff0c;简单说就是提高卷积神经网络的空间不变性。 国际惯例&#xff0c;参考博客&#xff1a; 理解Spatial Transformer…

【TensorFlow-windows】部分损失函数测试

前言 在TensorFlow中提供了挺多损失函数的&#xff0c;这里主要测试一下均方差与交叉熵相关的几个函数的计算流程。主要是测试来自于tf.nn与tf.losses的mean_square_error、sigmoid_cross_entry、softmax_cross_entry、sparse_softmax_cross_entry 国际惯例&#xff0c;参考博…

RS编码-Python工具包使用

前言 最近学习二维码相关知识&#xff0c;遇到了ReedSolomon编码&#xff0c;简称RS编码&#xff0c;中文名里德所罗门编码。遇到的问题是使用的工具包返回的编码是bytearray类型&#xff0c;而二维码是二进制01编码&#xff0c;所以本博客主要验证&#xff0c;如何将bytearra…

【TensorFlow-windows】MobileNet理论概览与实现

前言 轻量级神经网络中&#xff0c;比较重要的有MobileNet和ShuffleNet&#xff0c;其实还有其它的&#xff0c;比如SqueezeNet、Xception等。 本博客为MobileNet的前两个版本的理论简介与Keras中封装好的模块的对应实现方案。 国际惯例&#xff0c;参考博客&#xff1a; 纵…

【TensorFlow-windows】keras接口——ImageDataGenerator裁剪

前言 Keras中有一个图像数据处理器ImageDataGenerator&#xff0c;能够很方便地进行数据增强&#xff0c;并且从文件中批量加载图片&#xff0c;避免数据集过大时&#xff0c;一下子加载进内存会崩掉。但是从官方文档发现&#xff0c;并没有一个比较重要的图像增强方式&#x…

【TensorFlow-windows】name_scope与variable_scope

前言 探索一下variable_scope和name_scope相关的作用域&#xff0c;为下一章节tensorboard的学习做准备 其实关于variable_scope与get_variable实现变量共享&#xff0c;在最开始的博客有介绍过&#xff1a; 【TensorFlow-windows】学习笔记二——低级API 当然还是国际惯例…

【TensorFlow-windows】TensorBoard可视化

前言 紧接上一篇博客&#xff0c;学习tensorboard可视化训练过程。 国际惯例&#xff0c;参考博客&#xff1a; MNIST机器学习入门 Tensorboard 详解&#xff08;上篇&#xff09; Tensorboard 可视化好帮手 2 tf-dev-summit-tensorboard-tutorial tensorflow官方mnist_…

深度学习特征归一化方法——BN、LN、IN、GN

前言 最近看到Group Normalization的论文&#xff0c;主要提到了四个特征归一化方法&#xff1a;Batch Norm、Layer Norm、Instance Norm、Group Norm。此外&#xff0c;论文还提到了Local Response Normalization(LRN)、Weight Normalization(WN)、Batch Renormalization(BR)…

【TensorFlow-windows】keras接口——利用tensorflow的方法加载数据

前言 之前使用tensorflow和keras的时候&#xff0c;都各自有一套数据读取方法&#xff0c;但是遇到一个问题就是&#xff0c;在训练的时候&#xff0c;GPU的利用率忽高忽低&#xff0c;极大可能是由于训练过程中读取每个batch数据造成的&#xff0c;所以又看了tensorflow官方的…

【TensorFlow-serving】初步学习模型部署

前言 初步学习tensorflow serving的手写数字识别模型部署。包括简单的模型训练、保存、部署上线。因为对docker和网络不太熟悉&#xff0c;可能会有部分错误&#xff0c;但是看完博客&#xff0c;能跑通整个流程。此博客将详细介绍流程&#xff0c;但是不详细介绍每个流程的每…

Tensorflow 指令加速

一直没注意过使用Tensorflow的时候有一条warning&#xff1a; Warning: your cpu supports instructions that this tensorflow binary was not compiled to use: avx2 fma这玩意是可以用来加速推断的&#xff0c;分CPU和GPU版&#xff0c;业务相关部署在CPU上&#xff0c;实测…

骨骼动画——论文与代码精读《Phase-Functioned Neural Networks for Character Control》

前言 最近一直玩CV&#xff0c;对之前学的动捕知识都忘得差不多了&#xff0c;最近要好好总结一下一直以来学习的内容&#xff0c;不能学了忘。对2017年的SIGGRAPH论文《Phase-Functioned Neural Networks for Character Control》进行一波深入剖析吧&#xff0c;结合源码。 额…

颜色协调模型Color Harmoniztion

前言 最近做换脸&#xff0c;在肤色调整的那一块&#xff0c;看到一个有意思的文章&#xff0c;复现一波玩玩。不过最后一步掉链子了&#xff0c;有兴趣的可以一起讨论把链子补上。 主要是github上大佬的那个复现代码和原文有点差异&#xff0c;而且代码复杂度过高&#xff0…

Openpose推断阶段原理

前言 之前出过一个关于openpose配置的博客&#xff0c;不过那个代码虽然写的很好&#xff0c;而且是官方的&#xff0c;但是分析起来很困难&#xff0c;然后再opencv相关博客中找到了比较清晰的实现&#xff0c;这里分析一波openpose的推断过程。 国际惯例&#xff0c;参考博…

换脸系列——眼鼻口替换

前言 想着整理一下换脸相关的技术方法&#xff0c;免得以后忘记了&#xff0c;最近脑袋越来越不好使了。应该会包含三个系列&#xff1a; 仅换眼口鼻&#xff1b;换整个面部&#xff1b;3D换脸 先看看2D换脸吧&#xff0c;网上已经有现成的教程了&#xff0c;这里拿过来整理一…

换脸系列——整脸替换

前言 前面介绍了仅替换五官的方法&#xff0c;这里介绍整张脸的方法。 国际惯例&#xff0c;参考博客&#xff1a; [图形算法]Delaunay三角剖分算法 维诺图&#xff08;Voronoi Diagram&#xff09;分析与实现 Delaunay Triangulation and Voronoi Diagram using OpenCV (…