欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

23-TensorFlow2.2+Keras版本新特性---自动图

程序员文章站 2022-07-28 20:23:44
基于autograph的tf.keras流程tensorflow-gpu安装查看版本tf.keras简单编程流程tf.function装饰器实现自动图整体流程tensorflow-gpu安装笔者这里安装了anaconda3的最新版本,下载自清华大学镜像站,选择了ubuntu系统可用的Anaconda3-2020.02-Linux-x86_64.sh下载安装的,其它系统选择对应的版本即可,anaconda安装完成后,可以首先检查一下系...

tensorflow-gpu安装

      笔者这里安装了anaconda3的最新版本,下载自清华大学镜像站,选择了ubuntu系统可用的Anaconda3-2020.02-Linux-x86_64.sh下载安装的,其它系统选择对应的版本即可,anaconda安装完成后,可以首先检查一下系统的显卡驱动版本,如果过老可以选择更新,不然后期使用可能会报错.

1 安装NVIDIA 驱动

    (1)禁用nouveau驱动

                sudo gedit /etc/modprobe.d/blacklist-nouveau.conf

                键入以下内容,然后保存退出

                blacklist nouveau

                options nouveau modeset=0

                重新生成内核

                sudo update-initramfs -u

      重启计算机。然后终端中输入lsmod | grep nouveau 若没有输出,则表明禁用成功

    (2)删除旧的驱动

                sudo apt-get purge nvidia*3)安装NVIDIA 驱动

     添加ppa

                sudo add-apt-repository ppa:graphics-drivers/ppa

                sudo apt-get update

                推荐搜索的驱动

                ubuntu-drivers devices

      找到recommended所在的驱动的名称(driver   : nvidia-430 free recommended)

    (4)安装NVIDIA 驱动

                sudo apt-get install nvidia-4305)重启系统

    (6)校验是否成功

                nvidia-smi

                重启之前和重启之后输入该命令会发现有明显不同

                笔者的校验信息如下:
                +-----------------------------------------------------------------------------+
				| NVIDIA-SMI 430.64       Driver Version: 430.64       CUDA Version: 10.1     |
				|-------------------------------+----------------------+----------------------+
				| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
				| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
				|===============================+======================+======================|
				|   0  GeForce GTX 108...  Off  | 00000000:01:00.0  On |                  N/A |
				| 18%   58C    P0    89W / 300W |    667MiB / 11178MiB |      1%      Default |
				+-------------------------------+----------------------+----------------------+
				                                                                               
				+-----------------------------------------------------------------------------+
				| Processes:                                                       GPU Memory |
				|  GPU       PID   Type   Process name                             Usage      |
				|=============================================================================|
				|    0      1072      G   /usr/lib/xorg/Xorg                           245MiB |
				|    0      1943      G   compiz                                       203MiB |
				|    0      2215      G   fcitx-qimpanel                                 9MiB |
				|    0      3273      G   ...AAAAAAAAAAAACAAAAAAAAAA= --shared-files   202MiB |
				|    0     21542      G   /home/dream/pycharm-2020.1.3/jbr/bin/java      3MiB |
				+-----------------------------------------------------------------------------+

      然后正常安装需要的包就行了,因为清华大学镜像站下的Anaconda中更改了conda源,所以这里直接使用就行了.

	conda create -n tensorflow-2 python=3.7       #创建虚拟环境
	conda activate tensorflow-2							#激活创建的虚拟环境
	conda install tensorflow-gpu=2.2					#安装2.2版本的tensorflow-gpu(可以安装其余必要的包)
	pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python       #安装opencv(conda 安装会出现一些预期之外的问题,这里建议用pip安装)

查看版本

      导入包后,可以使用如下方式查看版本信息

# _*_ coding:utf-8 _*_
import tensorflow as tf
from tensorflow.keras import layers

print(tf.__version__)
print(tf.keras.__version__)
#result
==>2.2.0
==>2.3.0-tf

