学习目标:
TensorFlow由谷歌开源的机器学习框架,其对常见机器学习算法的包装性好,“开箱即用”,让开发者能够轻松地构建和部署各类机器学习模型,并可直接用于生产系统。TensorBoard是TensorFlow配套的一个可视化工具,它可以用来展示网络图、指标变化、参数分布情况等。特别是在训练网络的时候,我们可以设置不同的参数(比如:权重、偏置、卷积层数、全连接层数等),使用TensorBoard可以很直观的帮我们进行参数的选择。它通过运行一个本地服务器,监听6006端口。在浏览器发出请求时,分析训练时记录的数据,绘制训练过程中的图像。 本文将进行一个简单的使用演示。搭建一个全连接层的机器学习模型,来预测图片的分类。 本次演示的数据集采用Fashion-MNIST,Fashion-MNIST包含了10个类别的图像,分别是:t-shirt(T恤),trouser(牛仔裤),pullover(套衫),dress(裙子),coat(外套),sandal(凉鞋),shirt(衬衫),sneaker(运动鞋),bag(包),ankle boot(短靴)。了解TensorFlow 2 模型构建方法,掌握keras。同时结合tensorboard图像化展示,进而进行模型的调优等。
模型目标:预测图片分类
预测任务:
预测像素点为(28,28)的灰度照片的分类。
数据集为 tf.keras.datasets.fashion_mnist的分类数据
学习内容1:构建模型
构建方法:采用keras中的layer,一层层堆叠,然后compile
代码:
import tensorflow as tf
fashion_mnist = tf.keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels) = fashion_mnist.load_data()
print('训练数据的输入特征维度是:',train_images.shape)
print('训练数据的标签维度是:',train_labels.shape)
print('测试数据的输入特征维度是:',test_images.shape)
print('测试数据的标签维度是:',test_labels.shape)
class_names = ['T_shirt(T恤)','Trouser(裤子)','Pullover(套衫)','Dress(裙子)','Coat(外套)','Sandal(凉鞋)','Shirt(汗衫)','Sneaker(运动鞋)','Bag(包)','Ankle_boot(踝靴)']
import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
i = 0
for (image,label) in zip(test_images,test_labels):
# image = image.reshape((28,28))
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(image,cmap=plt.cm.binary)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.xlabel(class_names[label])
i+=1
if i==25:
break
plt.show()
input_xs = tf.keras.Input(shape=(28,28))
flat = tf.keras.layers.Flatten()(input_xs)
dense_1 = tf.keras.layers.Dense(256,activation='relu',name='dense_1')(flat)
dense_2 = tf.keras.layers.Dense(128,activation='relu',name='dense_2')(dense_1)
dense_3 = tf.keras.layers.Dense(512,activation='relu',name='dense_3')(dense_2)
logits = tf.keras.layers.Dense(10,activation='softmax',name='predict')(dense_3)
model = tf.keras.Model(inputs = input_xs,outputs=logits)
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy','mse'])
print(model.summary())
tf.keras.utils.plot_model(model)
tensorboard = tf.keras.callbacks.TensorBoard(histogram_freq=1)
model.fit(x=train_images,y=train_labels,epochs=500,batch_size=128,callbacks=[tensorboard])
score = model.evaluate(x=test_images,y=test_labels)
print('last loss is :' + str(score[0]))
print('last accuracy is :' + str(score[1]))
print('last mse is :' + str(score[2]))
运行结果:
可以看到采用3层全连接层,最终的准确度达到88.32%
tensorboard图像展示:
根据上述的内容,产生的tensorboard如下:
模型可以看到了3个全连接层。
损失函数随着迭代次数的减小情况:
准确度:
对比CNN模型:
CNN模型构建如下:
import tensorflow as tf
fashion_mnist = tf.keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels) = fashion_mnist.load_data()
print('训练数据的输入特征维度是:',train_images.shape)
print('训练数据的标签维度是:',train_labels.shape)
print('测试数据的输入特征维度是:',test_images.shape)
print('测试数据的标签维度是:',test_labels.shape)
class_names = ['T_shirt(T恤)','Trouser(裤子)','Pullover(套衫)','Dress(裙子)','Coat(外套)','Sandal(凉鞋)','Shirt(汗衫)','Sneaker(运动鞋)','Bag(包)','Ankle_boot(踝靴)']
train_images = tf.expand_dims(train_images,axis=3)
test_images = tf.expand_dims(test_images,axis=3)
print('修正后训练数据的输入特征维度是:',train_images.shape)
print('修正后测试数据的输入特征维度是:',test_images.shape)
input_xs = tf.keras.Input(shape=(28,28,1))
cov1 = tf.keras.layers.Conv2D(32,kernel_size=(3,3),activation='relu',padding='SAME')(input_xs)
pool1 = tf.keras.layers.MaxPool2D(strides=[2,2])(cov1)
norm1 = tf.keras.layers.BatchNormalization()(pool1)
cov2 = tf.keras.layers.Conv2D(64,kernel_size=(3,3),activation='relu',padding='SAME')(norm1)
pool2 = tf.keras.layers.MaxPool2D(strides=[2,2])(cov2)
norm2 = tf.keras.layers.BatchNormalization()(pool2)
cov3 = tf.keras.layers.Conv2D(128,kernel_size=(3,3),activation='relu',padding='SAME')(norm2)
pool3 = tf.keras.layers.MaxPool2D(strides=[2,2])(cov3)
norm3 = tf.keras.layers.BatchNormalization()(pool3)
flatten = tf.keras.layers.Flatten()(norm3)
dense_1 = tf.keras.layers.Dense(32,activation='relu',name='dense_1')(flatten)
dense_2 = tf.keras.layers.Dropout(rate=0.2)(dense_1)
dense_2 = tf.keras.layers.Dense(64,activation='relu',name='dense_2')(dense_1)
dense_2 = tf.keras.layers.Dropout(rate=0.5)(dense_2)
logits = tf.keras.layers.Dense(10,activation='softmax',name='predict')(dense_2)
model = tf.keras.Model(inputs = input_xs,outputs=logits)
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy','mse'])
print(model.summary())
tf.keras.utils.plot_model(model)
tensorboard = tf.keras.callbacks.TensorBoard(histogram_freq=1)
model.fit(x=train_images,y=train_labels,epochs=50,batch_size=256,verbose=2,callbacks=[tensorboard])
score = model.evaluate(x=test_images,y=test_labels)
print('last loss is :' + str(score[0]))
print('last accuracy is :' + str(score[1]))
print('last mse is :' + str(score[2]))
tensorboard图像展示:
根据上述的内容,产生的tensorboard如下:
模型可以看到了3个卷积层和2个全连接层。
运行结果如下:
损失函数随着迭代次数的减小情况:
精确度:
准确率达到91.53%。
从tensorboard的显示的趋势走向来看,模型是有效的,包括学习率的选取等。
而且,CNN比传统的全连接神经网络的准确度高3%。简直是一次重大的突破。
作为对比,我们训练一个异常模型,也就是某些参数设置不合理,导致模型无法收敛的。对比看模型参数的变化。
我们可以看到模型失效时,accuracy的精度在随机跳动,不收敛,模型参数也没有得到有效的更新。
本文只是简单的演示TensorBoard的使用方法,大概介绍其原理和初步印象,如果要深入研究,还有很多可以研究的点,总之,有了TensorBoard可以帮我更加直观的看清模型结构,判断模型训练参数是否有效,并进行可视化展示。