Как создать эту пользовательскую ЭНН с помощью tensorflow?

#tensorflow #machine-learning #neural-network

Вопрос:

Я пытаюсь создать эту пользовательскую ЭНН с помощью tensorflow. Вот изображение сети игрушек и код.

введите описание изображения здесь

 import tensorflow as tf
import numpy as np

in = np.array([1, 2, 3, 4], , dtype="float32")
y_true = np.array([10, 11], , dtype="float32")


# w is vector of weights
# y_pred = np.array([in[0]*w[0] in[1]*w[0]], [in[2]*w[1] in[3]*w[1]] )
# y_pred1 = 1 / (1   tf.math.exp(-y_pred)) # sigmoid activation function

def loss_fun(y_true, y_pred1):
    loss1 = tf.reduce_sum(tf.pow(y_pred1 - y_true, 2))   

# model.compile(loss=loss_fun,  optimizer='adam', metrics=['accuracy'])
 

Вывод этой сети идет к другой ЭНН справа, и я знаю это, но не знаю, как я могу создавать соединения, обновлять w y_pred и компилировать модель. Какая-нибудь помощь?

Ответ №1:

Что-то вроде этого должно сработать

 import tensorflow as tf
import numpy as np

def y_pred(x, w):
    return [x[0]*w[0] x[1]*w[0], x[2]*w[1] x[3]*w[1]]

def loss_fun(y_true, y_pred):
    return tf.reduce_sum(tf.pow(y_pred - y_true, 2))
        
x = np.array([1, 2, 3, 4], dtype="float32")
y_true = np.array([10, 11], dtype="float32")
w = tf.Variable(initial_value=np.random.normal(size=(2)), name='weights', dtype=tf.float32)
xt = tf.convert_to_tensor(x)
yt = tf.convert_to_tensor(y_true)
sgd_opt = tf.optimizers.SGD()
training_steps = 100
display_steps = 10
for step in range(training_steps):
    with tf.GradientTape() as tape:
        tape.watch(w)
        yp = y_pred(xt, w)
        loss = loss_fun(yt, yp)
    dl_dw = tape.gradient(loss, w)
    sgd_opt.apply_gradients(zip([dl_dw], [w]))
    if step % display_steps == 0:
        print(loss, w)
 

Комментарии:

1. Спасибо. Мне нужно написать отдельную функцию активации или я могу использовать встроенные функции?

2. @ewr3243 Вы можете использовать встроенные активации, просто измените функцию y_pred (или запустите «yp» через активацию). Вы, вероятно, захотите изменить свою потерю на кросс-энтропию, а также y_true будет выглядеть по-другому. Вам нужно быть немного осторожным с градиентной лентой, если вы начнете что-то менять, потому что все должно быть тензорами (не например, np.ndarrays).