深度学习笔记:Tensorflow 模型建立与训练-多层感知器MLP
关于Fashion-MNIST数据集
Zalando用Fashion-MNIST数据集取代MNIST数据集,将Fashion-MINST作为机器学习的数据集。
Fashion-MNIST数据集一共有70000张关于服装和鞋包的图片构成,每张图片的像素为28×28,灰度显示。其中,60000张图片是用于训练,10000张图片用于测试。
Fashion数据集可以分为十个类别,用中文表示如下:
class_name = [“T恤”,“裤子”,“帽头衫”,“连衣裙”,“外套”,“凉鞋”,“衬衫”,“运动鞋”,“包”,“靴子”]
加载Fashion数据集
本次应用采用Tensorflow的版本是2.3.0
- 导入必须的库
import tensorflow as tf
import numpy as np
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras import Model
import matplotlib.pyplot as plt - 加载数据集
#读取训练用的输入特征和标签
fashion = tf.keras.datasets.fashion_mnist
(x_train, y_train), (x_test, y_test) = fashion.load_data()
说明:
x_train:表示加载特征数据训练集,即6万张图片训练集
y_train:表示图片对应分类的标签训练集
x_test:表示加载特征数据测试集,即包含10000张图片的测试集
y_test:表示图片对应分类的标签训练集
#为了实现输入特征归一,取值在【0,1】,并减小计算量,将图片默认为0~255之间的数字,方便神经网络吸收
x_train, x_test = x_train/255.0, x_test/255.0
class_name = [“T恤”,“裤子”,“帽头衫”,“连衣裙”,“外套”,“凉鞋”,“衬衫”,“运动鞋”,“包”,“靴子”]
构建神经网络
定义神经网络类
定义神经网络模型类FashionModel,是tf.keras.Model的子类
class FashionModel(Model):
# 定义网络结构
def __init__(self):
super(FashionModel, self).__init__()
#将数据拉直 [28,28]->[784,1]
self.flatten = Flatten()
#指定激活函数
self.d1 = Dense(128, activation="relu")
#指定激活函数,设置为[0,1]之间的数字
self.d2 = Dense(10, activation="softmax")
def call(self, inputs, training=None, mask=None):
x = self.flatten(inputs)
x = self.d1(x)
y = self.d2(x)
return y
上述网络分为三层:拉直层flatten、全连接层d1、第二个全连接层d2
定义并调用神经网络,将训练集和测试集作为参数传入:
def generate_nn(x_train,y_train,x_test,y_test):
# 声明神经网络对象
model = FashionModel()
# 配置训练方法(优化器,损失函数,评测指标)
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=[tf.keras.metrics.sparse_categorical_accuracy])
# 执行训练过程
model.fit(x_train, y_train,
batch_size=32, epochs=10,
validation_data=(x_test, y_test),
validation_freq=1)
# 打印网络结构和参数
model.summary()
return model
图片显示处理
def show_image(img_arr):
"""
显示图片
Parameters
----------
img_arr : numpy.ndarray
表示图片
"""
plt.imshow(img_arr,cmap="binary")
plt.show()
预测十张图片的分类
图片所在的位置:
图片的扩展名是jpeg
#创建模型
model = generate_nn(x_train,y_train,x_test,y_test)
#定义图片的存储位置
path = "./test_data/exam_fashion/exam_fashion/"
#图片的文件名,形如1.jpeg
images = ["%d.jpeg"%i for i in range(0,10)]
#生成28x28的图片数组
matrix = np.full(784,255.0).reshape(28,28)
images_data=[]
for imgfile in images:
#设置要访问的图片文件名
img_name = "%s%s"%(path,imgfile)
#加载图片
img = tf.keras.preprocessing.image.load_img(img_name,color_mode="grayscale",target_size=(28,28))
img_data = tf.keras.preprocessing.image.img_to_array(img) #将图片数据转换成numpy数组
img_data = matrix-img_data.reshape(28,28) #图片反相处理,黑变白,白变黑,将数组设置为28x28
show_image(img_data) #显示图片
images_data.append(img_data)
def main():
images_data = np.array(images_data)
y_pred = model.predict(images_data) #预测的结果
index = np.argmax(y_pred,axis=1) #获取预测的结果,返回二位数组的 列坐标对应的分类
for i in index: #显示最后的结果
print(i,class_name[i])
if __name__=="__main__":
main()
测试的结果:
6 衬衫
1 裤子
4 外套
3 连衣裙
4 外套
5 凉鞋
0 T恤
7 运动鞋
8 包
9 靴子
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/195569.html