Destruir el bloqueo

¿Por que cuando intento escribir codigo en Python, me trabo a pesar de conocer bien todo el lenguaje?, ¿alguna técnica para desbloquearme?

Hola,

Lo que describís puede ser que dominas más las sentencias del lenguaje
pero por ahi te falta un poco más partir los problemas en problemas más
pequeños y/o aprender diseño y resolución de problemas.

Te recomendaría aprender patrones de diseño si no los sabés
(https://www.oreilly.com/library/view/apex-design-patterns/9781782173656/ch01s09.html),
y aplicar TDD en tus desarrollos
(TDD - Taller de Python).

Yo por ejemplo para todos los agentes de IA que uso tengo reglas
bastante estrictas de plan → justificar GoF → test red (aplicando TDD

  • BDD) → implementar con DRY + SOLID → test green → refactor.

Si queres se puede ahondar mas en el tema.

Saludos,

Javier.

¿Podría ser que me falte saber algo de por ejemplo, matemática discreta, grafos, funcionamiento interno del algoritmo?

No necesariamente necesitás meterte ahora en matemática discreta, grafos
o mucha teoría. Todo eso aporta herramientas y para determinados
problemas puede ser fundamental, pero lo principal es aprender a
entender el problema, dividirlo, identificar los supuestos, pensar las
excepciones y buscar una buena solución.

Una forma de ejercitar eso es mirar prácticamente cualquier sistema que
ya exista y preguntarte: ¿qué problema intenta resolver?, ¿por qué lo
hicieron así?, ¿qué supuestos hicieron?, ¿qué casos raros aparecen?,
¿qué ventajas y desventajas tendría hacerlo de otra manera?

Por ejemplo con el registro de conducir de motos, se usa la cilindrada
(p kw si es eléctrica) para medir la categoría. Por lo tanto con esa
clasificación, una MTT Turbine 430RR (la más rápida del mundo) no tiene
motor a explosión (usa una turbina de helicóptero) y por lo tanto la
métrica de cilindrada no es aplicable a una turbina.

Saludos,

Javier.

import numpy as np
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt

X, Y = make_moons(100, noise=0.2, random_state=42)
Y = Y.reshape(100,1)

X_train = X[:80]
Y_train = Y[:80]

X_test = X[80:]
Y_test = Y[80:]

np.random.seed(42)

W1 = np.random.randn(80,2)
W2 = np.random.randn(80,1)
B1 = np.zeros((1,80))
B2 = np.zeros((1,80))

def relu(x):
return np.maximum(0, x)

def sigmoid(x):
return 1 / (1 + np.exp(-x))

def mse(x):
return np.mean((x - Y_train)**2)

def dev_mse(x):
return (2/len(Y_train)) * (x - Y_train)

def dev_sigmoid(x):
return x * (1 - x)

def dev_relu(x):
return np.where(x > 0,1,0)

epochs = 3
LR = 0.5

for epoch in range(epochs):
#FORWARD
#capa oculta
suma_ponderada1 = X_train @ W1.T + B1
rel = relu(suma_ponderada1)

#capa de salida: 
suma_ponderada2 = rel @ W2 + B2
sig = sigmoid(suma_ponderada2)

m = mse(sig) 

#BACKPROPAGATION 
#capa de salida:
delta2 = dev_mse(sig) * dev_sigmoid(sig)  
DW2 = delta2 @ rel 
DB2 = np.sum(delta2, axis=0, keepdims=True) 

#capa oculta: 
delta1 = (delta2 @ W2) * dev_relu(suma_ponderada1)
DW1 = delta1 @ X_train 
DB1 = np.sum(delta1, axis=0, keepdims=True)

#descenso de gradiente: 
W1 -= LR * DW1 
W2 -= LR * DW2 

¿por que será que este codigo me devuelve error?, ¿Cómo podría hacer que las dimensiones del descenso de gradiente de W2 coincidan?