ดูการสาธิต #MadeWithTFJS ใหม่ที่แสดงต่อไปของเราและบอกสดในวันที่ 1 ต.ค. 09:00 PT ดูบน YouTube

TensorFlow.js เลเยอร์ API สำหรับผู้ใช้ Keras

Layers API ของ TensorFlow.js ได้รับการสร้างแบบจำลองตาม Keras และเราพยายามทำให้ Layers API มีความ คล้ายคลึงกับ Keras ตามความสมเหตุสมผลเนื่องจากความแตกต่างระหว่าง JavaScript และ Python สิ่งนี้ช่วยให้ผู้ใช้ที่มีประสบการณ์ในการพัฒนาโมเดล Keras ใน Python สามารถย้ายไปยัง TensorFlow.js Layers ใน JavaScript ได้ง่ายขึ้น ตัวอย่างเช่นโค้ด Keras ต่อไปนี้แปลเป็น JavaScript:

# Python:
import keras
import numpy as np

# Build and compile model.
model = keras.Sequential()
model.add(keras.layers.Dense(units=1, input_shape=[1]))
model.compile(optimizer='sgd', loss='mean_squared_error')

# Generate some synthetic data for training.
xs = np.array([[1], [2], [3], [4]])
ys = np.array([[1], [3], [5], [7]])

# Train model with fit().
model.fit(xs, ys, epochs=1000)

# Run inference with predict().
print(model.predict(np.array([[5]])))
// JavaScript:
import * as tf from '@tensorlowjs/tfjs';

// Build and compile model.
const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [1]}));
model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});

// Generate some synthetic data for training.
const xs = tf.tensor2d([[1], [2], [3], [4]], [4, 1]);
const ys = tf.tensor2d([[1], [3], [5], [7]], [4, 1]);

// Train model with fit().
await model.fit(xs, ys, {epochs: 1000});

// Run inference with predict().
model.predict(tf.tensor2d([[5]], [1, 1])).print();

อย่างไรก็ตามมีความแตกต่างบางประการที่เราต้องการแจ้งและอธิบายไว้ในเอกสารนี้ เมื่อคุณเข้าใจความแตกต่างเหล่านี้และเหตุผลเบื้องหลังแล้วการย้าย Python-to-JavaScript ของคุณ (หรือการย้ายข้อมูลในทิศทางย้อนกลับ) น่าจะเป็นประสบการณ์ที่ค่อนข้างราบรื่น

ตัวสร้างใช้ JavaScript Objects เป็นคอนฟิกูเรชัน

เปรียบเทียบบรรทัด Python และ JavaScript ต่อไปนี้จากตัวอย่างด้านบน: ทั้ง คู่สร้าง เลเยอร์ Dense

# Python:
keras.layers.Dense(units=1, inputShape=[1])
// JavaScript:
tf.layers.dense({units: 1, inputShape: [1]});

ฟังก์ชัน JavaScript ไม่มีอาร์กิวเมนต์คำหลักที่เทียบเท่าในฟังก์ชัน Python เราต้องการหลีกเลี่ยงการนำอ็อพชันคอนสตรัคเตอร์ไปใช้เป็นอาร์กิวเมนต์ตำแหน่งใน JavaScript ซึ่งจะเป็นเรื่องยุ่งยากในการจำและใช้สำหรับคอนสตรัคเตอร์ที่มีอาร์กิวเมนต์คำหลักจำนวนมาก (เช่น LSTM ) นี่คือเหตุผลที่เราใช้ออบเจ็กต์การกำหนดค่า JavaScript ออบเจ็กต์ดังกล่าวให้ระดับความสม่ำเสมอและความยืดหยุ่นของตำแหน่งเช่นเดียวกับอาร์กิวเมนต์คีย์เวิร์ด Python

เมธอดบางอย่างของคลาส Model เช่น Model.compile() ยังใช้อ็อบเจ็กต์คอนฟิกูเรชัน JavaScript เป็นอินพุต อย่างไรก็ตามโปรดทราบว่า Model.fit() , Model.evaluate() และ Model.predict() นั้นแตกต่างกันเล็กน้อย เนื่องจากวิธีการเหล่านี้ใช้ข้อมูล x (คุณสมบัติ) และ y (เลเบลหรือเป้าหมาย) เป็นอินพุต x และ y เป็นอาร์กิวเมนต์ตำแหน่งที่แยกจากอ็อบเจ็กต์คอนฟิกูเรชันที่ตามมาซึ่งมีบทบาทของอาร์กิวเมนต์คีย์เวิร์ด ตัวอย่างเช่น:

