之前寫過一些機器學習的基礎算法,發現大家都不感興趣,痛定思痛了很久,決定深入淺出的寫這一門學問。
1.下載
開始咱們先講一下下載吧,注意事項:
1.python3.6以上版本用tensorflow會很麻煩
2.我是用anaconda來下載的tensorflow包
3.下載spyder和各種包咱們都可以用anaconda navigator,就是那個個有頁面的。
2.tensorflow-kears
主要講解api估計講理論各位也不想聽,也沒有時間去聽。
1.實現在tensorflow.keras下
from tensorflow import keras
tf.keras和keras的區別(懂得自然懂,不懂不看了)
1.tf.keras全面支持eager mode
2.tf.kears支持基於tf.data的模型訓練
3.tf.keras支持TPU訓練
4.tf.keras支持tf.distribution中的分佈式策略
2.1分類問題和迴歸問題
分類問題預測的是數據的類別,模型輸出的是概率分佈。
例子:蔬菜有三個類別可以選:西紅柿,玉米(這是蔬菜嗎?),土豆,得到三分類問題輸出的是【0.1,0.6,0.3】咱們得到玉米的概率最大,所以說預測到這個東西是玉米啊。
迴歸問題預測的是值,模型輸出的是一個實數值。
(就像咱們小時候學的最小二乘法就是一個預測值的方法)
2.1.1目標函數
爲什麼需要目標函數? 參數不可能一下子就預測的很準,所以我們需要逐步調整參數。
Model A[0.1,0.1,0.8] Model B[0.1,0.4,0.5]
就當第二個參數纔是正確的,但是模型A和B都錯了,但是模型B預測的更加準確。目標函數就是能衡量模型的好和壞
分類問題需要衡量目標類別與當前預測的差距。
例子:假設三分類問題輸出的例子爲:【0.2,0.7,0.1】
咱們輸出出來的是第二個最大,其實真實的數據爲【0,0,1】(這個爲one-hot編碼)
咱們就要看這兩個類別的差距
one-hot編碼,把正整數變爲向量表達:生成一個長度不小於正整數的向量,只有正整數的位置處爲1,其餘位置都爲0.
分類問題常用的幾個方法:
1.平方差損失
2.交叉熵損失
這裏咱們就不寫公式了,直接寫例子:
預測值:【0.2,0.7,0.1】
真實值:【0,0,1】
損失函數值:[(0.2-0)2+(0.7-0)2+(0.1-1)2]*0.5=0.65(平方差損失)
迴歸問題的方式:
1.平方差損失
2.絕對值損失
模型的訓練就是調整參數使目標函數逐漸變小的過程。(只看這句話可能會不明白)
2.1.2實戰代碼
keras搭建分類模型(api可以在https://tensorflow.google.cn/這個網站自行查找)
import matplotlib as mat
import matplotlib.pyplot as plt
import numpy as np
import sklearn
import pandas as pd
import os,sys,time
import tensorflow as tf
from tensorflow import keras
print(sys.version_info)
for module in mat,np,pd,sklearn,tf,keras:
print(module.__name__,module.__version__)
上面是用的包和輸出一下我的版本,版本不同api的名字和用法也有區別。可能會報錯。
這是我的版本:
matplotlib 3.1.3
numpy 1.17.3
pandas 0.25.2
sklearn 0.22.1
tensorflow 2.0.0
tensorflow_core.keras 2.2.4-tf
提取信息方法:
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)’
輸出爲:
(5000, 28, 28) (5000,)
(55000, 28, 28) (55000,)
(10000, 28, 28) (10000,)
我把可能出現的下載不成功怎麼解決的問題寫在問題專欄裏了,大家根據需要可以看一下。如果有其他問題,在評論區說一下,一起討論。
顯示圖片(我在想要不要寫個博客把每個函數的參數都寫明白):
def show_picture(img):
plt.imshow(img, cmap="binary")
#imshow()函數負責對圖像進行處理,並顯示其格式,但是不能顯示。
#show()可以顯示
plt.show()
show_picture(x_train[0])
顯示的圖片:
顯示一羣圖片:
def show_imgs(n_rows,n_cols,x_data,y_data,class_names):
assert len(x_data)==len(y_data)
assert n_rows*n_cols<len(x_data)
plt.figure(figsize=(n_cols*1.4,n_rows*1.6))
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.imshow(x_data[index],cmap="binary",interpolation='nearest')
plt.axis('off')
#不需要座標系
plt.title(class_names[y_data[index]])
plt.show()
class_names=['T-shirt','Trouser','Pullover','Dress','Coat','Sandal','Shirt','Sneaker','Bag','Ankle boot']
#這個是百度的規律
show_imgs(3, 5, x_train, y_train, class_names)
建立keras模型:我們用的是Sequential函數我直接給大家api連接:
點擊這裏打開api官方鏈接
Sequential就是把所有的層次堆疊起來(聽不懂彆着急,知道堆疊兩個字就好)。
model=keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28]))
#展開圖片形成的28×28一維向量
model.add(keras.layers.Dense(300,activation="relu"))
#300個單元,激活函數是relu的全連接層。是分類器的作用
model.add(keras.layers.Dense(100,activation="relu"))
model.add(keras.layers.Dense(10,activation="softmax"))
#控制輸出用softmax,輸出的長度爲10
#relu:y=max(0,x),輸入一個x,如果x>0輸出x,如果x<0,輸出0
#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="sgd",
metrics=["accuracy"])
#optimizer是使目標函數變小
這個時候進行一下操作:
model.layers
Out[3]:
[<tensorflow.python.keras.layers.core.Flatten at 0x1dc66ee9fc8>,
<tensorflow.python.keras.layers.core.Dense at 0x1dc6d3598c8>,
<tensorflow.python.keras.layers.core.Dense at 0x1dc7085afc8>,
<tensorflow.python.keras.layers.core.Dense at 0x1dc7086b048>]
model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten_1 (Flatten) (None, 784) 0
_________________________________________________________________
dense_3 (Dense) (None, 300) 235500
_________________________________________________________________
dense_4 (Dense) (None, 100) 30100
_________________________________________________________________
dense_5 (Dense) (None, 10) 1010
=================================================================
Total params: 266,610
Trainable params: 266,610
Non-trainable params: 0
_________________________________________________________________
現在咱們講一下全連接層是什麼:[None,784] *w+b->[None,300] (->是全連接層的操作,w是乘到的矩陣) 其中w.shape=[784,300],b=[300]
接着咱們要開始訓練咱們的模型了。
history=model.fit(x_train,y_train,epochs=10,validation_data=(x_valid,y_valid))
#validation_data是驗證裏面是驗證集合