Metinleri sınıflandırmak için bir Flutter uygulaması oluşturun

1. Başlamadan önce

Bu codelab'de, REST ve gRPC üzerinden TensorFlow Sunumu ile bir Flutter uygulamasından metin sınıflandırma tahminini nasıl çalıştıracağınızı öğreneceksiniz.

Ön koşullar

Neler öğreneceksiniz?

  • Basit bir Flutter uygulaması oluşturma ve TensorFlow Sunumu (REST ve gRPC) ile metinleri sınıflandırma.
  • Sonuçlar kullanıcı arayüzünde nasıl gösterilir?

Gerekenler

2. Flutter geliştirme ortamınızı kurma

Flutter geliştirmesi için bu laboratuvarı tamamlamak üzere iki parça yazılıma ihtiyacınız vardır: Flutter SDK ve düzenleyici.

Codelab'i aşağıdaki cihazlardan herhangi birini kullanarak çalıştırabilirsiniz:

  • iOS simülasyon aracı (Xcode araçlarının yüklenmesi gerekir).
  • Android Emülatör (Android Studio'da kurulum gerektirir).
  • Tarayıcı (hata ayıklama için Chrome gereklidir).
  • Windows, Linux veya macOS masaüstü uygulaması olarak. Geliştirmeyi planladığınız platformda geliştirme yapmanız gerekir. Dolayısıyla, bir Windows masaüstü uygulaması geliştirmek istiyorsanız uygun derleme zincirine erişmek için Windows'da geliştirme yapmanız gerekir. docs.flutter.dev/desktop adresinde, işletim sistemine özgü koşullar ayrıntılı olarak açıklanmıştır.

3. Hazırlanın

Bu codelab'in kodunu indirmek için:

  1. Bu codelab için GitHub veri havuzuna gidin.
  2. Bu codelab'e ait tüm kodu indirmek için Code > İndir ZIP'i tıklayın.

2cd45599f51fb8a2.png

  1. İhtiyacınız olan tüm kaynakları içeren codelabs-main kök klasörünün paketini açmak için indirilen zip dosyasını açın.

Bu codelab için yalnızca depodaki tfserving-flutter/codelab2 alt dizininde bulunan ve iki klasör içeren dosyalara ihtiyacınız vardır:

  • starter klasörü, bu codelab için geliştirmekte olduğunuz başlangıç kodunu içerir.
  • finished klasörü, tamamlanan örnek uygulama için tamamlanmış kodu içerir.

4. Proje için bağımlılıkları indirin

  1. VS Code'da File > Open folder'ı (Dosya & klasörü aç) tıklayın ve daha önce indirdiğiniz kaynak koddan starter klasörünü seçin.
  2. Başlangıç uygulaması için gerekli paketleri indirmenizi isteyen bir iletişim kutusu görürseniz Paketleri al'ı tıklayın.
  3. Bu iletişim kutusunu görmüyorsanız terminalinizi açın ve ardından starter klasöründe flutter pub get komutunu çalıştırın.

7ada07c300f166a6.png

5. Başlangıç uygulamasını çalıştırma

  1. VS Code'da Android Emülatör veya iOS Simülatörünün doğru şekilde ayarlandığından ve durum çubuğunda göründüğünden emin olun.

Örneğin, Android emülatörle Pixel 5'i kullanırken gördükleriniz:

9767649231898791.png

iPhone 13'ü iOS Simülatörü ile birlikte kullanıldığında şunları görürsünüz:

95529e3a682268b2.png

  1. a19a0c68bc4046e6.png Hata ayıklamayı başlat'ı tıklayın.

Uygulamayı çalıştırma ve keşfetme

Uygulama, Android Emülatör veya iOS Simülasyon Aracı'nda başlatılmalıdır. Kullanıcı arayüzü son derece basittir. Kullanıcının metni yazmasına olanak tanıyan bir metin alanı vardır. Kullanıcı, verilerin arka uça REST veya gRPC ile gönderilip gönderilmeyeceğini seçebilir. Arka uç, önceden işlenmiş girişte metin sınıflandırma gerçekleştirmek için bir TensorFlow modeli kullanır ve sınıflandırma sonucunu istemci uygulamasına döndürür. Bu da kullanıcı arayüzünü günceller.

b298f605d64dc132.png d3ef3ccd3c338108.png

Sınıflandır'ı tıklarsanız arka uçla henüz iletişim kuramadığı için hiçbir şey olmaz.

6. TensorFlow Delivery ile metin sınıflandırma modeli dağıtma

Metin sınıflandırma, metinleri önceden tanımlanmış kategoriler halinde sınıflandıran çok yaygın bir makine öğrenimi görevidir. Bu codelab'de, TensorFlow Sunumu ile TensorFlow Lite Model Maker codelab ile yorum spam'i algılama modeli eğitme bölümünden önceden eğitilmiş modeli dağıtırsınız ve giriş metnini spam ya da spam değil olarak sınıflandırmak için Flutter ön ucunuzdaki arka ucu çağırırsınız.

TensorFlow Sunumunu Başlat

  • Terminalinizde Docker ile TensorFlow Sunumu'nu başlatın ancak PATH/TO/SAVEDMODEL yer tutucusunu bilgisayarınızdaki mm_spam_savedmodel klasörünün mutlak yoluyla değiştirin.
docker pull tensorflow/serving

docker run -it --rm -p 8500:8500 -p 8501:8501 -v "PATH/TO/SAVEDMODEL:/models/spam-detection" -e MODEL_NAME=spam-detection tensorflow/serving

Docker, önce bir dakika sürecek TensorFlow Sunumu resmini otomatik olarak indirir. Ardından, TensorFlow Sunumu başlatılmalıdır. Günlük, şu kod snippet'i gibi olmalıdır:

2022-02-25 06:01:12.513231: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:206] Restoring SavedModel bundle.
2022-02-25 06:01:12.585012: I external/org_tensorflow/tensorflow/core/platform/profile_utils/cpu_utils.cc:114] CPU Frequency: 3000000000 Hz
2022-02-25 06:01:13.395083: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:190] Running initialization op on SavedModel bundle at path: /models/ssd_mobilenet_v2_2/123
2022-02-25 06:01:13.837562: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:277] SavedModel load for tags { serve }; Status: success: OK. Took 1928700 microseconds.
2022-02-25 06:01:13.877848: I tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc:59] No warmup data file found at /models/ssd_mobilenet_v2_2/123/assets.extra/tf_serving_warmup_requests
2022-02-25 06:01:13.929844: I tensorflow_serving/core/loader_harness.cc:87] Successfully loaded servable version {name: spam-detection version: 123}
2022-02-25 06:01:13.985848: I tensorflow_serving/model_servers/server_core.cc:486] Finished adding/updating models
2022-02-25 06:01:13.985987: I tensorflow_serving/model_servers/server.cc:367] Profiler service is enabled
2022-02-25 06:01:13.988994: I tensorflow_serving/model_servers/server.cc:393] Running gRPC ModelServer at 0.0.0.0:8500 ...
[warn] getaddrinfo: address family for nodename not supported
2022-02-25 06:01:14.033872: I tensorflow_serving/model_servers/server.cc:414] Exporting HTTP/REST API at:localhost:8501 ...
[evhttp_server.cc : 245] NET_LOG: Entering the event loop ...

