프로그래밍을 공부한지 1주일차인 타과생입니다. 딥러닝을 코드로 기초적인것은 짜보면서 공부하는데 이해가 너무 벅찬 것 같습니다. 그냥 텐서플로우를 잘 사용할 수 있게만 하는것이 딥러닝과 강화학습을 응용한 프로그램을 만드는데 괜찮을까요? 아니면 아래처럼 다 코딩하면서 공부해야할까요... 질문 수준이 낮아서 죄송합니다.
*추가로 pandas도 익히고잇습니다.

그리고 라이브러리 문법을 익히는것이 휘발성이 강하던데 암기팁이나 아니면 프로그래밍 공부 팁이 있을까요?
그 외 조언들해주시면 정말 감사하게 다 숙지하겠습니다.

*
아래는 위에서 말씀드린 2시간 꼬박걸려서 이해하고 안보고도 코딩할 수 있게 된 XOR gate문제 딥러닝 코드입니다... 정말 기초적인것인데도 힘들었네요. nditer가뭔지 fx1=f(x[idx])는 왜 안써도 되는건지 등.... 제 자신이 너무 작아집니다,.
이제는 모든 스텝을 이해한다고 하지만..에휴,.,

import numpy as np

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

def numerical_derivative(f, x):
delta_x = 1e-7
grad = np.zeros_like(x)

it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])

while not it.finished:
idx = it.multi_index
tmp_val = x[idx]
x[idx] = float(tmp_val) + delta_x
fx1 = f(x)

x[idx] = float(tmp_val) - delta_x
fx2 = f(x)

grad[idx] = (fx1 - fx2) / (2 * delta_x)

x[idx] = tmp_val
it.iternext()

return grad

class LogicGate:
def __init__(self, gate_name, xdata, tdata):
self.name = gate_name
self.__xdata = xdata
self.__tdata = tdata.reshape(4, 1)
self.__W2 = np.random.rand(2, 8)
self.__b2 = np.random.rand(8)
self.__W3 = np.random.rand(8, 1)
self.__b3 = np.random.rand(1)
self.__learning_rate = 1e-2
print(self.name + ' object is created')

def feed_forward(self):
delta = 1e-7
z2 = np.dot(self.__xdata, self.__W2) + self.__b2
a2 = sigmoid(z2)

z3 = np.dot(a2, self.__W3) + self.__b3
y = a3 = sigmoid(z3)
return -np.sum(self.__tdata * np.log(y + delta) + (1 - self.__tdata) * np.log(1 - y + delta))

def loss_val(self):
delta = 1e-7
z2 = np.dot(self.__xdata, self.__W2) + self.__b2
a2 = sigmoid(z2)
z3 = np.dot(a2, self.__W3) + self.__b3
y = a3 = sigmoid(z3)
return -np.sum(self.__tdata * np.log(y + delta) + (1 - self.__tdata) * np.log(1 - y + delta))

def train(self):
f = lambda x: self.feed_forward()
print('initial loss value = ', self.loss_val())
for step in range(20001):
self.__W2 -= self.__learning_rate * numerical_derivative(f, self.__W2)
self.__b2 -= self.__learning_rate * numerical_derivative(f, self.__b2)
self.__W3 -= self.__learning_rate * numerical_derivative(f, self.__W3)
self.__b3 -= self.__learning_rate * numerical_derivative(f, self.__b3)

if step % 400 == 0:
print("step =", step, 'loss value =', self.loss_val())

def predict(self, xdata):
z2 = np.dot(xdata, self.__W2) + self.__b2
a2 = sigmoid(z2)
z3 = np.dot(a2, self.__W3) + self.__b3
y = a3 = sigmoid(z3)

if y > 0.5:
result = 1
else:
result = 0
return y, result

xdata = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
tdata = np.array([0, 1, 1, 0])
and_obj = LogicGate('AND', xdata, tdata)
and_obj.train()

t_test = np.array([[0, 0], [1, 0], [0, 1], [1, 1]])
for data in t_test:
y, result = and_obj.predict(data)
print("Predicted y:", y)
print("Predicted result:", result)