TensorFlow2.0-Keras入門

2021-02-25 DoitNLP

大家好,我是Doit。

之前發了一篇《ULMFiT-用於文本分類的通用語言模型微調》後,由於忙其他的事情,公眾號寫作就暫時擱置了,今天登錄公眾號後臺發現有了26個關注者,那一瞬間簡直是滿滿的感動。最近在知乎上寫一些學習tensorflow2.0的筆記心得,整理成中文教程,希望幫助想學習tensorflow2的朋友更好的了解tensorflow2的同時,也是倒逼自己更好的學習。我始終相信:最好的學習是輸出知識,最好的成長是共同成長。希望可以通過這個公眾號和廣大的深度學習愛好者,一起學習成長。

最後十分感謝關注我的朋友們,之前那篇文章由於公式排版問題,導致不能很好的閱讀,我後面會重新整理好發出來。

本教程首發於本人知乎帳號Doit的tensorflow2.0教程專欄,後面我將會對原有的tensorflow2.0教程進行完善和整理,並發於本公眾號中,感興趣的朋友請關注本公眾號。

完整tensorflow2.0教程代碼請看https://github.com/czy36mengfei/tensorflow2_tutorials_chinese (歡迎star)

本教程主要由tensorflow2.0官方教程的個人學習復現筆記整理而來,中文講解,方便喜歡閱讀中文教程的朋友,官方教程:tensorflow.org

Keras 是一個用於構建和訓練深度學習模型的高階 API。它可用於快速設計原型、高級研究和生產。

keras的3個優點: 方便用戶使用、模塊化和可組合、易於擴展

1.導入tf.keras

tensorflow2推薦使用keras構建網絡,常見的神經網絡都包含在keras.layer中(最新的tf.keras的版本可能和keras不同)

import tensorflow as tf
from tensorflow.keras import layers
print(tf.__version__)
print(tf.keras.__version__)

2.構建簡單模型2.1模型堆疊

最常見的模型類型是層的堆疊:tf.keras.Sequential 模型

model = tf.keras.Sequential()
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

2.2網絡配置

tf.keras.layers中網絡配置:

activation:設置層的激活函數。此參數由內置函數的名稱指定,或指定為可調用對象。默認情況下,系統不會應用任何激活函數。

kernel_initializer 和 bias_initializer:創建層權重(核和偏差)的初始化方案。此參數是一個名稱或可調用對象,默認為 "Glorot uniform" 初始化器。

kernel_regularizer 和 bias_regularizer:應用層權重(核和偏差)的正則化方案,例如 L1 或 L2 正則化。默認情況下,系統不會應用正則化函數。

layers.Dense(32, activation='sigmoid')
layers.Dense(32, activation=tf.sigmoid)
layers.Dense(32, kernel_initializer='orthogonal')
layers.Dense(32, kernel_initializer=tf.keras.initializers.glorot_normal)
layers.Dense(32, kernel_regularizer=tf.keras.regularizers.l2(0.01))
layers.Dense(32, kernel_regularizer=tf.keras.regularizers.l1(0.01))

3.訓練和評估3.1設置訓練流程

構建好模型後,通過調用 compile 方法配置該模型的學習流程:

model = tf.keras.Sequential()
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
loss=tf.keras.losses.categorical_crossentropy,
metrics=[tf.keras.metrics.categorical_accuracy])

3.2輸入Numpy數據

import numpy as np

train_x = np.random.random((1000, 72))
train_y = np.random.random((1000, 10))

val_x = np.random.random((200, 72))
val_y = np.random.random((200, 10))

model.fit(train_x, train_y, epochs=10, batch_size=100,
validation_data=(val_x, val_y))

3.3tf.data輸入數據

dataset = tf.data.Dataset.from_tensor_slices((train_x, train_y))
dataset = dataset.batch(32)
dataset = dataset.repeat()
val_dataset = tf.data.Dataset.from_tensor_slices((val_x, val_y))
val_dataset = val_dataset.batch(32)
val_dataset = val_dataset.repeat()

model.fit(dataset, epochs=10, steps_per_epoch=30,
validation_data=val_dataset, validation_steps=3)

