tensorflow和keras及tf.keras的區別前端
API: 全稱Application Programming Interface,即應用程序編程接口。API是一些預約義函數,目的是用來提供應用程序與開發人員基於某軟件或者硬件得以訪問一組例程的能力,而且無需訪問源碼或無需理解內部工做機制細節。python
tensorflow: Google開源的基於數據流圖的機器學習框架,支持python和c++程序開發語言。轟動一時的AlphaGo就是使用tensorflow進行訓練的,其命名基於工做原理,tensor 意爲張量(即多維數組),flow 意爲流動。即多維數組從數據流圖一端流動到另外一端。目前該框架支持 Windows、Linux、Mac乃至移動手機端等多種平臺。c++
Keras是基於TensorFlow和Theano(由加拿大蒙特利爾大學開發的機器學習框架)的深度學習庫,是由純python編寫而成的高層神經網絡API,是爲了支持快速實踐而對tensorflow或者Theano的再次封裝。編程
區別:keras自己並不具有底層運算的能力,因此它須要和一個具有這種底層運算能力的backend(後端)協同工做。即keras爲前端,tensorflow爲keras經常使用的後端。後端
tf.keras是一個不強調後端可互換性、和tensorflow更緊密整合、獲得tensorflow其餘組建更好支持、且符合keras標準的高層次API。現在tf.keras版本和keras進行了同步,tf.keras做爲官方的tensorflow的高級API。數組
分類問題預測的是類別,模型的輸出是機率分佈。網絡
迴歸問題預測的是數值,模型輸出的也是數值。架構
目標函數:用來衡量模型的好壞。框架
一、須要衡量目標類別與當前預測的差距機器學習
eg. 三分類問題輸出機率分佈:[0.2, 0.7, 0.1],即預測爲第0類,第一類或者第二類的機率分別爲0.2,0.7,0.1。但在這裏要作one-hot編碼,即將真實的類別編碼爲1,其他編碼爲0。這裏假如真實類別爲第二類的話,輸出機率分佈經one-hot編碼編碼以後的結果爲[0, 0, 1]。
二、損失函數
分類問題中經常使用的損失函數有:
這裏n爲總的樣本數,y爲真實標籤,pred(y)爲經過模型預測的標籤。
一、須要衡量預測值與真實值的差距
二、損失函數
分類問題中經常使用的損失函數有:
三、模型訓練:經過調整參數,使得目標函數逐漸變小的過程
新建python3文件——tf_keras_classification_model.py
1、首先import進所必須的模塊,並查看版本號。
1 import matplotlib as mpl 2 import matplotlib.pyplot as plt 3 #%matplotlib inline 4 import numpy as np 5 import sklearn 6 import pandas as pd 7 8 import os 9 import sys 10 import time 11 import tensorflow as tf 12 from tensorflow import keras 13 14 print(tf.__version__) 15 print(sys.version_info) 16 17 for module in mpl,np,pd,sklearn,tf,keras: 18 print(module.__name__,module.__version__)
咱們能夠看到各模塊的版本號分別爲:
2.0.0 sys.version_info(major=3, minor=7, micro=4, releaselevel='final', serial=0) matplotlib 3.1.1 numpy 1.16.5 pandas 0.25.1 sklearn 0.21.3 tensorflow 2.0.0 tensorflow_core.keras 2.2.4-tf
2、而後咱們導入keras中的fashion_mnist數據集並查看數據大小:
1 # 導入Keras中的數據 2 fashion_mnist = keras.datasets.fashion_mnist 3 (x_train_all,y_train_all),(x_test,y_test) = fashion_mnist.load_data() 4 5 # 將數據集拆分紅訓練集與驗證集 6 # 將前5000張圖片做爲驗證集,後55000張圖片做爲訓練集 7 x_valid,x_train = x_train_all[:5000],x_train_all[5000:] 8 y_valid,y_train = y_train_all[:5000],y_train_all[5000:] 9 print(x_valid.shape,y_valid.shape) 10 print(x_train.shape,y_train.shape) 11 print(x_test.shape,y_test.shape)
打印結果爲:
(5000, 28, 28) (5000,) (55000, 28, 28) (55000,) (10000, 28, 28) (10000,)
接下來咱們能夠簡單瞭解下數據集中的內容:
1 def show_single_image(img): 2 plt.imshow(img,cmap='binary') 3 plt.show() 4 show_single_image(x_train[0])
咱們能夠看到訓練集中的第一張圖片:
固然咱們也能夠寫個函數展現出多張圖片:
1 def show_imgs(n_rows,n_cols,x_data,y_data,class_names): 2 assert len(x_data) == len(y_data) 3 assert n_rows * n_cols < len(x_data) 4 plt.figure(figsize = (n_cols * 1.4,n_rows * 1.6)) 5 for row in range(n_rows): 6 for col in range(n_cols): 7 index = n_cols * row + col 8 plt.subplot(n_rows,n_cols,index+1) 9 plt.imshow(x_data[index],cmap='binary',interpolation='nearest') 10 plt.axis('off') 11 plt.title(class_names[y_data[index]]) 12 plt.show() 13 14 class_names=['T-shirt','Trouser','Pullover','Dress','Coat','Sandal','Shirt','Sneaker','Bag','Ankle boot'] 15 show_imgs(4,5,x_train,y_train,class_names)
3、構建tf.keras模型
構建keras模型要用到 tf.keras.Sequential API (查看詳細介紹www.tensorflow.org)。
方法一:用model.add方法
#方法一 model = keras.models.Sequential() #將輸入的28*28的圖像展平爲784(28*28)的一維向量 model.add(keras.layers.Flatten(input_shape=[28,28])) #全鏈接層,輸出長度爲300,激活函數爲‘relu’函數 model.add(keras.layers.Dense(300,activation='relu')) #全鏈接層,輸出長度爲100,激活函數爲‘relu’函數 model.add(keras.layers.Dense(100,activation='relu')) #全鏈接層,由於咱們這裏是10個類別的分類問題,故輸出長度爲10,激活函數爲‘softmax’函數 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') ])
這樣一來咱們就搭建好了一個簡單的模型,而後咱們在配置學習過程,即設置損失函數、優化器和訓練指標。代碼以下:
#配置學習過程 model.compile(loss = 'sparse_categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
這裏的loss意爲損失函數,模型使用的是 'sparse_categorical_crossentropy',能夠自動對 y_train 進行one-hot 編碼。若 y_train 已是編碼後的數據了,則可使用loss='categorical_crossentropy'
optimizer 爲模型的求解方法,並依靠這個來調整參數, 模型使用的 ‘sgd’ 爲隨機梯度降低法。
metrics爲咱們還需關注的其餘性能,這裏是精度accuracy。
而後咱們能夠經過下述代碼查看模型架構:
#查看模型概況(架構) model.summary()
代碼運行結果以下:
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= flatten (Flatten) (None, 784) 0 _________________________________________________________________ dense (Dense) (None, 300) 235500 _________________________________________________________________ dense_1 (Dense) (None, 100) 30100 _________________________________________________________________ dense_2 (Dense) (None, 10) 1010 ================================================================= Total params: 266,610 Trainable params: 266,610 Non-trainable params: 0 _________________________________________________________________
咱們能夠看到網絡共有四層。
在這裏涉及的參數(Param)個數的計算:以第二層dense爲例,輸入爲(None, 784),經dense層來獲得長度爲300的結果(None, 300),其中None爲樣本數,具體過程爲:
(None, 784)* W + b = (None, 300),這裏的 W 爲權重,b 爲偏置,由矩陣相關知識咱們能夠知道 W 爲(784,300),b 爲(300,),因此總的參數個數爲params=784*300+300=235500。
4、開啓訓練
#開啓訓練 history = model.fit(x_train,y_train,epochs=10, validation_data=(x_valid,y_valid)) #epochs爲遍歷數據集的次數
這裏用 fit 方法來對模型進行訓練,須要傳入的參數包括:一、訓練集,二、遍歷次數epochs,三、驗證集
訓練過程爲:
Train on 55000 samples, validate on 5000 samples Epoch 1/10 55000/55000 [==============================] - 9s 171us/sample - loss: 3032409856428.1016 - accuracy: 0.1002 - val_loss: 2.3028 - val_accuracy: 0.0914 Epoch 2/10 55000/55000 [==============================] - 8s 140us/sample - loss: 2.3027 - accuracy: 0.0993 - val_loss: 2.3028 - val_accuracy: 0.0914 Epoch 3/10 55000/55000 [==============================] - 8s 141us/sample - loss: 2.3026 - accuracy: 0.0999 - val_loss: 2.3028 - val_accuracy: 0.0986 Epoch 4/10 55000/55000 [==============================] - 8s 141us/sample - loss: 2.3026 - accuracy: 0.0986 - val_loss: 2.3029 - val_accuracy: 0.0976 Epoch 5/10 55000/55000 [==============================] - 8s 141us/sample - loss: 2.3026 - accuracy: 0.0994 - val_loss: 2.3027 - val_accuracy: 0.0976 Epoch 6/10 55000/55000 [==============================] - 8s 138us/sample - loss: 2.3027 - accuracy: 0.0994 - val_loss: 2.3028 - val_accuracy: 0.0980 Epoch 7/10 55000/55000 [==============================] - 8s 138us/sample - loss: 2.3027 - accuracy: 0.0991 - val_loss: 2.3028 - val_accuracy: 0.1000 Epoch 8/10 55000/55000 [==============================] - 8s 139us/sample - loss: 2.3027 - accuracy: 0.0991 - val_loss: 2.3027 - val_accuracy: 0.0986 Epoch 9/10 55000/55000 [==============================] - 8s 143us/sample - loss: 2.3027 - accuracy: 0.0961 - val_loss: 2.3028 - val_accuracy: 0.0914 Epoch 10/10 55000/55000 [==============================] - 8s 138us/sample - loss: 2.3027 - accuracy: 0.0993 - val_loss: 2.3028 - val_accuracy: 0.0976
能夠用下述代碼查看訓練過程當中的損耗和精度:
history.history
代碼運行結果以下:
{'loss': [3032409856428.102, 2.302662184316462, 2.3026436624353583, 2.3026383281360974, 2.3026348412600433, 2.302653038822521, 2.3026530591097747, 2.3026501728404654, 2.3026565206701104, 2.3026550307187166], 'accuracy': [0.10018182, 0.09934545, 0.09990909, 0.0986, 0.0994, 0.09936364, 0.09910909, 0.09910909, 0.09612727, 0.09934545], 'val_loss': [2.3027801795959473, 2.302774501800537, 2.3028094802856445, 2.3028686981201174, 2.302722678375244, 2.302815665435791, 2.3028056652069093, 2.3027444290161134, 2.302812654876709, 2.3027816261291503], 'val_accuracy': [0.0914, 0.0914, 0.0986, 0.0976, 0.0976, 0.098, 0.1, 0.0986, 0.0914, 0.0976]}
5、打印訓練過程曲線圖
編寫一段代碼以實現訓練過程可視化
#變化過程可視化 def plot_learning_curves(history): pd.DataFrame(history.history).plot(figsize=(8,5)) plt.grid(True) #打印網格 plt.gca().set_ylim(0,1) plt.show() plot_learning_curves(history)
代碼運行結果以下:
能夠看到由於模型的的適用度和未歸一化等緣由,使得咱們的訓練效果並非很好。