TensorFlow2快速模型构建及tensorboard初体验

学习目标:

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可以帮我更加直观的看清模型结构,判断模型训练参数是否有效,并进行可视化展示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值