Today, simple python script with pytorch and keras on android pydroid application.
This script is a Tkinter graphical application designed to test and verify PyTorch and Keras packages in Pydroid 3. Right at launch, it tracks execution time down to milliseconds and displays the installed package versions in a status panel. All diagnostics run on a background thread to keep the user interface responsive.
For PyTorch, the script tests matrix inversion, automatic gradient calculations using Autograd, data processing through a neural network linear layer, and eigenvalue decomposition.
For Keras, the script verifies building a Sequential model with dense layers, compiling and training it on synthetic data for 3 epochs, and running a final prediction to confirm end-to-end execution.
This is the result of the running python script:

Let's see the source code:
import os
import time
import threading
import tkinter as tk
from tkinter import ttk, scrolledtext
# Set Keras backend to torch
os.environ["KERAS_BACKEND"] = "torch"
class AppCheck(tk.Tk):
def __init__(self):
self.start_time = time.time()
super().__init__()
self.title("PyTorch & Keras Inspector")
self.geometry("480x600")
self.style = ttk.Style(self)
self.style.theme_use('clam')
self.create_widgets()
# Log UI startup time
ui_ready = self.get_elapsed_str()
self.log(f"{ui_ready} Tkinter UI initialized")
# Initial package check
self.check_initial_imports()
def get_elapsed_str(self):
"""Returns elapsed time in MM:SS.mmm format without brackets."""
elapsed = time.time() - self.start_time
minutes = int(elapsed // 60)
seconds = int(elapsed % 60)
millis = int((elapsed - int(elapsed)) * 1000)
return f"+{minutes:02d}:{seconds:02d}.{millis:03d}"
def create_widgets(self):
# Status Frame
self.info_frame = ttk.LabelFrame(self, text=" Package Status ")
self.info_frame.pack(fill="x", padx=8, pady=4)
self.lbl_torch = ttk.Label(self.info_frame, text="PyTorch: Checking...", font=("Helvetica", 9))
self.lbl_torch.pack(anchor="w", padx=8, pady=2)
self.lbl_keras = ttk.Label(self.info_frame, text="Keras: Checking...", font=("Helvetica", 9))
self.lbl_keras.pack(anchor="w", padx=8, pady=2)
# Run Tests Button
self.btn_run = ttk.Button(self, text="Run Full Test Suite", command=self.start_tests_thread)
self.btn_run.pack(pady=6)
# Console Log Header
ttk.Label(self, text="Execution Log:", font=("Helvetica", 9, "bold")).pack(anchor="w", padx=8)
# Font size reduced to 7 to fit ~10% more content line-by-line
self.txt_log = scrolledtext.ScrolledText(self, height=25, font=("Courier", 7))
self.txt_log.pack(fill="both", expand=True, padx=8, pady=4)
def log(self, message):
"""Helper to append text to the log window."""
self.txt_log.insert(tk.END, message + "\n")
self.txt_log.see(tk.END)
def check_initial_imports(self):
t_str = self.get_elapsed_str()
self.log(f"{t_str} Checking imports...")
# Check PyTorch
try:
import torch
self.lbl_torch.config(text=f"PyTorch: v{torch.__version__}", foreground="green")
self.log(f"{self.get_elapsed_str()} PyTorch v{torch.__version__} loaded successfully")
except ImportError as e:
self.lbl_torch.config(text="PyTorch: Not installed", foreground="red")
self.log(f"{self.get_elapsed_str()} PyTorch import error: {e}")
# Check Keras
try:
import keras
self.lbl_keras.config(text=f"Keras: v{keras.__version__}", foreground="green")
self.log(f"{self.get_elapsed_str()} Keras v{keras.__version__} loaded successfully")
except ImportError as e:
self.lbl_keras.config(text="Keras: Not installed", foreground="red")
self.log(f"{self.get_elapsed_str()} Keras import error: {e}")
def start_tests_thread(self):
self.btn_run.config(state="disabled")
threading.Thread(target=self.run_tests, daemon=True).start()
def run_tests(self):
self.log(f"\n{self.get_elapsed_str()} STARTING FULL TEST SUITE")
# PYTORCH TESTS
try:
import torch
# Test 1: Matrix Inverse
self.log(f"{self.get_elapsed_str()} PyTorch Test 1/4 Matrix Operations")
A = torch.tensor([[2.0, 1.0], [1.0, 4.0]])
A_inv = torch.inverse(A)
self.log(f" Inverted matrix output:")
for row in A_inv.numpy():
self.log(f" {row}")
# Test 2: Autograd
self.log(f"{self.get_elapsed_str()} PyTorch Test 2/4 Autograd Gradient Calculation")
x = torch.tensor([3.0], requires_grad=True)
y = x**3 + 2*x
y.backward()
self.log(f" dy/dx at x=3 (expected 29.0): {x.grad.item()}")
# Test 3: Linear Layer
self.log(f"{self.get_elapsed_str()} PyTorch Test 3/4 Neural Network Linear Layer")
lin = torch.nn.Linear(3, 1)
inp = torch.randn(2, 3)
out = lin(inp)
self.log(f" Output tensor shape: {out.shape}")
# Test 4: Eigenvalues
self.log(f"{self.get_elapsed_str()} PyTorch Test 4/4 Eigenvalue Decomposition")
e_vals = torch.linalg.eigvals(A)
self.log(f" Eigenvalues: {e_vals.numpy()}")
except Exception as e:
self.log(f"{self.get_elapsed_str()} PyTorch Test Failed: {str(e)}")
# KERAS TESTS
try:
import keras
import numpy as np
# Test 1: Sequential Model Creation
self.log(f"{self.get_elapsed_str()} Keras Test 1/3 Building Sequential Model")
model = keras.Sequential([
keras.layers.Input(shape=(4,)),
keras.layers.Dense(8, activation="relu"),
keras.layers.Dense(1, activation="sigmoid")
])
self.log(f" Model created successfully with {model.count_params()} parameters")
# Test 2: Model Compilation & Training
self.log(f"{self.get_elapsed_str()} Keras Test 2/3 Model Compilation and Training")
model.compile(optimizer="adam", loss="binary_crossentropy")
X_train = np.random.random((32, 4))
y_train = np.random.randint(2, size=(32, 1))
history = model.fit(X_train, y_train, epochs=3, batch_size=16, verbose=0)
final_loss = history.history['loss'][-1]
self.log(f" 3 epochs training completed. Final loss: {final_loss:.4f}")
# Test 3: Inference / Prediction
self.log(f"{self.get_elapsed_str()} Keras Test 3/3 Model Prediction")
X_test = np.random.random((2, 4))
preds = model.predict(X_test, verbose=0)
self.log(f" Prediction results shape: {preds.shape}")
for pred in preds:
self.log(f" Output probabilities: {pred}")
except Exception as e:
self.log(f"{self.get_elapsed_str()} Keras Test Failed: {str(e)}")
self.log(f"\n{self.get_elapsed_str()} TEST SUITE COMPLETED SUCCESSFULLY")
self.btn_run.config(state="normal")
if __name__ == "__main__":
app = AppCheck()
app.mainloop()