tf.keras简单编程流程

      如下是一个非常简单的tf.keras编码流程,这里只考虑代码的可行性,不考虑是否能得到充分的训练.

import numpy as np
#Sequential Model
model=tf.keras.Sequential()
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(10,activation='softmax'))
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),loss=tf.keras.losses.categorical_crossentropy,
              metrics=[tf.keras.metrics.categorical_accuracy])
print(model.summary())

train_x=np.random.random((1000,72))
train_y=np.random.randint(0,10,(1000,10))

val_x=np.random.random((200,72))
val_y=np.random.randint(0,10,(200,10))

model.fit(train_x,train_y,epochs=10,batch_size=100,validation_data=(val_x,val_y))

tf.function装饰器实现自动图

      在TensorFlow2.x版本中,可以通过自动图(AutoGraph)功能,将普通的Python控制流语句转成基本张量的运算图.这大大简化了开发工作,这种方式明显优于以tf.cond静态图结点进行判断的编程方式,在具体实现的流程方面,可以用tf.function装饰器修饰Python函数,将其自动转化成张量运算图

import tensorflow as tf
@tf.function
def autograph(input_data):
    if tf.reduce_sum(input_data)>0:                                      #控制流语句
        return input_data-1	
    else:				
        return input_data+1
a=autograph(tf.constant([-6,4]))
b=autograph(tf.constant([4,2]))
print(a.numpy(),b.numpy())
#result
==>[-5  5] [3 1]

整体流程

      该流程的基本逻辑是组织随机数(不企图模型能学习出随机的样本规律)作为数据输入,然后构建模型进行训练,训练过程使用了常用的回调函数等功能.(训练最开始选用了tensorflow-gpu=2.1版本,但是迭代器进行数据传输过程中会报错:Error occurred when finalizing GeneratorDataset iterator: Cancelled: Operation was cancelled - TensorFlow,这里升级到2.2版本,就无报错信息了)

# _*_ coding:utf-8 _*_
import tensorflow as tf
from tensorflow.keras import layers
import numpy as np
import random
import os


def train_generate():
    while 1:
        for i in range(80):
            x=np.random.random((12,72))
            y=np.random.randint(0,10,(12,10))
            yield x,y


def test_generate():
    while 1:
        for i in range(20):
            x=np.random.random((12,72))
            y=np.random.randint(0,10,(12,10))
            yield x,y

@tf.function
def autograph(input_tensor):
    if tf.reduce_mean(input_tensor)>0.1:
        return input_tensor//2
    else:
        return input_tensor

def model(input_layer):
    x=layers.Dense(64,activation='relu')(input_layer)

    x=layers.Lambda(autograph)(x)

    x=layers.Dense(10,activation='softmax')(x)
    return tf.keras.models.Model(inputs=input_layer,outputs=x)


random.seed(36)
log_dir='./log'

mod=model(layers.Input(shape=(72)))
mod.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),loss=tf.keras.metrics.categorical_crossentropy,metrics=['accuracy'])
print(mod.summary())
logging = tf.keras.callbacks.TensorBoard(log_dir=log_dir)
checkpoint = tf.keras.callbacks.ModelCheckpoint(log_dir +'/'+ 'ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5',
                             monitor='val_loss', save_best_only=True, mode='min',
                             save_weights_only=True, period=1)
reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3, verbose=1)
early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1)

if os.path.exists( log_dir +'/'+ 'train_weights.h5'):
    mod.load_weights(log_dir+'/' + 'train_weights.h5',by_name=True)
mod.fit(train_generate(),
        steps_per_epoch=80,
        validation_data=test_generate(),
        validation_steps=20,
        verbose=1,
        initial_epoch=0,
        epochs=100,
        callbacks=[logging,checkpoint,reduce_lr,early_stopping])
mod.save_weights(log_dir+'/'+'train_weights.h5')

本文地址:https://blog.csdn.net/qq_37972530/article/details/107398544