23-TensorFlow2.2+Keras版本新特性---自动图
基于autograph的tf.keras流程
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-430
(5)重启系统
(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
上一篇: C++版本归并排序
下一篇: tp5模型save与create