// JavaScript:
await model.fit(xs, ys, {epochs: 1000});

Model.fit () คือ async

Model.fit() เป็นวิธีการหลักที่ผู้ใช้ทำการฝึกโมเดลใน TensorFlow.js วิธีนี้มักใช้เวลานานเป็นวินาทีหรือนาที ดังนั้นเราจึงใช้คุณลักษณะ async ของภาษา JavaScript เพื่อให้สามารถใช้ฟังก์ชันนี้ในลักษณะที่ไม่ปิดกั้นเธรด UI หลักเมื่อทำงานในเบราว์เซอร์ ซึ่งคล้ายกับฟังก์ชันอื่น ๆ ที่อาจใช้งานได้ยาวนานใน JavaScript เช่นการ ดึงข้อมูลแบบ async โปรดทราบว่า async เป็นโครงสร้างที่ไม่มีใน Python ในขณะที่เมธอด fit() ใน Keras ส่งคืนอ็อบเจ็กต์ History คู่ของเมธอด fit() ใน JavaScript จะส่งกลับ Promise of History ซึ่งสามารถ รอ ed (ดังตัวอย่างด้านบน) หรือใช้กับเมธอด then ()

ไม่มี NumPy สำหรับ TensorFlow.js

ผู้ใช้ Python Keras มักใช้ NumPy เพื่อดำเนินการตัวเลขและอาร์เรย์พื้นฐานเช่นการสร้างเทนเซอร์ 2 มิติในตัวอย่างด้านบน

# Python:
xs = np.array([[1], [2], [3], [4]])

ใน TensorFlow.js การดำเนินการกับตัวเลขพื้นฐานประเภทนี้ทำได้ด้วยตัวแพ็คเกจเอง ตัวอย่างเช่น:

// JavaScript:
const xs = tf.tensor2d([[1], [2], [3], [4]], [4, 1]);

เนมสเปซ tf.* ยังมีฟังก์ชันอื่น ๆ อีกมากมายสำหรับการดำเนินการอาร์เรย์และพีชคณิตเชิงเส้นเช่นการคูณเมทริกซ์ ดู เอกสาร TensorFlow.js Core สำหรับข้อมูลเพิ่มเติม

ใช้วิธีการของโรงงานไม่ใช่ผู้ก่อสร้าง

บรรทัดนี้ใน Python (จากตัวอย่างด้านบน) คือการเรียกตัวสร้าง:

# Python:
model = keras.Sequential()

หากแปลอย่างเคร่งครัดเป็น JavaScript การเรียกตัวสร้างที่เทียบเท่าจะมีลักษณะดังนี้:

// JavaScript:
const model = new tf.Sequential();  // !!! DON'T DO THIS !!!

อย่างไรก็ตามเราตัดสินใจที่จะไม่ใช้ตัวสร้าง "ใหม่" เนื่องจาก 1) คีย์เวิร์ด "ใหม่" จะทำให้โค้ดมีขนาดใหญ่ขึ้นและ 2) ตัวสร้าง "ใหม่" ถือเป็น "ส่วนที่ไม่ดี" ของ JavaScript: เป็นข้อผิดพลาดที่อาจเกิดขึ้นเนื่องจาก เป็นที่ถกเถียงกันใน JavaScript: ส่วนที่ดี ในการสร้างแบบจำลองและเลเยอร์ใน TensorFlow.js คุณต้องเรียกใช้วิธีการโรงงานซึ่งมีชื่อที่ต่ำกว่า CamelCase ตัวอย่างเช่น:

// JavaScript:
const model = tf.sequential();

const layer = tf.layers.batchNormalization({axis: 1});

ค่าสตริงตัวเลือกคือ lowerCamelCase ไม่ใช่ snake_case

