日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tensorflow综合示例1:tensorflow-keras的基本使用方式

發(fā)布時間:2024/1/23 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tensorflow综合示例1:tensorflow-keras的基本使用方式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
import numpy as np import matplotlib.pyplot as plt import pandas as pd import tensorflow as tf from tensorflow import keras import sklearn import osprint(tf.__version__) 2.4.1

1、基本模型構(gòu)建

本文只介紹了最基本,也是最常用的API,除此以外可以使用函數(shù)式API和子類API構(gòu)建模型,詳見《機器學習實戰(zhàn)》第10章。

1.1 準備數(shù)據(jù)集

在這里我們使用了fashion_mnist數(shù)據(jù)集,里面是70000張28*28的圖片,圖片分為衣服、鞋子等10類。

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_train.shape,y_train.shape) print(x_valid.shape,y_valid.shape) print(x_test.shape,y_test.shape) (55000, 28, 28) (55000,) (5000, 28, 28) (5000,) (10000, 28, 28) (10000,)

我們看一下圖片是什么樣子的:

def show_single_image(img_arr):plt.imshow(img_arr, cmap='binary')plt.show()show_single_image(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)

1.2 構(gòu)建模型

構(gòu)建模型主要分成2部分:

(1)指定模型的各層節(jié)點數(shù)及其連接

(2)編譯模型,指定損失函數(shù)、優(yōu)化方法、metrics等

model = keras.models.Sequential() model.add(keras.layers.Flatten(input_shape=[28,28])) #將輸入的二維數(shù)組展開成一維向量 model.add(keras.layers.Dense(300,activation='sigmoid')) model.add(keras.layers.Dense(100,activation='sigmoid')) model.add(keras.layers.Dense(10,activation='softmax'))model.compile(loss='sparse_categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])

如果sigmoid改成relu的話,精度就會降低非常的多。因為使用relu需要將數(shù)據(jù)歸一化處理,而sigmoid則不需要。

編譯模型主要指定損失函數(shù)、優(yōu)化器和衡量指標,完整列表可見:
https://keras.io/api/losses/ https://keras.io/api/optimizers https://keras.io/api/metrics

我們使用sparse_categorical_crossentropy損失,因為我們具有稀疏標簽,(即對于每個實例,只有一個目標類索引,在這種情況下為0到9),并且這些類是互斥的。相反,如果每個實例的每個類都有一個目標概率(例如獨熱向量,[0.,0.,0.,1.,0.,0.,0.,0.,0.,0]代表類3),則我們需要使用"categorical_crossentropy"損失。如果我們正在執(zhí)行二進制分類(帶有一個或多個二進制標簽),則在輸出層中使用"sigmoid"(即邏輯)激活函數(shù),而不是"softmax"激活函數(shù),并且使用"binary_crossentropy"損失。
如果要將稀疏標簽(即類索引)轉(zhuǎn)換為獨熱向量標簽,使用keras.utils.to_categorical()函數(shù)。反之則使用np.argmax()函數(shù)和axis=1。

關(guān)于優(yōu)化器,"sgd"表示我們使用簡單的隨機梯度下降來訓練模型。換句話說,Keras將執(zhí)行先前所述的反向傳播算法(即反向模式自動微分加梯度下降)。我們將在第11章中討論更有效的優(yōu)化器(它們改進梯度下降部分,而不是自動微分)。

這樣我們的模型就構(gòu)建完成了,我們看一下模型長什么樣子的:

model.layers [<tensorflow.python.keras.layers.core.Flatten at 0x7f83fa791d00>,<tensorflow.python.keras.layers.core.Dense at 0x7f83fa791d30>,<tensorflow.python.keras.layers.core.Dense at 0x7f83fa80f5b0>,<tensorflow.python.keras.layers.core.Dense at 0x7f83fa68d220>] 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 _________________________________________________________________

1.3 訓練模型

訓練模型fit()返回的是一個History對象,用于保存中間計算過程的數(shù)據(jù)。

如果訓練集非常不平衡,其中某些類的代表過多,而其它類的代表不足,那么在調(diào)用fit()方法時設(shè)置class_weight參數(shù)會很有用,這給代表性不足的類更大的權(quán)重,給代表過多的類更小的權(quán)重。Keras在計算損失時將使用這些權(quán)重。如果你需要每個實例的權(quán)重,設(shè)置sample_weight參數(shù)(如果class_weight和sample_weight都提供了,Keras會把它們相乘)。如果某些實例由專家標記,而另一些實例使用眾包平臺標記,則按實例權(quán)重可能會有用:你可能希望為前者賦予更多權(quán)重。你還可以通過將其作為validation_data元組的第三項添加到驗證集中來提供樣本權(quán)重(但不提供類權(quán)重)。