7. Giriş cümlesini şifrele

Arka uç hazır. Dolayısıyla, istemci isteklerini TensorFlow Sunumu'na göndermek için neredeyse hazırsınız, ancak öncelikle giriş cümlesini jetona ayırmanız gerekir. Modelin giriş tensörünü incelerseniz, modelin ham dizeler yerine 20 tam sayı listesini beklediğini görebilirsiniz. Jetonlama, uygulamada yazdığınız her bir kelimeyi sınıflandırma için arka uça göndermeden önce bir sözlük sözlüğüne dayalı tam sayılarla eşleştirmenizdir. Örneğin, buy book online to learn more yazarsanız jetona ayırma işlemi bunu [32, 79, 183, 10, 224, 631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ile eşler. Belirli sayılar sözlük sözlüğüne göre değişiklik gösterebilir.

  1. lib/main.dart dosyasında, _vocabMap sözlüğünü oluşturmak için bu kodu predict() yöntemine ekleyin.
// Build _vocabMap if empty.
if (_vocabMap.isEmpty) {
  final vocabFileString = await rootBundle.loadString(vocabFile);
  final lines = vocabFileString.split('\n');
  for (final l in lines) {
    if (l != "") {
      var wordAndIndex = l.split(' ');
      (_vocabMap)[wordAndIndex[0]] = int.parse(wordAndIndex[1]);
    }
  }
} 
  1. Önceki kod snippet'inden hemen sonra, jetona dönüştürme işlemini uygulamak için bu kodu ekleyin:
// Tokenize the input sentence.
final inputWords = _inputSentenceController.text
    .toLowerCase()
    .replaceAll(RegExp('[^a-z ]'), '')
    .split(' ');
// Initialize with padding token.
_tokenIndices = List.filled(maxSentenceLength, 0);
var i = 0;
for (final w in inputWords) {
  if ((_vocabMap).containsKey(w)) {
    _tokenIndices[i] = (_vocabMap)[w]!;
    i++;
  }

  // Truncate the string if longer than maxSentenceLength.
  if (i >= maxSentenceLength - 1) {
    break;
  }
}