ใน JavaScript มักใช้กรณีอูฐเป็นชื่อสัญลักษณ์ (เช่นดู Google JavaScript Style Guide ) เมื่อเทียบกับ Python โดยที่กรณีงูเป็นเรื่องธรรมดา (เช่นใน Keras) ด้วยเหตุนี้เราจึงตัดสินใจใช้ lowerCamelCase สำหรับค่าสตริงสำหรับตัวเลือกต่างๆดังต่อไปนี้:

  • DataFormat เช่น channelsFirst แทน channels_first
  • Initializer เช่น glorotNormal แทน glorot_normal
  • การสูญเสียและตัวชี้วัดเช่น meanSquaredError แทนที่จะเป็น mean_squared_error categoricalCrossentropy categorical_crossentropy

ตัวอย่างเช่นในตัวอย่างด้านบน:

// JavaScript:
model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});

เกี่ยวกับการทำให้เป็นอนุกรมของโมเดลและการแยกส่วนของโมเดลโปรดมั่นใจได้ กลไกภายในของ TensorFlow.js ช่วยให้มั่นใจได้ว่ากรณีงูในออบเจ็กต์ JSON ได้รับการจัดการอย่างถูกต้องเช่นเมื่อโหลดโมเดลที่กำหนดไว้ล่วงหน้าจาก Python Keras

เรียกใช้วัตถุ Layer ด้วย apply () ไม่ใช่โดยเรียกว่าเป็นฟังก์ชัน

ใน Keras วัตถุ Layer มีการกำหนดเมธอด __call__ ดังนั้นผู้ใช้สามารถเรียกใช้ลอจิกของเลเยอร์โดยเรียกอ็อบเจ็กต์เป็นฟังก์ชันเช่น

# Python:
my_input = keras.Input(shape=[2, 4])
flatten = keras.layers.Flatten()

print(flatten(my_input).shape)

ไวยากรณ์ Python นี้ถูกนำไปใช้เป็นวิธีการใช้ () ใน TensorFlow.js:

// JavaScript:
const myInput = tf.input({shape: [2, 4]});
const flatten = tf.layers.flatten();

console.log(flatten.apply(myInput).shape);

Layer.apply () รองรับการประเมินที่จำเป็น (กระตือรือร้น) สำหรับเทนเซอร์คอนกรีต

ปัจจุบันใน Keras วิธีการ โทร สามารถทำงานบน (Python) วัตถุ tf.Tensor ของ tf.Tensor (สมมติว่าเป็นแบ็กเอนด์ TensorFlow) ซึ่งเป็นสัญลักษณ์และไม่ได้เก็บค่าตัวเลขจริง นี่คือสิ่งที่แสดงในตัวอย่างในส่วนก่อนหน้า อย่างไรก็ตามใน TensorFlow.js เมธอด apply () ของเลเยอร์สามารถทำงานได้ทั้งในโหมดสัญลักษณ์และความจำเป็น หาก apply() ถูกเรียกใช้ด้วย SymbolicTensor (การเปรียบเทียบแบบใกล้เคียงของ tf.Tensor) ค่าที่ส่งคืนจะเป็น SymbolicTensor โดยทั่วไปจะเกิดขึ้นระหว่างการสร้างแบบจำลอง แต่ถ้า apply() ถูกเรียกด้วยค่า Tensor คอนกรีตจริงมันจะส่งคืน Tensor คอนกรีต ตัวอย่างเช่น:

// JavaScript:
const flatten = tf.layers.flatten();

flatten.apply(tf.ones([2, 3, 4])).print();

คุณลักษณะนี้ชวนให้นึกถึง Eager Execution ของ (Python) TensorFlow ช่วยเพิ่มการโต้ตอบและความสามารถในการแก้ไขข้อผิดพลาดในระหว่างการพัฒนาแบบจำลองนอกเหนือจากการเปิดประตูสู่การสร้างเครือข่ายประสาทเทียมแบบไดนามิก

เครื่องมือเพิ่มประสิทธิภาพอยู่ระหว่างการฝึกอบรม ไม่ใช่เครื่องมือเพิ่มประสิทธิภาพ

ใน Keras ตัวสร้างสำหรับอ็อบเจ็กต์ Optimizer อยู่ภายใต้ keras.optimizers.* namespace ใน TensorFlow.js Layers เมธอดของโรงงานสำหรับ Optimizers อยู่ภายใต้ tf.train.* namespace ตัวอย่างเช่น:

