【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】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】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官方的…

骨骼动画——论文与代码精读《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 (…

3D人脸重建——PRNet网络输出的理解

前言 之前有款换脸软件不是叫ZAO么&#xff0c;分析了一下&#xff0c;它的实现原理绝对是3D人脸重建&#xff0c;而非deepfake方法&#xff0c;找了一篇3D重建的论文和源码看看。这里对源码中的部分函数做了自己的理解和改写。 国际惯例&#xff0c;参考博客&#xff1a; 什…

tensorflow官方posenet模型解析

前言 tensorflow官方有个姿态估计项目&#xff0c;这个输入和openpose还有点不一样&#xff0c;这里写个单人情况下的模型输出解析方案。 国际惯例&#xff0c;参考博客&#xff1a; 博客: 使用 TensorFlow.js 在浏览器端上实现实时人体姿势检测 tensorflow中posnet的IOS代…

tensorflow2安装时候的一个dll找不到的错误

电脑环境&#xff1a; vs2015python3.7.6&#xff0c;使用anaconda安装的CUDA 10.1cuDnn 7.6.5tensorflow2.1.0 错误内容 File "C:\Users\zb116\anaconda3\lib\imp.py", line 242, in load_modulereturn load_dynamic(name, filename, file)File "C:\Users\z…

PCA、SVD、ZCA白化理论与实现

简介 在UFLDL中介绍了主成分分析这一块的知识&#xff0c;而且当时学机器学习的时候&#xff0c;老师是将PCA和SVD联系起来将的&#xff0c;同时UFLDL也讲到了使用PCA做数据白化whitening处理&#xff0c;这个词经常在论文里面看到。 国际惯例&#xff0c;参考博客&#xff1…

OpenCV使用Tensorflow2-Keras模型

前言 最近工作上需要在C上快速集成Tensorflow/Keras训练好的模型&#xff0c;做算法验证。首先想到的就是opencv里面的dnn模块了&#xff0c;但是它需要的格式文件比较郁闷&#xff0c;是pb格式的模型&#xff0c;但是keras通常保存的是h5文件&#xff0c;查阅了很多资料&…