赞
踩
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)

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。