# Python:
my_sgd = keras.optimizers.sgd(lr=0.2)
// JavaScript:
const mySGD = tf.train.sgd({lr: 0.2});

loadLayersModel () โหลดจาก URL ไม่ใช่ไฟล์ HDF5

ใน Keras โดยทั่วไปโมเดลจะ ถูกบันทึก เป็นไฟล์ HDF5 (.h5) ซึ่งสามารถโหลดได้ในภายหลังโดยใช้ keras.models.load_model() เมธอดใช้พา ธ ไปยังไฟล์. h5 คู่ของ load_model() ใน TensorFlow.js คือ tf.loadLayersModel() เนื่องจาก HDF5 ไม่ใช่รูปแบบไฟล์ที่เหมาะกับเบราว์เซอร์ tf.loadLayersModel() ใช้รูปแบบเฉพาะ TensorFlow.js tf.loadLayersModel() รับไฟล์ model.json เป็นอาร์กิวเมนต์อินพุต model.json สามารถแปลงจากไฟล์ Keras HDF5 โดยใช้แพ็คเกจ pip tensorflowjs

// JavaScript:
const model = await tf.loadLayersModel('https://foo.bar/model.json');

โปรดทราบว่า tf.loadLayersModel() ส่งคืน Promise of tf.Model

โดยทั่วไปการบันทึกและโหลด tf.Model s ใน TensorFlow.js ทำได้โดยใช้ tf.Model.save และ tf.loadLayersModel ตามลำดับ เราออกแบบ API เหล่านี้ให้คล้ายกับ save และ load_model API ของ Keras แต่สภาพแวดล้อมของเบราว์เซอร์ค่อนข้างแตกต่างจากสภาพแวดล้อมแบ็กเอนด์ที่เฟรมเวิร์กการเรียนรู้เชิงลึกหลักเช่น Keras ทำงานโดยเฉพาะอย่างยิ่งในอาร์เรย์ของเส้นทางสำหรับการคงอยู่และการส่งข้อมูล ดังนั้นจึงมีความแตกต่างที่น่าสนใจระหว่าง API บันทึก / โหลดใน TensorFlow.js และใน Keras ดูบทแนะนำของเราเกี่ยวกับการ บันทึกและการโหลด tf รุ่น สำหรับรายละเอียดเพิ่มเติม

ใช้ fitDataset() เพื่อฝึกโมเดลโดยใช้วัตถุtf.data.Dataset

ใน tf.keras ของ Python TensorFlow สามารถฝึกโมเดลได้โดยใช้ Dataset object เมธอด fit() ของโมเดลยอมรับวัตถุดังกล่าวโดยตรง โมเดล TensorFlow.js สามารถฝึกด้วย JavaScript ที่เทียบเท่ากับวัตถุ Dataset ได้เช่นกัน (ดู เอกสารของ tf.data API ใน TensorFlow.js ) อย่างไรก็ตามการฝึกอบรมที่ใช้ Dataset นั้นแตกต่างจาก Python โดยใช้วิธีการเฉพาะคือ fitDataset วิธี fit () ใช้สำหรับการฝึกโมเดลที่ใช้เทนเซอร์เท่านั้น

การจัดการหน่วยความจำของวัตถุ Layer และ Model

TensorFlow.js ทำงานบน WebGL ในเบราว์เซอร์โดยที่น้ำหนักของวัตถุ Layer และ Model ได้รับการสนับสนุนโดยพื้นผิว WebGL อย่างไรก็ตาม WebGL ไม่มีการสนับสนุนการรวบรวมขยะในตัว เลเยอร์และโมเดลอ็อบเจ็กต์จัดการหน่วยความจำเทนเซอร์ภายในสำหรับผู้ใช้ในระหว่างการอนุมานและการเรียกการฝึกอบรม แต่ยังอนุญาตให้ผู้ใช้กำจัดเพื่อเพิ่มหน่วยความจำ WebGL ที่พวกเขาครอบครองอยู่ สิ่งนี้มีประโยชน์ในกรณีที่สร้างและปล่อยอินสแตนซ์แบบจำลองจำนวนมากภายในการโหลดหน้าเดียว ในการกำจัดวัตถุ Layer หรือ Model ให้ใช้เมธอด dispose()