是否可以部分地训练深度神经网络的输入

时间:2019-10-05 08:48:37

标签: python neural-network deep-learning

我想知道是否有可能部分地训练神经网络的输入。例如,假设我有输入256和输出256的神经网络。我要问的是是否有可能采用组,其中每组仅包含265个输入中的16个,以便基于单个预测模型经过独立训练,然后在最终输出中将整个组连接起来。

例如,提供以下示例:

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将为 采取和训练。如果我想将其分为两组,每个groub仅包含2个可用项目,那该怎么办 4,然后独立测试它们并整理输出,那可能吗?

我该怎么做?如果可以的话,您能帮我吗?

先谢谢您。

1 个答案:

答案 0 :(得分:3)

由于问题的不准确,很少有方法可以解释您的问题。

首次解释: 如果您要问的是您的神经网络是否接收到大小为256的 input 向量和输出为256大小的向量,那么答案是否定的,您可以t输入向量的一部分作为输入,并期望它能工作。

第二种解释: 如果您要问的是如果您有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循环之前简单地创建一个空列表,然后将其中的输出连接起来。

希望这会有所帮助。如果我对您的问题理解有误,请告诉我。干杯。