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)