【TensorFlow】mnist分类问题实战

In[1]:

import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import sklearn
import pandas as pd
import os
import sys
import time
import tensorflow as tf

from tensorflow import keras
print(tf.__version__)

Out:

2.0.0

In [23]:

fashion_mnist=keras.datasets.fashion_mnist
(x_train_all,y_train_all),(x_test,y_test)=fashion_mnist.load_data()
x_valid,x_train=x_train_all[:5000],x_train_all[5000:]   #拆分成验证集和数据集
y_valid,y_train=y_train_all[:5000],y_train_all[5000:]

print(x_valid.shape,y_valid.shape)  #打印形状
print(x_train.shape,y_train.shape)
print(x_test.shape,y_test.shape)
#在进行该步的时候,一开始未下载好数据集,可以自己手动到官网上去下载(具体做法可百度),添加到C盘中.kernal文件下
#如果出现了加载数据集失败,可能是数据集下载的不够全而导致的

Out:

(5000, 28, 28) (5000,)
(55000, 28, 28) (55000,)
(10000, 28, 28) (10000,)

In [24]:

def show_single_image(img_arr):
	plt.imshow(img_arr,cmap="binary") #binary二值图片显示
	plt.show()
#imshow是设置图片的展示,cmap意思是color map,颜色方案,binary代表是白底黑字;
show_single_image(x_train[0])

Out:
在这里插入图片描述

In [25]:

def show_imgs(n_rows,n_cols,x_data,y_data,class_names):
	assert len(x_data)==len(y_data)  #验证样本数
#assert是断言函数,判断是否满足要求,返回的是布尔值,若不满足则直接终止程序
	assert n_rows*n_cols<len(x_data)  #行列乘积不能大于样本数
	plt.figure(figsize=(n_cols*1.4,n_rows*1.6))
#plt.figure(1)是新建一个名叫 Figure1的画图窗口,plt.plot(x,c)是在画图窗口里具体绘制横轴为x 纵轴为c的曲线
	for row in range(n_rows):
		for col in range (n_cols):
			index=n_cols*row +col
			plt.subplot(n_rows,n_cols,index+1)
#plt.subplot()函数用于直接指定划分方式和位置进行绘图。
			plt.imshow(x_data[index],cmap="binary",
						interpolation='nearest') #interpolation插值方法
			plt.axis('off')
			plt.title(class_names[y_data[index]])
	plt.show()
	
    
#MATLAB和pyplot有当前的图形(figure)和当前的轴(axes)的概念,所有的作图命令都是对当前的对象作用。
#可以通过gca()获得当前的轴(axes),通过gcf()获得当前的图形(figure)。

    
class_names=['T-shirt','Trouser','Pullover','Dress','Coat','Sandal','Shirt','Sneaker','Bag','Ankle boot']
show_imgs(3,5,x_train,y_train,class_names)

Out:

在这里插入图片描述
补充:在matplotlib中,整个图像为一个Figure对象。在Figure对象中可以包含一个或者多个Axes对象。每个Axes(ax)对象都是一个拥有自己坐标系统的绘图区域。

在这里插入图片描述
In [56]:

#tf.keras.models.Sequential()
"""
model=keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28]))  
#对输入图片[28,28]进行展平成一维向量
model.add(keras.layers.Dense(300,activation="relu"))  #全连接层,将上一层和下一层进行依次连接,relu为激活函数
model.add(keras.layers.Dense(100,activation="relu"))
model.add(keras.layers.Dense(10,activation="softmax"))

"""
model=keras.models.Sequential([
	keras.layers.Flatten(input_shape=[28,28]),
	keras.layers.Dense(300,activation="relu"),
	keras.layers.Dense(100,activation="relu"),
	keras.layers.Dense(10,activation="softmax")
	])


#relu:y=max(0,x)
#softmax:将向量变成概率分布,x=[x1,x2,x3],
#		y=[e^x1/sum,e^x2/sum,e^x3/sum],sum=e^x1+e^x2+e^x3

model.compile(loss="sparse_categorical_crossentropy",optimizer="adam",metrics=["accuracy"])
#categorical类别的意思,crossentropy交叉熵损失函数
#reason for sparse:如果y(其是一个index)是一个数,那么就需要sparse,将其y->one_hot->[],
#	如果y已经是一个向量,那么就省略sparse,写成categorical_crossentropy
#optimizer是模型的求解方法,用于调整参数,使得目标函数越来越小
#一开始优化器选择的是sgd,训练的效果非常差,之后又换了adam,迅速得到提升
#优化器的选择有:sgd、adam、rmsprop
#metrics是关心的除损失函数外其他地方,比如这里的精准度

In [57]:

