一.Himmelblau函数优化(FunctionOptimization)
此函数为:
图像如下所示:
图上四个蓝点的最小值都是0(z轴,即函数值),分别为f(3.0,2.0)=0.0、f(-2.805,3.131)=0.0、f(-3.779,-3.283)=0.0、f(3.584,-1.848)=0.0;分别位于x-y平面的第一、二、三、四象限;
我们先来自己画出这个函数图像:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
def himmelblau(x): #定义himmelblau函数
return (x[0] ** 2 + x[1] - 11) ** 2 + (x[0] + x[1] ** 2 - 7) ** 2
x = np.arange(-6,6,0.1) #设置x范围
y = np.arange(-6,6,0.1) #设置y范围
print('x,y range:',x.shape,y.shape)
X,Y = np.meshgrid(x,y)
print('x,y maps:',x.shape,y.shape)
Z = himmelblau([X,Y])
fig = plt.figure("himmelblau")
ax = fig.gca(projection='3d')
ax.plot_surface(X,Y,Z)
ax.view_init(60,-30)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()
图像输出为:
然后使用梯度下降的方法,来找出最小值点:
# [1., 0.], [-4, 0.], [4, 0.] #随机的初始点不同,找到的最小值位置也不同
x = tf.constant([-4., 0.]) #随机初始点
for step in range(100): #迭代一百次
with tf.GradientTape() as tape:
tape.watch([x])
y = himmelblau(x)
grads = tape.gradient(y, [x])[0] #求到梯度
x -= 0.01 * grads #使用梯度更新x
if step % 20 == 0:
print('step {}: x = {}, f(x) = {}'
.format(step, x.numpy(), y.numpy())) #打印x的状态
最终输出为:
step 0: x = [-2.98 -0.09999999], f(x) = 146.0
step 20: x = [-3.6890159 -3.1276689], f(x) = 6.054703235626221
step 40: x = [-3.7793102 -3.283186 ], f(x) = 0.0
step 60: x = [-3.7793102 -3.283186 ], f(x) = 0.0
step 80: x = [-3.7793102 -3.283186 ], f(x) = 0.0
可见在第40次迭代寻找时就已经找到最低点。
二.TensorBoard可视化(TensorBoardVisualization)
安装:一般情况下现在的Tensorflow里是自动安装了Tensorboard的,可以直接使用,如果没有的话,就直接在命令行中输入activate tensorflow进入tensorflow环境,再输入pip install tensorboard即可;
打开:运用一个生成可视化的py文件,在文件同目录下生成了一个log文件后,在这个目录进入命令行,输入tensorboard --logdir=logs,命令行会生成一个地址,直接进入就是tensorboard的界面啦。
监听:curves曲线Loss/acc;可以向里面喂入各种参数来进行监听;
with summary_writer.as_default:
tf.summary.scalar('loss',float(loss),step=epoch)#向里面喂入loss参数从而监听
tf.summary.scalar('accuracy', float(train_accuracy), step=epoch)
图片可视化:向tensorboard喂入图片进行监听,不仅可以监听单张,而且在图片很多时可以同时喂入多张图片;
simple_img = next(iter(db))[0]
simple_img = simple_img[0]
simple_img = tf.reshape(simple_img,[1,28,28,1])
with summary_writer.as_default:
tf.summary.scalar('Training simple',simple_img,step=0) #向里面喂入图片从而监听
具体的整体实例以及输出见:Tensorflow学习笔记----TensorBoard数据可视化安装与使用
三.Keras高层接口(KerasInterface)
这里的Keras就是Tensorflow提供的包tf.keras,这个包提供的功能有:
datasets(数据集),layers,losses(损失函数),metrics(监听计算数据考查性能),optimizers(优化器)
datasets的数据集加载在前面很多地方都写过,就不多做介绍:
(x, y), (x_val, y_val) = datasets.mnist.load_data()
这里主要介绍metrics
1.首先看如新建meter:
acc_meter = metrics.Accuracy(); loss_meter = metrics.Mean();
2.更新数据:
loss_meter.update_state(loss); acc_mater.update_state(y,pred);
3.取出数据:
Print(step,’loss = ’,loss_meter.result().numpy);
Print(step,’Evaluate Acc = ’,total_correct/total,acc_meter.result().numpy());
4.清楚缓存:
loss_meter.reset_state();
接下来看一下快捷训练方法:Compile&Fit;其中Compile主要是一个装载的功能,指定了优化器以及评估指标的选择;接着通过Fit完成标准处理流程;然后通过Evaluate完成测试;最后拿到训练好的模型,通过Predict进行新样本的预测。
networks.compile(optimizers = optimizers.Adam(lr=0.01),#定义优化器
loss = tf.losses.CategoricalCrossentropy(from_logits=True), #指定Loss
metrics = ['accuracy'] #指定测试指标
)
network.fit(db,epoch=10) #指定迭代次数
network.fit(db,epoch=10,validation_data=ds_val,validation_freq=2) #指定测试
netword.evaluate(tt_val) #进行验证