fit()方法返回一個History對象,其中包含訓練參數(shù)(history.params)、經(jīng)歷的輪次列表(history.epoch),最重要的是包含在訓練集和驗證集(如果有)上的每個輪次結(jié)束時測得的損失和額外指標的字典(history.history)。如果使用此字典創(chuàng)建pandasDataFrame并調(diào)用其plot()方法,則會獲得如圖學習曲線.

history = model.fit(x_train,y_train,epochs=10,validation_data=(x_valid,y_valid)) Epoch 1/10 1719/1719 [==============================] - 7s 4ms/step - loss: 1.5234 - accuracy: 0.5958 - val_loss: 0.7285 - val_accuracy: 0.7686 Epoch 2/10 1719/1719 [==============================] - 6s 4ms/step - loss: 0.7017 - accuracy: 0.7717 - val_loss: 0.5901 - val_accuracy: 0.8062 Epoch 3/10 1719/1719 [==============================] - 7s 4ms/step - loss: 0.5912 - accuracy: 0.8001 - val_loss: 0.5643 - val_accuracy: 0.8136 Epoch 4/10 1719/1719 [==============================] - 6s 4ms/step - loss: 0.5614 - accuracy: 0.8092 - val_loss: 0.5472 - val_accuracy: 0.8146 Epoch 5/10 1719/1719 [==============================] - 6s 3ms/step - loss: 0.5440 - accuracy: 0.8122 - val_loss: 0.5352 - val_accuracy: 0.8212 Epoch 6/10 1719/1719 [==============================] - 6s 3ms/step - loss: 0.5428 - accuracy: 0.8109 - val_loss: 0.5608 - val_accuracy: 0.8158 Epoch 7/10 1719/1719 [==============================] - 6s 3ms/step - loss: 0.5468 - accuracy: 0.8121 - val_loss: 0.5384 - val_accuracy: 0.8196 Epoch 8/10 1719/1719 [==============================] - 6s 4ms/step - loss: 0.5405 - accuracy: 0.8102 - val_loss: 0.5467 - val_accuracy: 0.8032 Epoch 9/10 1719/1719 [==============================] - 7s 4ms/step - loss: 0.5495 - accuracy: 0.8055 - val_loss: 0.5529 - val_accuracy: 0.8198 Epoch 10/10 1719/1719 [==============================] - 5s 3ms/step - loss: 0.5522 - accuracy: 0.8046 - val_loss: 0.5286 - val_accuracy: 0.8214 type(history) history.history {'loss': [1.1346834897994995,0.6621189713478088,0.5879183411598206,0.5602594017982483,0.5486269593238831,0.5448580980300903,0.5459325909614563,0.5451844334602356,0.5476701855659485,0.546495795249939],'accuracy': [0.6913090944290161,0.7830908894538879,0.8013636469841003,0.8078363537788391,0.810981810092926,0.8124363422393799,0.812145471572876,0.8098727464675903,0.8069090843200684,0.8073999881744385],'val_loss': [0.7285007834434509,0.5901457071304321,0.564271867275238,0.5471994876861572,0.5351706743240356,0.5608181357383728,0.5383569002151489,0.5467274188995361,0.5528538227081299,0.5285636782646179],'val_accuracy': [0.7685999870300293,0.8062000274658203,0.8136000037193298,0.8145999908447266,0.8212000131607056,0.8158000111579895,0.819599986076355,0.8032000064849854,0.8198000192642212,0.821399986743927]}

我們把訓練過程中的loss及accuracy打印出來:

def print_learning_curves(history):pd.DataFrame(history.history).plot(figsize=(10,5))plt.grid(True)plt.gca().set_ylim(0,1)plt.show()print_learning_curves(history)

1.4 evaluate模型

model.evaluate(x_test,y_test) 313/313 [==============================] - 1s 2ms/step - loss: 0.5633 - accuracy: 0.7997[0.5633445382118225, 0.7997000217437744]

1.5 使用模型預(yù)測

我們使用上述訓練得到的模型進行預(yù)測:

x_new = x_test[:3] y_proba = model.predict(X_new) print(y_proba) [[6.3497009e-04 2.9951176e-03 3.5227172e-03 1.4390906e-03 7.3460588e-041.5983881e-01 6.2727387e-04 1.8396391e-01 1.0167611e-02 6.3607597e-01][1.4601831e-02 2.4284667e-03 5.7923472e-01 7.1747215e-03 1.8146098e-012.0480098e-03 2.0280096e-01 3.3682014e-04 9.4090607e-03 5.0444162e-04][5.4534234e-04 9.9256706e-01 1.0021541e-03 3.8844990e-03 1.1454911e-031.0074565e-04 2.7266973e-05 5.8435014e-04 4.7284644e-05 9.5837881e-05]]

