Częste problemy

Jeśli Twojego problemu nie ma na liście, przeszukaj problemy na Githubie przed wypełnieniem nowego.

TypeError: Nie można wywołać obiektu „AutoTrackable”.

# BAD: Raises error
embed = hub.load('https://tfhub.dev/google/nnlm-en-dim128/1')
embed(['my text', 'batch'])

Ten błąd często pojawia się podczas ładowania modeli w formacie TF1 Hub za pomocą funkcji API hub.load() w TF2. Dodanie prawidłowego podpisu powinno rozwiązać ten problem. Zobacz przewodnik migracji TF-Hub dla TF2, aby uzyskać więcej szczegółów na temat przejścia do TF2 i wykorzystania modeli w formacie TF1 Hub w TF2.


embed = hub.load('https://tfhub.dev/google/nnlm-en-dim128/1')
embed.signatures['default'](['my text', 'batch'])

Nie można pobrać modułu

W procesie korzystania z modułu z adresu URL może pojawić się wiele błędów ze względu na stos sieciowy. Często jest to problem specyficzny dla komputera, na którym działa kod, a nie problem z biblioteką. Oto lista najczęściej spotykanych:

  • „EOF wystąpił z naruszeniem protokołu” — ten problem prawdopodobnie zostanie wygenerowany, jeśli zainstalowana wersja Pythona nie obsługuje wymagań TLS serwera hostującego moduł. Warto zauważyć, że Python 2.7.5 nie rozwiązuje modułów z domeny tfhub.dev. POPRAWKA : Zaktualizuj do nowszej wersji Pythona.

  • „nie można zweryfikować certyfikatu tfhub.dev” — ten problem prawdopodobnie zostanie wygenerowany, jeśli coś w sieci będzie próbowało działać jako gTLD dewelopera. Zanim .dev zostało użyte jako gTLD, programiści i frameworki czasami używali nazw .dev, aby pomóc w testowaniu kodu. POPRAWKA: Zidentyfikuj i ponownie skonfiguruj oprogramowanie przechwytujące rozpoznawanie nazw w domenie „.dev”.

  • Niepowodzenie zapisu do katalogu pamięci podręcznej /tmp/tfhub_modules (lub podobnego): zobacz Buforowanie , aby dowiedzieć się, co to jest i jak zmienić jego lokalizację.

Jeśli powyższe błędy i poprawki nie działają, można spróbować ręcznie pobrać moduł, symulując protokół dołączenia ?tf-hub-format=compressed do adresu URL, aby pobrać plik skompresowany w formacie tar, który należy ręcznie zdekompresować do lokalnego pliku plik. Zamiast adresu URL można następnie użyć ścieżki do pliku lokalnego. Oto szybki przykład:

# Create a folder for the TF hub module.
$ mkdir /tmp/moduleA
# Download the module, and uncompress it to the destination folder. You might want to do this manually.
$ curl -L "https://tfhub.dev/google/universal-sentence-encoder/2?tf-hub-format=compressed" | tar -zxvC /tmp/moduleA
# Test to make sure it works.
$ python
> import tensorflow_hub as hub
> hub.Module("/tmp/moduleA")

Uruchamianie wnioskowania na wstępnie zainicjowanym module

Jeśli piszesz program w języku Python, który wielokrotnie stosuje moduł na danych wejściowych, możesz zastosować poniższe przepisy. (Uwaga: w przypadku obsługi żądań w usługach produkcyjnych rozważ obsługę TensorFlow lub inne skalowalne rozwiązania niezawierające języka Python).

Zakładając, że Twoim modelem przypadków użycia jest inicjalizacja i kolejne żądania (na przykład Django, Flask, niestandardowy serwer HTTP itp.), możesz skonfigurować udostępnianie w następujący sposób:

Zapisane modele TF2

  • W części inicjującej:
    • Załaduj model TF2.0.
import tensorflow_hub as hub

embedding_fn = hub.load("https://tfhub.dev/google/universal-sentence-encoder/4")
  • W części żądania:
    • Użyj funkcji osadzania, aby uruchomić wnioskowanie.
embedding_fn(["Hello world"])

To wywołanie funkcji tf.function jest zoptymalizowane pod kątem wydajności, zobacz przewodnik po funkcji tf .

Moduły koncentratora TF1

  • W części inicjującej:
    • Zbuduj wykres z symbolem zastępczym – punktem wejścia do wykresu.
    • Zainicjuj sesję.
import tensorflow as tf
import tensorflow_hub as hub

# Create graph and finalize (finalizing optional but recommended).
g = tf.Graph()
with g.as_default():
  # We will be feeding 1D tensors of text into the graph.
  text_input = tf.placeholder(dtype=tf.string, shape=[None])
  embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder/2")
  embedded_text = embed(text_input)
  init_op = tf.group([tf.global_variables_initializer(), tf.tables_initializer()])
g.finalize()

# Create session and initialize.
session = tf.Session(graph=g)
session.run(init_op)
  • W części żądania:
    • Użyj sesji, aby wprowadzić dane do wykresu za pośrednictwem symbolu zastępczego.
result = session.run(embedded_text, feed_dict={text_input: ["Hello world"]})

Nie można zmienić typu dmodelu (np. float32 na bfloat16)

SavedModels TensorFlow (udostępniane w TF Hub lub w inny sposób) zawierają operacje, które działają na ustalonych typach danych (często float32 dla wag i pośrednich aktywacji sieci neuronowych). Nie można ich zmienić po wczytaniu SavedModel (ale wydawcy modeli mogą zdecydować się na publikację różnych modeli z różnymi typami danych).

Zaktualizuj wersję modelu

Można aktualizować metadane dokumentacji wersji modelu. Jednak zasoby wersji (pliki modelu) są niezmienne. Jeśli chcesz zmienić zasoby modelu, możesz opublikować nowszą wersję modelu. Dobrą praktyką jest rozszerzenie dokumentacji o dziennik zmian opisujący, co uległo zmianie pomiędzy wersjami.