Tensorflow2.0入門教程(一)

    之前寫過一些機器學習的基礎算法,發現大家都不感興趣,痛定思痛了很久,決定深入淺出的寫這一門學問。

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是驗證裏面是驗證集合
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章