{"id":212,"library":"tensorflow","title":"TensorFlow","description":"Google's open-source machine learning framework. Current version is 2.21.0 (Mar 2026). Requires Python >=3.10. The single biggest footgun: TensorFlow 2.16+ ships Keras 3 as default, splitting tf.keras and import keras into two incompatible APIs. tf.estimator removed in 2.16.","status":"active","version":"2.21.0","language":"python","source_language":"en","source_url":"https://github.com/tensorflow/tensorflow/releases","tags":["deep-learning","ml","gpu","keras","neural-networks","tpu"],"install":[{"cmd":"pip install tensorflow","lang":"bash","label":"Standard (CPU + GPU via nvidia packages)"},{"cmd":"pip install tensorflow[and-cuda]","lang":"bash","label":"With CUDA dependencies bundled"},{"cmd":"pip install tensorflow-cpu","lang":"bash","label":"CPU-only (smaller, no GPU)"},{"cmd":"pip install tf-keras","lang":"bash","label":"Keras 2 compatibility shim (maintenance mode)"}],"dependencies":[{"reason":"Keras 3 is the default Keras since TF 2.16. Installed automatically. Now a separate package from tensorflow.","package":"keras>=3.0","optional":false},{"reason":"Keras 2 compatibility shim. Install if you need Keras 2 API with TF 2.16+. Maintenance mode only — no new features.","package":"tf-keras","optional":true}],"imports":[{"note":"Since TF 2.16, tf.keras and import keras both point to Keras 3 — but third-party libraries like tensorflow_hub, tensorflow_probability may still use the old bundled keras, causing isinstance failures.","wrong":"# Mixing tf.keras and keras objects causes ValueError:\nimport keras\nimport tensorflow_hub as hub\nlayer = hub.KerasLayer(url)  # hub uses tf.keras, not standalone keras\nmodel = keras.Sequential([layer])  # ValueError: not a keras.Layer instance","symbol":"keras","correct":"# Option 1: Use standalone Keras 3 (recommended for new code)\nimport keras\nmodel = keras.Sequential([keras.layers.Dense(64, activation='relu')])\n\n# Option 2: Access via tf.keras (same Keras 3 in TF 2.16+)\nimport tensorflow as tf\nmodel = tf.keras.Sequential([tf.keras.layers.Dense(64)])"},{"note":"TF 1.x session-based API (sess = tf.Session(), sess.run()) fully removed in TF 2.0. Use eager execution or @tf.function for graph compilation.","wrong":"# Calling model.fit() for a single step — inefficient\n# Using sess.run() — TF 1.x session API removed in TF 2.0","symbol":"tf.function","correct":"@tf.function\ndef train_step(x, y):\n    with tf.GradientTape() as tape:\n        pred = model(x, training=True)\n        loss = loss_fn(y, pred)\n    grads = tape.gradient(loss, model.trainable_variables)\n    optimizer.apply_gradients(zip(grads, model.trainable_variables))\n    return loss"}],"quickstart":{"code":"import tensorflow as tf\nimport keras\n\n# Build model (Keras 3)\nmodel = keras.Sequential([\n    keras.layers.Dense(64, activation='relu', input_shape=(10,)),\n    keras.layers.Dense(1)\n])\n\nmodel.compile(\n    optimizer='adam',\n    loss='mse',\n    metrics=['mae']\n)\n\n# Train\nmodel.fit(X_train, y_train, epochs=10, batch_size=32, validation_split=0.2)\n\n# Save / load (.keras format recommended)\nmodel.save('model.keras')\nloaded = keras.models.load_model('model.keras')","lang":"python","description":"Keras 3 model with TensorFlow backend. Use .keras format for saving."},"warnings":[{"fix":"To keep Keras 2: pip install tf-keras, then set environment variable TF_USE_LEGACY_KERAS=1 before any tensorflow import. For new code, migrate to Keras 3 API. Key changes: tf.Variable attributes → keras.Variable, TF SavedModel save/load API changed, jit_compile=True by default.","message":"TF 2.16+ ships Keras 3 as default. tf.keras now points to Keras 3, which has breaking API differences from Keras 2. Code written for Keras 2 (tf.keras with TF <2.16) may fail silently or with cryptic errors.","severity":"breaking","affected_versions":">= 2.16"},{"fix":"Migrate to Keras model API. The Keras training API (model.fit, model.evaluate, model.predict) covers all use cases from tf.estimator.","message":"tf.estimator API fully removed in TF 2.16. Any code using tf.estimator.Estimator, tf.estimator.DNNClassifier, etc. raises AttributeError.","severity":"breaking","affected_versions":">= 2.16"},{"fix":"Use model.save('model.keras') for Keras format. To export as TF SavedModel: tf.saved_model.save(model, 'saved_model_dir'). To load a SavedModel as a Keras layer: keras.layers.TFSMLayer('saved_model_dir', call_endpoint='serving_default').","message":"Keras 3: model.save() to TF SavedModel format no longer supported. model.save('path') now saves in .keras format by default.","severity":"breaking","affected_versions":">= Keras 3.0 / TF 2.16"},{"fix":"Use self.add_weight() or assign keras.Variable instead of tf.Variable for tracked layer weights.","message":"Keras 3: tf.Variable assigned as Layer attributes is NOT tracked as a weight. This silently breaks custom layers that assign tf.Variable in __init__.","severity":"breaking","affected_versions":">= Keras 3.0 / TF 2.16"},{"fix":"Use tensorflow<2.11 for native Windows GPU, or use WSL2 for GPU support with newer versions.","message":"Windows: TF GPU support above 2.10 dropped for Windows Native. tensorflow>=2.11 on Windows only runs on CPU. GPU on Windows requires WSL2.","severity":"breaking","affected_versions":">= 2.11 on Windows"},{"fix":"Use consistent imports: either always use tf.keras (from tensorflow import keras) or always use standalone import keras. Do not mix objects from both in the same model.","message":"Mixing standalone keras package and tf.keras objects causes isinstance failures. Libraries like tensorflow_hub use tf.keras internally — adding hub.KerasLayer to a standalone keras.Sequential raises ValueError: not an instance of keras.Layer.","severity":"gotcha","affected_versions":">= 2.16"},{"fix":"Pass jit_compile=False to model.compile() if you encounter XLA errors with custom layers or TF ops.","message":"Keras 3 sets jit_compile=True by default (XLA compilation). Custom layers using TensorFlow-specific ops not supported by XLA will silently fail or error. Was False by default in Keras 2.","severity":"gotcha","affected_versions":">= Keras 3.0"},{"fix":"Use a supported Python version (e.g., Python 3.9-3.11 for TensorFlow 2.x) and a glibc-based Linux distribution (e.g., Ubuntu, Debian, CentOS) or their official Docker images for TensorFlow installation.","message":"TensorFlow often lacks pre-built wheels for very new Python versions (e.g., Python 3.13) or non-standard Linux distributions like Alpine (due to musl libc). This results in 'No matching distribution found' errors during installation.","severity":"breaking","affected_versions":">= Python 3.13 or Alpine Linux"}],"env_vars":null,"last_verified":"2026-05-12T10:47:23.201Z","next_check":"2026-06-25T00:00:00.000Z","problems":[],"ecosystem":"pypi","meta_description":null,"install_score":20,"install_tag":"stale","quickstart_score":0,"quickstart_tag":"stale","pypi_latest":null,"install_checks":{"last_tested":"2026-05-12","tag":"stale","tag_description":"widespread failures or data too old to trust","results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"and-cuda","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"94.6M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"2.1G"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"2.0G"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"and-cuda","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"6.1G"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"2.1G"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"and-cuda","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"91.6M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"2.1G"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"2.0G"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"and-cuda","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"6.2G"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"2.2G"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"and-cuda","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"81.8M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"2.1G"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"2.0G"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"and-cuda","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"6.2G"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"2.1G"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"and-cuda","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"78.2M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"2.1G"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"2.0G"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"and-cuda","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"6.2G"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"2.2G"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"and-cuda","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"92.2M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"2.1G"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"1.9G"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"and-cuda","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"6.2G"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"2.1G"}]},"quickstart_checks":{"last_tested":"2026-04-23","tag":"stale","tag_description":"widespread failures or data too old to trust","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":-1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":-1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":-1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":-1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":-1}]}}