model.layers   #可以查看这个模型有多少层

Out:

[<tensorflow.python.keras.layers.core.Flatten at 0x1e2ad980c08>,
 <tensorflow.python.keras.layers.core.Dense at 0x1e2ad980408>,
 <tensorflow.python.keras.layers.core.Dense at 0x1e2ad986548>,
 <tensorflow.python.keras.layers.core.Dense at 0x1e2ad986148>]

In [58]:

model.summary()  #查看模型的概况

Out:


Model: "sequential_11"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
flatten_11 (Flatten)         (None, 784)               0         
_________________________________________________________________
dense_33 (Dense)             (None, 300)               235500    
_________________________________________________________________
dense_34 (Dense)             (None, 100)               30100     
_________________________________________________________________
dense_35 (Dense)             (None, 10)                1010      
=================================================================
Total params: 266,610
Trainable params: 266,610
Non-trainable params: 0
_________________________________________________________________

In [59]:

#flatten到dense:[None,784]*W+b->[None,300] 其中W.shape=[784,300],b=[300]

In [60]:

history=model.fit(x_train,y_train,epochs=10,validation_data=(x_valid,y_valid))   
#epochs训练集遍历10次,validation_data每隔一段时间就会对验证集进行一次验证
#model.fit会返回一些训练信息
#history是一个callback

Out:

Train on 55000 samples, validate on 5000 samples
Epoch 1/10
55000/55000 [==============================] - 5s 83us/sample - loss: 2.4294 - accuracy: 0.6747 - val_loss: 0.8757 - val_accuracy: 0.7068
Epoch 2/10
55000/55000 [==============================] - 4s 71us/sample - loss: 0.8088 - accuracy: 0.7099 - val_loss: 0.7715 - val_accuracy: 0.7212
Epoch 3/10
55000/55000 [==============================] - 4s 72us/sample - loss: 0.6953 - accuracy: 0.7385 - val_loss: 0.6363 - val_accuracy: 0.7588
Epoch 4/10
55000/55000 [==============================] - 4s 72us/sample - loss: 0.5860 - accuracy: 0.7766 - val_loss: 0.5783 - val_accuracy: 0.7852
Epoch 5/10
55000/55000 [==============================] - 4s 73us/sample - loss: 0.5492 - accuracy: 0.7864 - val_loss: 0.5950 - val_accuracy: 0.7888
Epoch 6/10
55000/55000 [==============================] - 4s 74us/sample - loss: 0.5345 - accuracy: 0.7931 - val_loss: 0.5260 - val_accuracy: 0.8048
Epoch 7/10
55000/55000 [==============================] - 4s 72us/sample - loss: 0.5077 - accuracy: 0.7994 - val_loss: 0.5093 - val_accuracy: 0.8034
Epoch 8/10
55000/55000 [==============================] - 4s 73us/sample - loss: 0.4919 - accuracy: 0.8019 - val_loss: 0.5061 - val_accuracy: 0.8022
Epoch 9/10
55000/55000 [==============================] - 4s 80us/sample - loss: 0.4688 - accuracy: 0.8245 - val_loss: 0.4694 - val_accuracy: 0.8460
Epoch 10/10
55000/55000 [==============================] - 4s 76us/sample - loss: 0.4619 - accuracy: 0.8318 - val_loss: 0.4658 - val_accuracy: 0.8486

In [66]:

type(history)

Out:

tensorflow.python.keras.callbacks.History

In [ ]:

history.history   #其中含有loss,accuracy等数据过程中变化信息

In [65]:

def plot_learning_courves(history):
	pd.DataFrame(history.history).plot(figsize=(8,5)) #pandas中重要的结构
	plt.grid(True)  #显示网格
	plt.gca().set_ylim(0,1)
	plt.show()
#当前的图表和子图可以使用plt.gcf()和plt.gca()获得,
#分别表示Get Current Figure和Get Current Axes。
#在pyplot模块中,许多函数都是对当前的Figure或Axes对象进行处理,
#比如说:plt.plot()实际上会通过plt.gca()获得当前的Axes对象ax,
#然后再调用ax.plot()方法实现真正的绘图。
plot_learning_courves(history)

)
plt.show()
#当前的图表和子图可以使用plt.gcf()和plt.gca()获得,
#分别表示Get Current Figure和Get Current Axes。
#在pyplot模块中,许多函数都是对当前的Figure或Axes对象进行处理,
#比如说:plt.plot()实际上会通过plt.gca()获得当前的Axes对象ax,
#然后再调用ax.plot()方法实现真正的绘图。
plot_learning_courves(history)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200420234320826.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MjM5NjE0,size_16,color_FFFFFF,t_70)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值