Bu kod, cümle dizesini küçük harfle yazar, alfabe dışı karakterleri kaldırır ve sözlük tablosuna göre kelimeleri 20 tam sayı diziniyle eşler.

8. Flutter uygulamasını REST üzerinden TensorFlow Sunumu'na bağlama

TensorFlow Sunumu'na istek göndermenin iki yolu vardır:

  • REST
  • gRPC

İstek ve REST aracılığıyla yanıt alma

REST üzerinden istek göndermek ve yanıt almak için üç basit adım vardır:

  1. REST isteğini oluşturun.
  2. REST isteğini TensorFlow Sunumu'na gönderin.
  3. REST yanıtından tahmin edilen sonucu çıkarıp kullanıcı arayüzünü oluşturun.

Bu adımları main.dart dosyasında tamamlarsınız.

REST isteğini oluşturup TensorFlow Sunumu'na gönderin

  1. Şu anda predict() işlevi, REST isteğini TensorFlow Sunumu'na göndermez. Bir REST isteği oluşturmak için REST şubesini uygulamanız gerekir:
if (_connectionMode == ConnectionModeType.rest) {
  // TODO: Create and send the REST request.

}
  1. Bu kodu REST şubesine ekleyin:
//Create the REST request.
final response = await http.post(
  Uri.parse('http://' +
      _server +
      ':' +
      restPort.toString() +
      '/v1/models/' +
      modelName +
      ':predict'),
  body: jsonEncode(<String, List<List<int>>>{
    'instances': [_tokenIndices],
  }),
);

TensorFlow Delivery'den REST yanıtını işleme

  • REST yanıtını işlemek için şu kodu önceki kod snippet'inden hemen sonra ekleyin:
// Process the REST response.
if (response.statusCode == 200) {
  Map<String, dynamic> result = jsonDecode(response.body);
  if (result['predictions']![0][1] >= classificationThreshold) {
    return 'This sentence is spam. Spam score is ' +
        result['predictions']![0][1].toString();
  }
  return 'This sentence is not spam. Spam score is ' +
      result['predictions']![0][1].toString();
} else {
  throw Exception('Error response');
}

İşlem sonrası kodu, giriş cümlesinin yanıttan gelen spam bir ileti olma olasılığını çıkarır ve sınıflandırma sonucunu kullanıcı arayüzünde gösterir.

Çalıştır

  1. a19a0c68bc4046e6.png Hata ayıklamayı başlat'ı tıklayın ve ardından uygulamanın yüklenmesini bekleyin.
  2. Bir metin girin ve REST > Sınıflandırma'yı seçin.

8e21d795af36d07a.png e79a0367a03c2169.png

9. gRPC aracılığıyla Flutter uygulamasını TensorFlow Sunumu'na bağlama

TensorFlow Sunumu, REST'e ek olarak gRPC'yi de destekler.

b6f4449c2c850b0e.png

gRPC, tüm ortamlarda çalışabilen modern, açık kaynaklı, yüksek performanslı bir Uzaktan Prosedür Çağrısı (RPC) çerçevesidir. Yük dengeleme, izleme, sağlık kontrolü ve kimlik doğrulama konularında takılabilir destek sayesinde veri merkezlerinde ve veri merkezlerinde hizmetleri etkili şekilde bağlayabilir. gRPC'nin uygulamada REST'ten daha iyi performans gösterdiği gözlemlenmiştir.

gRPC ile istek gönderme ve yanıtlar alma

gRPC ile istek gönderme ve yanıtlar alma için dört basit adım vardır:

  1. İsteğe bağlı: gRPC istemci stub kodunu oluşturun.
  2. gRPC isteğini oluşturun.
  3. gRPC isteğini TensorFlow Sunumu'na gönderin.
  4. gRPC yanıtından öngörülen sonucu ayıklayın ve kullanıcı arayüzünü oluşturun.

Bu adımları main.dart dosyasında tamamlarsınız.

İsteğe bağlı: gRPC istemci stub kodunu oluşturun

gRPC'yi TensorFlow Sunumu ile kullanmak için gRPC iş akışını uygulamanız gerekir. Ayrıntılar hakkında bilgi edinmek için gRPC dokümanlarına bakın.

a9d0e5cb543467b4.png

TensorFlow Sunumu ve TensorFlow, .proto dosyalarını sizin için tanımlar. TensorFlow ve TensorFlow Sunumu 2.8 itibarıyla şu dosyalar gerekli .proto:

