Можно ли тренировать входы глубокой нейронной сети по частям? - PullRequest
2 голосов
/ 05 октября 2019

Мне было интересно, если возможно, обучить входы нейронной сети по частям. Например, предположим, что у меня есть нейронная сеть с входами 256 и выходом 256. Я спрашиваю о возможности взять группы, в которых каждая группа содержит только 16 из 265 входов, чтобы их можно было прогнозировать на основе одногомодель обучается независимо, а затем объединяет целые группы на конечных выходах.

Например, приведен следующий пример:

from matplotlib import pyplot as plt
import tensorflow as tf

tf.reset_default_graph()

x_train = [[0.,0.],[1.,1.],[1.,0.],[0.,1.]]
y_train = [[0.],[0.],[1.],[1.]]

x_test =  [[0.,0.],[.5,.5],[.5,0.],[0.,.5]]
y_test = [[0.],[0.],[2.],[2.]]

# use placeholder instead so you can have different inputs
x = tf.placeholder('float32', [None, 2])
y = tf.placeholder('float32',)

# Layer 1 = the 2x3 hidden sigmoid
m1 = tf.Variable(tf.random_uniform([2,3], minval=0.1, maxval=0.9, dtype=tf.float32))
b1 = tf.Variable(tf.random_uniform([3], minval=0.1, maxval=0.9, dtype=tf.float32))
h1 = tf.sigmoid(tf.matmul(x, m1) + b1)
# Layer 2 = the 3x1 sigmoid output
m2 = tf.Variable(tf.random_uniform([3,1], minval=0.1, maxval=0.9, dtype=tf.float32))
b2 = tf.Variable(tf.random_uniform([1], minval=0.1, maxval=0.9, dtype=tf.float32))
y_out = tf.sigmoid(tf.matmul(h1, m2) + b2)
### loss
# loss : sum of the squares of y0 - y_out
loss = tf.reduce_sum(tf.square(y - y_out))
# training step : gradient decent (1.0) to minimize loss
train = tf.train.GradientDescentOptimizer(1.0).minimize(loss)

# the two feed dictionaries
feeddict_train = {x: x_train, y: y_train}
feeddict_test = {x: x_test, y: y_test}

### training
# run 500 times using all the X and Y
# print out the loss and any other interesting info
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    train_loss, test_loss = [], []
    for step in range(500):
        loss_train, _ = sess.run([loss, train], feed_dict=feeddict_train)
        train_loss.append(loss_train)

        # under the same tensorflow graph (in the session), use another feed dictionary 
        loss_test = sess.run(loss, feed_dict=feeddict_test)
        test_loss.append(loss_test)

plt.plot(train_loss, 'r', label='train_loss')
plt.plot(test_loss, 'b', label='test_loss')
plt.legend(loc='best')

здесь, в этой команде loss_test = sess.run(loss, feed_dict=feeddict_test), все входные данные feeddict_test будут взяты и обучены. что если я захочу разделить его на две группы, каждая группа содержит только 2 элемента из имеющихся 4, а затем самостоятельно протестировать их и подтвердить результаты, возможно ли это?

Как я могу это сделать? не могли бы вы помочь мне в этом, если это возможно?

спасибо заранее.

1 Ответ

3 голосов
/ 05 октября 2019

Существует несколько способов интерпретации вашего вопроса из-за неточности вашего вопроса.

Первая интерпретация: Если вы спрашиваете, что ваша нейронная сеть получает input вектор размера 256 и output вектор размера 256, тогда ответ - нет, вы не можете ввести часть вектора в качестве ввода и ожидать, что он будет работать.

Вторая интерпретация: Если вы спрашиваете, что если у вас есть 256 данных (каждый из данных представляет собой вектор n-размера), и вы хотите обучить сеть с помощьюввод первых 16, затем вторых 16 и так далее до 16-го числа 16, да, это очень возможно. Исходя из приведенного вами примера кода, все, что вам нужно сделать, это создать цикл for, который повторяется 2 раза (потому что в вашем примере 4 данных, и вы хотите ввести их в группу из 2) и,

Измените эти строки кода:

for step in range(500):
        loss_train, _ = sess.run([loss, train], feed_dict=feeddict_train)`

на

for step in range(500):
        temp_list = [] #an empty list
        for i in range(0,4,2):
               loss_train, _ = sess.run([loss, train], feed_dict={x:x_train[i:i+2], y:y_train[i:i+2]}
               temp_list.append(loss_train) #append the loss of the network for each group of data.

Это позволит сети обучаться с двумя группами данных независимо и учиться на них. Вы можете просто создать пустой список перед новым for loop и объединить выходы в нем.

Надеюсь, это поможет. Дайте мне знать, если я неправильно понял ваши вопросы. Приветствия.

...