對于每個實例,模型估計從0類到9類每個類的概率。例如,對于第一個圖像,模型估計是第9類(腳踝靴)的概率為96%,第5類的概率(涼鞋)為3%,第7類(運動鞋)的概率為1%,其他類別的概率可忽略不計。換句話說,它“相信”第一個圖像是鞋類,最有可能是腳踝靴,但也可能是涼鞋或運動鞋。如果你只關(guān)心估計概率最高的類(即使該概率非常低),則可以使用predict_classes()方法:

y_pred = model.predict_classes(x_new) print(y_pred) [9 2 1]/Users/ljhn1829/opt/anaconda3/envs/tf/lib/python3.8/site-packages/tensorflow/python/keras/engine/sequential.py:450: UserWarning: `model.predict_classes()` is deprecated and will be removed after 2021-01-01. Please use instead:* `np.argmax(model.predict(x), axis=-1)`, if your model does multi-class classification (e.g. if it uses a `softmax` last-layer activation).* `(model.predict(x) > 0.5).astype("int32")`, if your model does binary classification (e.g. if it uses a `sigmoid` last-layer activation).warnings.warn('`model.predict_classes()` is deprecated and '

1.5 完整代碼

import numpy as tf import matplotlib.pyplot as plt import pandas as pd import tensorflow as tf from tensorflow import kerasfashion_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_train.shape,y_train.shape) print(x_valid.shape,y_valid.shape) print(x_test.shape,y_test.shape)def show_single_image(img_arr):plt.imshow(img_arr, cmap='binary')plt.show()show_single_image(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)model = keras.models.Sequential() model.add(keras.layers.Flatten(input_shape=[28,28])) #將輸入的二維數(shù)組展開成一維向量 model.add(keras.layers.Dense(300,activation='sigmoid')) model.add(keras.layers.Dense(100,activation='sigmoid')) model.add(keras.layers.Dense(10,activation='softmax'))model.compile(loss='sparse_categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])model.layers model.summary()history = model.fit(x_train,y_train,epochs=10,validation_data=(x_valid,y_valid))type(history) history.historydef print_learning_curves(history):pd.DataFrame(history.history).plot(figsize=(10,5))plt.grid(True)plt.gca().set_ylim(0,1)plt.show()print_learning_curves(history)model.evaluate(x_test,y_test)

2、歸一化

print(np.max(x_train), np.min(x_train))

現(xiàn)有數(shù)據(jù)在0~255之間,下面我們對數(shù)據(jù)做歸一化。

我們使用均值是0,方差為1的標準正則歸一化(也叫Z-score歸一化),即: x = (x-u)/std

還有一種常見的歸一化方式:Min-max歸一化:x*=(x-min)/(max-min),取值在[0,1]之間。

#scaler = sklearn.preprocessing.StandardScaler()from sklearn.preprocessing import StandardScaler scaler = StandardScaler()x_train_scaler = scaler.fit_transform(x_train.astype(np.float32).reshape(-1,1)).reshape(-1,28,28) x_valid_scaler = scaler.transform(x_valid.astype(np.float32).reshape(-1,1)).reshape(-1,28,28) x_test_scaler = scaler.transform(x_test.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)

上述代碼的幾個說明:

(1)fit_transform/transform接受的是一個二維浮點數(shù)向量作為參數(shù),所以需要先轉(zhuǎn)成2維向量再轉(zhuǎn)回三維。

(2)fit_transform()和transform():fit_transform()除了transform的歸一化功能外,還把數(shù)據(jù)集的均值和方差記錄下來,供下面的驗證集、測試集使用。

然后我們再訓練時使用上面經(jīng)過歸一化的數(shù)據(jù):

history = model.fit(x_train_scaler,y_train,epochs=10,validation_data=(x_valid_scaler,y_valid)) model.evaluate(x_test_scaler,y_test)

3、回調(diào)函數(shù):TensorBoard EarlyStopping ModelCheckpoint

Callbacks: utilities called at certain points during model training.

也就是說模型訓練過程中在某些點會觸發(fā)一些功能或者操作。

最常用的就是TensorBoard EarlyStopping ModelCheckpoint這3類,以下會分別介紹。完整的callback請參考官方文檔的
tf.keras.callback:https://www.tensorflow.org/api_docs/python/tf/keras/callbacks?hl=zh-cn

