在2019年tensorflow迎来了更新,从1.0时代到2.0,其中有一个很重要的点就是keras 现在已经集成到了tensorflow框架下,因此在升级到2.0版本去运行tensorflow1.0+的代码时会遇到几个bug,略为复杂,此处不做解释。
2.0版本直接import keras 会导致error产生,需要在前面加上from tensorflow
from tensorflow import keras
以下是参考tensorflow文档个人学习的文档,由于文档内有些地方不是很明确,个人梳理了下希望能帮到一起学习的同学。
首先先进行相关的包导入
from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
导入数据集
keras自身封装了一些数据集,我们导入其中的fashion_mnist数据集(包含了十种服饰的6000个28*28像素的图片,标签已经标记好)
fashion_mnist = keras.datasets.fashion_mnist
对数据进行预处理
接下来就是从数据集中获取训练/测试的图片和标签,同时声明数据集中的分类;
由于60000个数据太多,我们仅取用前1000个训练集和测试集;
将图片的数值归一化,是为了更便捷地处理图片
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
# 此处声明类
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
# 取前1000个数据
train_labels = train_labels[:1000]
test_labels = test_labels[:1000]
# 归一化数据
train_images = train_images[:1000].reshape(-1, 28, 28) / 255.0
test_images = test_images[:1000].reshape(-1, 28, 28) / 255.0
创建序列模型
此处我们就开始搭建训练的模型,定义了一个create_model方法,其中包括模型部分和编译器部分
模型部分:
1、flatten层能展平数据;
2、Dense部分即为全连接层,代表了输入和输出;
3、activation='relu'
即为激活函数,默认不适用。未使用的情况下是线性激活,输入与输出相同。
编译部分:
1、optimizer是进行优化器的选择
2、loss即是使用对应的损失函数
3、metrics是评价函数
def create_model():
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10)
])
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
return model
开始训练模型
定义一个model对象,使用fit输入训练集和label进行训练。
epochs是指对训练集运转的轮数,10表示运转整个训练集10次。
model = create_model()
model.fit(train_images, train_labels, epochs=10)
运行结果:
1000/1000 [==============================] - 0s 103us/sample - loss: 1.6780 - accuracy: 0.8010
使用测试集查看运行的准确率
对比在训练集中的准确率,一般测试集都会较低些
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print('\nTest accuracy:', test_acc)
结果
1000/1 - 0s - loss: 1.7181 - accuracy: 0.7600
保存训练好的模型
我们先查看模型的网络结构:
print(model.summary())
运行结果:
接下俩对模型进行保存(小编命名为my_new_model),我们保存的格式为H5文件,可视为二进制的blob。该文件内保存了完整的模型,包括其:
权重
模型配置(结构)
优化器配置
对比别的保存方式最为简便及完全。
model.save('my_new_model.h5')
调用模型
新建一个python文档,导入keras
from tensorflow import keras
加载模型
# 重新创建完全相同的模型,包括其权重和优化程序
new_model = keras.models.load_model('my_new_model.h5')
到此模型已经导入结束,我们导入测试集图片进行测试,并打印其网络结构及准确率
# 导入测试集
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
# 继续选取前1000个数据作为测试集
test_labels = test_labels[:1000]
test_images = test_images[:1000].reshape(-1, 28, 28) / 255.0
# 打印出网络结构及进行测试
new_model.summary()
loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
运行结果:
到此我们已经成功地建立了模型,并对其进行训练和验证、保存,以及对其进行了回调。
初入keras的坑,如有不对请路过的大佬多多指正,谢谢。
喜欢可关注,后续会继续发布更多的文章,感谢支持!
完整内容请参考tensorflow官方教程:
tensorflow教程