3.4評估與預測

test_x = np.random.random((1000, 72))
test_y = np.random.random((1000, 10))
model.evaluate(test_x, test_y, batch_size=32)
test_data = tf.data.Dataset.from_tensor_slices((test_x, test_y))
test_data = test_data.batch(32).repeat()
model.evaluate(test_data, steps=30)
# predict
result = model.predict(test_x, batch_size=32)
print(result)

4.構建高級模型4.1函數式api

tf.keras.Sequential 模型是層的簡單堆疊,無法表示任意模型。使用 Keras 函數式 API 可以構建複雜的模型拓撲,例如:

多輸入模型,

多輸出模型,

具有共享層的模型(同一層被調用多次),

具有非序列數據流的模型(例如,殘差連接)。

使用函數式 API 構建的模型具有以下特徵:

層實例可調用並返回張量。 輸入張量和輸出張量用於定義 tf.keras.Model 實例。 此模型的訓練方式和 Sequential 模型一樣。

input_x = tf.keras.Input(shape=(72,))
hidden1 = layers.Dense(32, activation='relu')(input_x)
hidden2 = layers.Dense(16, activation='relu')(hidden1)
pred = layers.Dense(10, activation='softmax')(hidden2)

model = tf.keras.Model(inputs=input_x, outputs=pred)
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
loss=tf.keras.losses.categorical_crossentropy,
metrics=['accuracy'])
model.fit(train_x, train_y, batch_size=32, epochs=5)

4.2模型子類化

通過對 tf.keras.Model 進行子類化並定義您自己的前向傳播來構建完全可自定義的模型。在 init 方法中創建層並將它們設置為類實例的屬性。在 call 方法中定義前向傳播

class MyModel(tf.keras.Model):
def __init__(self, num_classes=10):
super(MyModel, self).__init__(name='my_model')
self.num_classes = num_classes
self.layer1 = layers.Dense(32, activation='relu')
self.layer2 = layers.Dense(num_classes, activation='softmax')
def call(self, inputs):
h1 = self.layer1(inputs)
out = self.layer2(h1)
return out

def compute_output_shape(self, input_shape):
shape = tf.TensorShapej(input_shape).as_list()
shape[-1] = self.num_classes
return tf.TensorShape(shape)

model = MyModel(num_classes=10)
model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001),
loss=tf.keras.losses.categorical_crossentropy,
metrics=['accuracy'])

model.fit(train_x, train_y, batch_size=16, epochs=5)

4.3自定義層

通過對 tf.keras.layers.Layer 進行子類化並實現以下方法來創建自定義層:

build:創建層的權重。使用 add_weight 方法添加權重。

call:定義前向傳播。

compute_output_shape:指定在給定輸入形狀的情況下如何計算層的輸出形狀。 或者,可以通過實現 get_config 方法和 from_config 類方法序列化層。

class MyLayer(layers.Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyLayer, self).__init__(**kwargs)

def build(self, input_shape):
shape = tf.TensorShape((input_shape[1], self.output_dim))
self.kernel = self.add_weight(name='kernel1', shape=shape,
initializer='uniform', trainable=True)
super(MyLayer, self).build(input_shape)

def call(self, inputs):
return tf.matmul(inputs, self.kernel)

def compute_output_shape(self, input_shape):
shape = tf.TensorShape(input_shape).as_list()
shape[-1] = self.output_dim
return tf.TensorShape(shape)

def get_config(self):
base_config = super(MyLayer, self).get_config()
base_config['output_dim'] = self.output_dim
return base_config

@classmethod
def from_config(cls, config):
return cls(**config)

model = tf.keras.Sequential(
[
MyLayer(10),
layers.Activation('softmax')
])


model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001),
loss=tf.keras.losses.categorical_crossentropy,
metrics=['accuracy'])

model.fit(train_x, train_y, batch_size=16, epochs=5)

4.3回調

callbacks = [
tf.keras.callbacks.EarlyStopping(patience=2, monitor='val_loss'),
tf.keras.callbacks.TensorBoard(log_dir='./logs')
]
model.fit(train_x, train_y, batch_size=16, epochs=5,
callbacks=callbacks, validation_data=(val_x, val_y))

