2021-10-29 Tensorflow 2 Tensorflow 模型建立与训练-多层感知器MLP

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。2021-10-29 Tensorflow 2 Tensorflow 模型建立与训练-多层感知器MLP,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

关于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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!