logdir = './callbacks' if not os.path.exists(logdir):os.mkdir(logdir) output_model_file = os.path.join(logdir,"fashion_mnist_model.h5")callbacks = [keras.callbacks.TensorBoard(logdir),keras.callbacks.ModelCheckpoint(output_model_file, save_best_only = True),keras.callbacks.EarlyStopping(patience=5,min_delta=1e-3) ]history = model.fit(x_train_scaler, y_train, epochs=10, validation_data=(x_valid_scaler,y_valid),callbacks = callbacks)

啟動tensorborad的方式很簡單:

tensorboard --logdir=callbacks

然后打開http://localhost:6006/ 即可。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-srZtihZ9-1626484612800)(attachment:%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202020-03-20%20%E4%B8%8B%E5%8D%883.30.39.png)]

4、深度神經(jīng)網(wǎng)絡(luò)

DNN也沒什么特別,就是層數(shù)比較多:

model = keras.models.Sequential() model.add(keras.layers.Flatten(input_shape=[28,28])) for _ in range(20):model.add(keras.layers.Dense(10,activation='relu')) model.add(keras.layers.Dense(10,activation='softmax'))

DNN在前幾個ecpochs的訓練時,loss降低的很慢,導(dǎo)致這個問題的原因主要有:

(1)參數(shù)眾多、訓練不足

(2)梯度消失 多層符合函數(shù)的鏈式法則導(dǎo)致的。

5、批歸一化、dropout、激活函數(shù)

5.1 批歸一化

歸一化是對訓練、測試數(shù)據(jù)做了歸一化,就是模型的輸入數(shù)據(jù)做了歸一化。

而批歸一化是對每一層激活函數(shù)的輸出(也就是下一層的輸入)都做了歸一化。

model = keras.models.Sequential() model.add(keras.layers.Flatten(input_shape=[28,28])) for _ in range(20):model.add(keras.layers.Dense(10,activation='relu'))model.add(keras.layers.BatchNormalization()) model.add(keras.layers.Dense(10,activation='softmax'))

5.2 selu

上述relu+批歸一化也可以通過直接使用selu激活函數(shù)代替:

model = keras.models.Sequential() model.add(keras.layers.Flatten(input_shape=[28,28])) for _ in range(20):model.add(keras.layers.Dense(10,activation='selu')) model.add(keras.layers.Dense(10,activation='softmax'))

5.3 dropout

model = keras.models.Sequential() model.add(keras.layers.Flatten(input_shape=[28,28])) for _ in range(20):model.add(keras.layers.Dense(10,activation='selu')) model.add(keras.layers.AlphaDropout(rate=0.5))# 只在最后一層添加了dropout # AlphaDropout: 1. 均值和方差不變 2. 歸一化性質(zhì)也不變 # model.add(keras.layers.Dropout(rate=0.5)) model.add(keras.layers.Dense(10,activation='softmax'))

6、完整代碼

import numpy as np import matplotlib.pyplot as plt import pandas as pd import tensorflow as tf from tensorflow import keras import sklearn import os#導(dǎo)入數(shù)據(jù) 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:]#訓練數(shù)據(jù)歸一化 from sklearn.preprocessing import StandardScaler scaler = StandardScaler() x_train_scaler = scaler.fit_transform(x_train.astype(np.float32).reshape(-1,1)).reshape(-1,28,28) x_valid_scaler = scaler.transform(x_valid.astype(np.float32).reshape(-1,1)).reshape(-1,28,28) x_test_scaler = scaler.transform(x_test.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)#構(gòu)建及compile模型 model = keras.models.Sequential() model.add(keras.layers.Flatten(input_shape=[28,28])) for _ in range(20):model.add(keras.layers.Dense(100,activation='selu')) model.add(keras.layers.AlphaDropout(rate=0.5)) model.add(keras.layers.Dense(10,activation='softmax'))model.compile(loss='sparse_categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])#定義callback logdir = './callbacks' if not os.path.exists(logdir):os.mkdir(logdir) output_model_file = os.path.join(logdir,"fashion_mnist_model.h5")callbacks = [keras.callbacks.TensorBoard(logdir),keras.callbacks.ModelCheckpoint(output_model_file, save_best_only = True),keras.callbacks.EarlyStopping(patience=5,min_delta=1e-3) ]#訓練模型 history = model.fit(x_train_scaler, y_train, epochs=10, validation_data=(x_valid_scaler,y_valid),callbacks = callbacks)#檢查模型效果 def print_learning_curves(history):pd.DataFrame(history.history).plot(figsize=(10,5))plt.grid(True)plt.gca().set_ylim(0,1)plt.show()print_learning_curves(history)model.evaluate(x_test_scaler,y_test)

總結(jié)

以上是生活随笔為你收集整理的tensorflow综合示例1:tensorflow-keras的基本使用方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。