5保持和恢復5.1權重保存

model = tf.keras.Sequential([
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax')])

model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
loss='categorical_crossentropy',
metrics=['accuracy'])

model.save_weights('./weights/model')
model.load_weights('./weights/model')
model.save_weights('./model.h5')
model.load_weights('./model.h5')

5.2保存網絡結構

# 序列化成json
import json
import pprint
json_str = model.to_json()
pprint.pprint(json.loads(json_str))
fresh_model = tf.keras.models.model_from_json(json_str)
# 保持為yaml格式 #需要提前安裝pyyaml

yaml_str = model.to_yaml()
print(yaml_str)
fresh_model = tf.keras.models.model_from_yaml(yaml_str)

5.3保存整個模型

model = tf.keras.Sequential([
layers.Dense(10, activation='softmax', input_shape=(72,)),
layers.Dense(10, activation='softmax')
])
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_x, train_y, batch_size=32, epochs=5)
model.save('all_model.h5')
model = tf.keras.models.load_model('all_model.h5')

6.將keras用於Estimator

Estimator API 用於針對分布式環境訓練模型。它適用於一些行業使用場景,例如用大型數據集進行分布式訓練並導出模型以用於生產

model = tf.keras.Sequential([layers.Dense(10,activation='softmax'),
layers.Dense(10,activation='softmax')])

model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001),
loss='categorical_crossentropy',
metrics=['accuracy'])

estimator = tf.keras.estimator.model_to_estimator(model)