tensorflow/core/example/example.proto
tensorflow/core/example/feature.proto
tensorflow/core/protobuf/struct.proto
tensorflow/core/protobuf/saved_object_graph.proto
tensorflow/core/protobuf/saver.proto
tensorflow/core/protobuf/trackable_object_graph.proto
tensorflow/core/protobuf/meta_graph.proto
tensorflow/core/framework/node_def.proto
tensorflow/core/framework/attr_value.proto
tensorflow/core/framework/function.proto
tensorflow/core/framework/types.proto
tensorflow/core/framework/tensor_shape.proto
tensorflow/core/framework/full_type.proto
tensorflow/core/framework/versions.proto
tensorflow/core/framework/op_def.proto
tensorflow/core/framework/graph.proto
tensorflow/core/framework/tensor.proto
tensorflow/core/framework/resource_handle.proto
tensorflow/core/framework/variable.proto

tensorflow_serving/apis/inference.proto
tensorflow_serving/apis/classification.proto
tensorflow_serving/apis/predict.proto
tensorflow_serving/apis/regression.proto
tensorflow_serving/apis/get_model_metadata.proto
tensorflow_serving/apis/input.proto
tensorflow_serving/apis/prediction_service.proto
tensorflow_serving/apis/model.proto

google/protobuf/any.proto
google/protobuf/wrappers.proto
  • Terminalinizde starter/lib/proto/ klasörüne gidin ve saplama oluşturun:
bash generate_grpc_stub_dart.sh

gRPC isteğini oluşturma

REST isteğine benzer şekilde gRPC isteğinde gRPC isteğini oluşturursunuz.

if (_connectionMode == ConnectionModeType.rest) {

} else {
  // TODO: Create and send the gRPC request.

}
  • gRPC isteğini oluşturmak için şu kodu ekleyin:
//Create the gRPC request.
final channel = ClientChannel(_server,
    port: grpcPort,
    options:
        const ChannelOptions(credentials: ChannelCredentials.insecure()));
_stub = PredictionServiceClient(channel,
    options: CallOptions(timeout: const Duration(seconds: 10)));

ModelSpec modelSpec = ModelSpec(
  name: 'spam-detection',
  signatureName: 'serving_default',
);

TensorShapeProto_Dim batchDim = TensorShapeProto_Dim(size: Int64(1));
TensorShapeProto_Dim inputDim =
    TensorShapeProto_Dim(size: Int64(maxSentenceLength));
TensorShapeProto inputTensorShape =
    TensorShapeProto(dim: [batchDim, inputDim]);
TensorProto inputTensor = TensorProto(
    dtype: DataType.DT_INT32,
    tensorShape: inputTensorShape,
    intVal: _tokenIndices);

// If you train your own model, update the input and output tensor names.
const inputTensorName = 'input_3';
const outputTensorName = 'dense_5';
PredictRequest request = PredictRequest(
    modelSpec: modelSpec, inputs: {inputTensorName: inputTensor});

Not: Model mimarileri aynı olsa bile giriş ve çıkış tensörü adları modelden modele farklılık gösterebilir. Kendi modelinizi eğitiyorsanız bunları güncellediğinizden emin olun.

gRPC isteğini TensorFlow Sunumu'na gönderme

  • gRPC isteğini TensorFlow Sunumu'na göndermek için önceki kod snippet'inden sonra bu kodu ekleyin:
// Send the gRPC request.
PredictResponse response = await _stub.predict(request);

TensorFlow Sunumundan gRPC yanıtını işleme

  • Yanıtı yönetmek için geri çağırma işlevlerini uygulamak üzere önceki kod snippet'inden sonra bu kodu ekleyin:
// Process the response.
if (response.outputs.containsKey(outputTensorName)) {
  if (response.outputs[outputTensorName]!.floatVal[1] >
      classificationThreshold) {
    return 'This sentence is spam. Spam score is ' +
        response.outputs[outputTensorName]!.floatVal[1].toString();
  } else {
    return 'This sentence is not spam. Spam score is ' +
        response.outputs[outputTensorName]!.floatVal[1].toString();
  }
} else {
  throw Exception('Error response');
}

Şimdi işlem sonrası kodu, sınıflandırma sonucunu yanıttan çıkarıp kullanıcı arayüzünde gösterir.

Çalıştır

  1. a19a0c68bc4046e6.png Hata ayıklamayı başlat'ı tıklayın ve ardından uygulamanın yüklenmesini bekleyin.
  2. Bir miktar metin girip gRPC > Classify'ı seçin.

e44e6e9a5bde2188.png 92644d723f61968c.png

10. Tebrikler

Uygulamanıza metin sınıflandırma özellikleri eklemek için TensorFlow Sunumunu kullandınız.

Bir sonraki codelab'de, mevcut uygulama tarafından algılanamayan belirli spam mesajlarını algılayabilmeniz için modeli geliştireceksiniz.

Daha fazla bilgi