3-слойная нейронная сеть, не предсказывающая значения регрессии - PullRequest
0 голосов
/ 10 октября 2019

Я довольно новичок в Tensorflow, а также решаю эту проблему. В настоящее время я делаю 3-х слойную сеть с 10 нейронами в скрытом слое с ReLU, размером мини-пакетного градиентного спуска 8, параметром снижения веса регуляризации L2 (бета) 0,001. Я использую версию Tensorflow 1.14 и использую Python 3.6.

Проблема, которая поражает меня, заключается в том, что мои прогнозируемые значения и ошибки тестирования абсолютно не соответствуют диаграммам .

Например, я изобразил ошибки теста и прогнозные значения против целевых значений для размера выборки 50, , и это то, что получилось. Как вы можете видеть, оба графика являются waaaayвыключен, и я не имел ни малейшего понятия о том, почему.

Вот как примерно выглядит набор данных. Первый столбец отбрасывается, поскольку это просто значение счетчика, апоследний столбец - цель.

Мой код:

NUM_FEATURES = 7
num_neuron = 10
batch_size = 8
beta = 0.001
learning_rate = 0.001

epochs = 4000
seed = 10
np.random.seed(seed)

# read and divide data into test and train sets
total_dataset= np.genfromtxt('dataset_excel.csv', delimiter=',')
X_data, Y_data = total_dataset[1:, 1:8], total_dataset[1:, -1]
Y_data = Y_data.reshape(Y_data.shape[0], 1)

# shuffle input, ensure both are shuffled with the same order
shufflestate = np.random.get_state()
np.random.shuffle(X_data)
np.random.set_state(shufflestate)
np.random.shuffle(Y_data)

# 70% used for training, 30% used for testing
trainX = X_data[:280]
trainY = Y_data[:280]
testX = X_data[280:]
testY = Y_data[280:]

trainX = (trainX - np.mean(trainX, axis=0)) / np.std(trainX, axis=0)

# Create the model
x = tf.placeholder(tf.float32, [None, NUM_FEATURES])
y_ = tf.placeholder(tf.float32, [None, 1])

# get 50 samples for plotting of predicted vs target values
limited50testX = testX[:50]
limited50testY = testY[:50]

# Hidden
with tf.name_scope('hidden'):
    weight1 = tf.Variable(tf.truncated_normal([NUM_FEATURES, num_neuron],stddev=1.0,name='weight1'))
    bias1 = tf.Variable(tf.zeros([num_neuron]),name='bias1')
    hidden = tf.nn.relu(tf.matmul(x, weight1) + bias1)

# output
with tf.name_scope('linear'):
    weight2 = tf.Variable(tf.truncated_normal([num_neuron, 1],stddev=1.0 / np.sqrt(float(num_neuron))),name='weight2')
    bias2 = tf.Variable(tf.zeros([1]),name='bias2')
    logits = tf.matmul(hidden, weight2) + bias2

ridgeLoss = tf.square(y_ - logits)
regularisation = tf.nn.l2_loss(weight1) + tf.nn.l2_loss(weight2)
loss = tf.reduce_mean(ridgeLoss + beta * regularisation)

optimizer = tf.train.GradientDescentOptimizer(learning_rate)
train_op = optimizer.minimize(loss)
error = tf.reduce_mean(tf.square(y_ - logits))

N = len(trainX)
idx = np.arange(N)

predicted=[]

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    train_err = []
    test_err_ = []

    for i in range(epochs):
        for batchStart, batchEnd in zip(range(0, trainX.shape[0], batch_size),range(batch_size, trainX.shape[0], batch_size)):
            train_op.run(feed_dict={x: trainX[batchStart:batchEnd], y_: trainY[batchStart:batchEnd]})
        err = error.eval(feed_dict={x: trainX, y_: trainY})
        train_err.append(err)


        if i % 100 == 0:
            print('iter %d: train error %g' % (i, train_err[i]))
        test_err = error.eval(feed_dict={x: testX, y_: testY})
        test_err_.append(test_err)

    predicted = sess.run(logits, feed_dict={x:limited50testX})
    print("predicted values: ", predicted)
    print("size of predicted values is", len(predicted))

    print("targets: ", limited50testY)
    print("size of target values is", len(limited50testY))

#plot predictions vs targets
numberList=np.arange(0, 50, 1).tolist()
predplot = plt.figure(1)
plt.plot(numberList, predicted, label='Predictions')
plt.plot(numberList, limited50testY, label='Targets')
plt.xlabel('50 samples')
plt.ylabel('Value')
plt.legend(loc='lower right')
predplot.show()

# plot training error
trainplot = plt.figure(2)
plt.plot(range(epochs), train_err)
plt.xlabel(str(epochs) + ' iterations')
plt.ylabel('Train Error')
trainplot.show()

#plot testing error
testplot = plt.figure(3)
plt.plot(range(epochs), test_err_)
plt.xlabel(str(epochs) + ' iterations')
plt.ylabel('Test Error')
testplot.show()

Любая помощь вообще приветствуется.

1 Ответ

0 голосов
/ 10 октября 2019

Не уверен, что это так, но trainX нормализовано, тогда как testX нет. Возможно, вы захотите использовать ту же нормализацию на testX перед прогнозированием.

...