相關焦點

  • TensorFlow 2入門指南,初學者必備!
    tensorflow as tffrom tensorflow.keras.layers import Densefrom tensorflow.keras.models import Sequential在這裡,我們從tensorflow
  • TensorFlow 2.1指南:keras模式、渴望模式和圖形模式(附代碼)
    如你所知,在Tensorflow中,存在這樣的範例:首先定義計算圖,然後進行編譯(或將其移至GPU),然後運行它。這種範例非常好,從技術上來講很有意義,但是,一旦在GPU中擁有了模型,幾乎就不可能對其進行調試。這就是為什麼,自從TensorFlow 2.0以其Alpha版本發布以來已經過去了大約一年,我決定在TensorFlow 2.1與大家分享使用的體驗。
  • TensorFlow 2.1.0-rc2發布
    pip install tensorflow安裝的TF默認也有gpu支持了(windows、linux),pip install tensorflow-gpu仍舊可以用,如果考慮到包的大小,也可以用只支持CPU的:tensorflow-cpuWindows用戶:為了使用新的/d2ReducedOptimizeHugeFunctions
  • TensorFlow Recommenders 現已開源,讓推薦系統更上一層樓!
    import tensorflow as tfimport tensorflow_datasets as tfdsimport tensorflow_recommenders as tfrs# Ratings data.
  • TensorFlow 2.X,會是它走下神壇的開始嗎?
    你會驚奇地發現,它們的 TensorFlow 導入都是這種風格:import tensorflow.compat.v1 as tfimport tensorflow.compat.v2 as tf其中,「compat」是 TF2.X 專門為兼容 TF 1.X 配置的模塊。
  • TensorFlow 2.4來了:上線對分布式訓練和混合精度的新功能支持
    所有內置 tf.keras.optimizer.Optimizer 子類都可接受 gradient_transformers 和 gradient_aggregator 參數,輕鬆定義自定義梯度變換。import tensorflow.experimental.numpy as tnp# Use NumPy code ininput pipelinesdataset = tf.data.Dataset.from_tensor_slices( tnp.random.randn(1000, 1024)).map(lambda z: z.clip(-1,1
  • 詳解深度強化學習展現TensorFlow 2.0新特性(代碼)
    本文完整代碼資源連結:GitHub:https://github.com/inoryy/tensorflow2-deep-reinforcement-learningGoogle Colab:https://colab.research.google.com/drive/12QvW7VZSzoaF-Org-u-N6aiTdBN5ohNA
  • 令人困惑的TensorFlow!
    代碼:import tensorflow as tftwo_node = tf.constant(2)print two_node輸出:Tensor("Const:0", shape=(), dtype=int32)計算圖:快看!我們得到了一個節點。它包含常量 2。
  • 入門 | 關於TensorFlow,你應該了解的9件事
    v=MR7w8ARAS2Y)然後我想了想,簡直找不出理由不向你們安利我對此演講的超短總結。(除非你不看視頻,不然你絕對應該看看這個演講,演講者 Laurence Moroney 很出色。)#2:一個神奇操作TensorFlow Eager 讓我高枕無憂。如果你之前嘗試過 TensorFlow,但因為它使你像老學究或外星人(而不是開發者)一樣編代碼而瘋掉,現在抓緊回來啊啊啊啊!!
  • GAN 的 keras 實現
    Modelfrom keras.layers import Input, Reshapefrom keras.layers.core import Dense, Activation, Dropout, Flattenfrom keras.layers.normalization import BatchNormalizationfrom keras.layers.convolutional import
  • 實戰|基於TensorFlow+Python的文本分類全程詳解
    本教程將會使用tf.keras(一個高級API),用於在TensorFlow中構建和訓練模型。如果你想了解利用tf.keras進行更高級的文本分類的教程,請參閱MLCC文本分類指南。你可以使用以下python代碼導入Keras:import tensorflow as tffrom tensorflow import kerasimport numpy as npprint(tf.
  • 數據分析之道| TF入門實踐(2):基於 AlexNet 實現貓狗分類
    環境配置import tensorflow as tfimport tensorflow.keras as kerasimport tensorflow_datasets as tfdsimport matplotlib.pyplot as plt在本次實例中,我們採用tensoflow_datasets
  • 如何在PyTorch和TensorFlow中訓練圖像分類模型
    我們還將在2.0版本中實現CNN。我希望你現在對PyTorch和TensorFlow都有基本的了解。現在,讓我們嘗試使用這兩個框架構建深度學習模型並了解其內部工作。在此之前,讓我們首先了解我們將在本文中解決的問題陳述。了解問題陳述:MNIST在開始之前,讓我們了解數據集。在本文中,我們將解決流行的MNIST問題。
  • 用RNN和TensorFlow創作自己的《哈利波特》小說
    import tensorflow as tfimport numpy as npimport osimport time可以從 一個Kaggle數據集找到並下載所有《哈利波特》的文稿(https://www.kaggle.com/alex44jzy/harrypotter)。
  • 令人困惑的 TensorFlow!(II)
    絕大多數情況下,名稱會自動創建;例如,一個常量節點會以 Const 命名,當創建更多常量節點時,其名稱將是 Const_1,Const_2 等。還可以通過 name=的屬性設置節點名稱,列舉後綴仍會自動添加:代碼:import tensorflow as tfa = tf.constant(0.)b = tf.constant(1.)
  • mnist tensorflow 預測專題及常見問題 - CSDN
    binary was not compiled to use: AVX2 FMA2019-06-02 11:17:11.746821: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1392] Found device 0 with properties: name: GeForce GTX TITAN X major: 5 minor: 2
  • TensorFlow2.x GPU版安裝與CUDA版本選擇指南
    目前Python最新release版本為3.9.0,配合TensorFlow2版本使用目前常見的以Python3.6和3.7,大家根據自己的開發平臺選擇合適的版本下載即可Windows平臺下載地址
  • 【TF秘籍】令人困惑的 TensorFlow!(II)
    絕大多數情況下,名稱會自動創建;例如,一個常量節點會以 Const 命名,當創建更多常量節點時,其名稱將是 Const_1,Const_2 等。還可以通過 name=的屬性設置節點名稱,列舉後綴仍會自動添加:代碼:import tensorflow as tfa = tf.constant(0.)b = tf.constant(1.)
  • Keras實例:基於Transformer的推薦系統
    Setupimport osimport mathfrom zipfile import ZipFilefrom urllib.request import urlretrieveimport numpy as npimport pandas as pdimport tensorflow
  • 使用tensorflow進行音樂類型的分類
    # import libraries import pandas as pd import tensorflow as tf from IPython.display import Audio import os import matplotlib.pyplot as plt import numpy as np import math import sys from datetime