Нейронная сеть - ValueError: невозможно передать значение формы - PullRequest
0 голосов
/ 01 июля 2018

Я новичок в Python и Tensorflow. Для начала я посмотрел учебник MNIST и до сих пор понимал его.

Но теперь мне нужно создать новую нейронную сеть с числовыми input_datas. Я получил набор данных, который доставляет input_data и v_data.

Если я запускаю input_data.shape -> (1000,25,4)

Если я запускаю v_data.shape -> (1000,2)

Я пытался разделить данные для (Обучение + Проверка) и Тестирование.

  • Обучение + Проверка = 90% от train_data (90% от input.pkl)

  • Данные тестирования = оставшиеся 10%

И затем я разделил 90% input_data при обучении и проверке (70% при обучении, 30% при проверке)

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

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# Imports
import tensorflow as tf
import pickle as pkl
import numpy as np

# load data
with open('input.pkl', 'rb') as f:
    input_data = pkl.load(f)
    f.close()

X_train, y_train = input_data


#split data into train / validation and test
X_input = X_train[0:900]
y_input = y_train[0:900]

#print (X_input.shape)
#print (y_input.shape)

X_train_data = X_input[0:630]
X_test_data = X_input[630:900]

y_train_data = y_input[0:630]
y_test_data = y_input[630:900]

# Variables
hidden_layer_1_nodes = 300
hidden_layer_2_nodes = 100
output_layer_nodes = 100
epochs = 10
classes = 2
epoch_errors = []
stddev = 0.035
learning_rate = 0.08
batch_size = 100

#print (X_train_data[0])

# TF Placeholders
X = tf.placeholder('float', [25, 4], name='X')
y = tf.placeholder('float', name='y')

# Weights Matrices
W1 = tf.Variable(tf.truncated_normal([4, hidden_layer_1_nodes], stddev=stddev), name='W1')
W2 = tf.Variable(tf.truncated_normal([hidden_layer_1_nodes, hidden_layer_2_nodes], stddev=stddev), name='W2')
W3 = tf.Variable(tf.truncated_normal([hidden_layer_2_nodes, output_layer_nodes], stddev=stddev), name='W3')
W4 = tf.Variable(tf.truncated_normal([output_layer_nodes, classes], stddev=stddev), name='W4')

# Biases Vectors
b1 = tf.Variable(tf.truncated_normal([hidden_layer_1_nodes], stddev=stddev), name='b1')
b2 = tf.Variable(tf.truncated_normal([hidden_layer_2_nodes], stddev=stddev), name='b2')
b3 = tf.Variable(tf.truncated_normal([output_layer_nodes], stddev=stddev), name='b3')
b4 = tf.Variable(tf.truncated_normal([classes], stddev=stddev), name='b4')

# Define the Neural Network
def nn_model(X):
    input_layer     =    {'weights': W1, 'biases': b1}
    hidden_layer_1  =    {'weights': W2, 'biases': b2}
    hidden_layer_2  =    {'weights': W3, 'biases': b3}
    output_layer    =    {'weights': W4, 'biases': b4}

    input_layer_sum = tf.add(tf.matmul(X, input_layer['weights']), input_layer['biases'])
    input_layer_sum = tf.nn.relu(input_layer_sum)

    hidden_layer_1_sum = tf.add(tf.matmul(input_layer_sum, hidden_layer_1['weights']), hidden_layer_1['biases'])
    hidden_layer_1_sum = tf.nn.relu(hidden_layer_1_sum)

    hidden_layer_2_sum = tf.add(tf.matmul(hidden_layer_1_sum, hidden_layer_2['weights']), hidden_layer_2['biases'])
    hidden_layer_2_sum = tf.nn.relu(hidden_layer_2_sum)

    output_layer_sum = tf.add(tf.matmul(hidden_layer_2_sum, output_layer['weights']), output_layer['biases'])
    return output_layer_sum

# Train the Neural Network
def nn_train(X):
    pred = nn_model(X)
    pred = tf.identity(pred)
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
    optimizer = tf.train.AdagradOptimizer(learning_rate=learning_rate).minimize(cost)

    with tf.Session() as sess:
        init_op = tf.global_variables_initializer()
        #saver = tf.train.Saver()
        sess.run(init_op)

        for epoch in range(epochs):
            epoch_loss = 0.0

            i = 0
            while i < len(X_train_data):
                start = i
                end = i+batch_size

                batch_x = np.array(X_train_data[start:end])
                batch_y = np.array(y_train_data[start:end])

                _, c = sess.run([optimizer, cost], feed_dict={X: batch_x, y: batch_y})
                epoch_loss += c
                i+= batch_size

            epoch_errors.append(epoch_loss)
            print('Epoch ', epoch + 1, ' of ', epochs, ' with loss: ', epoch_loss)

        correct_result = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
        accuracy = tf.reduce_mean(tf.cast(correct_result, 'float'))
        print('Acc: ', accuracy.eval({X:X_test_data, y:y_test_data}))

if __name__ == "__main__":
    nn_train(X)

Следующая ошибка

ValueError: Невозможно передать значение формы (100, 25, 4) для тензора 'X: 0', который имеет форму '(25, 4)'

происходит в строке 105

_, c = sess.run ([оптимизатор, стоимость], feed_dict = {X: batch_x, y: batch_y})

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

ОБНОВЛЕНИЕ: Извините, я отправил неправильную ошибку: @ Кумар, я изменил размер партии на 30 (поэтому 21 * 30 = 630). Теперь печатает эпохи, но каким-то странным образом:

Epoch  1  of  10  with loss:  1680690.2648780346
Epoch  2  of  10  with loss:  2382142.9208984375
Epoch  3  of  10  with loss:  4215628.857421875
Epoch  4  of  10  with loss:  9046892.295166016
Epoch  5  of  10  with loss:  23961644.453125
Epoch  6  of  10  with loss:  31733882.34375
Epoch  7  of  10  with loss:  46124696.609375
Epoch  8  of  10  with loss:  61760446.28125
Epoch  9  of  10  with loss:  89145610.59375
Epoch  10  of  10  with loss:  121249417.25

И я получил следующую ошибку за:

 print('Acc: ', accuracy.eval({X:X_test_data, y:y_test_data}))

ValueError: Невозможно передать значение формы (270, 25, 4) для Tensor 'X: 0', который имеет форму '(?, 100)'

Процесс завершен с кодом выхода 1

0 голосов
/ 01 июля 2018

Заполнитель, который вы определили для ввода X, имеет форму (25,4)

tf.placeholder('float', [25, 4], name='X')

Но вводимые вами данные имеют форму (100, 25, 4), где 100 - размер вашей партии. Измените определение на

tf.placeholder('float', [None, 25, 4], name='X') 

и ошибка должна исчезнуть. Здесь None автоматически определяет размер партии.

Обновление: Извините, я не прошел весь код. Ваш код нуждается в нескольких исправлениях. Правильный синтаксис для подачи данных в заполнитель:

X = tf.placeholder(tf.float32, [None, input_dim], name='X')

Теперь, если вы имеете дело с изображениями, ваш input_dim будет длиной сглаженного массива для одного примера, т. Е. Если ваше изображение имеет размер 25x4, input_dim должен быть 25 * 4 = 100. Он должен быть равен первому измерению вашего веса слоя 1 здесь W1. Кроме того, прежде чем кормить свою партию, вам нужно изменить ее.

Ниже приведен фиксированный код (изменения комментируются):

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# Imports
import tensorflow as tf
import pickle as pkl
import numpy as np

# load data
with open('input.pkl', 'rb') as f:
    input_data = pkl.load(f)
    f.close()

X_train, y_train = input_data


#split data into train / validation and test
X_input = X_train[0:900]
y_input = y_train[0:900]

#print (X_input.shape)
#print (y_input.shape)

X_train_data = X_input[0:630]
X_test_data = X_input[630:900]

y_train_data = y_input[0:630]
y_test_data = y_input[630:900]

# Variables
hidden_layer_1_nodes = 300
hidden_layer_2_nodes = 100
output_layer_nodes = 100
epochs = 10
classes = 2
epoch_errors = []
stddev = 0.035
learning_rate = 0.08
batch_size = 100

#print (X_train_data[0])

# TF Placeholders
# input data should be of the shape (batch_size, flatten data for one example). Also, the correct shape of y"
X = tf.placeholder(tf.float32, [None, 25 * 4], name='X')
y = tf.placeholder(tf.float32, [None, classes] name='y')

# Weights Matrices. First dimension of W1 == second dimension of X
W1 = tf.Variable(tf.truncated_normal([25 * 4, hidden_layer_1_nodes], stddev=stddev), name='W1')
W2 = tf.Variable(tf.truncated_normal([hidden_layer_1_nodes, hidden_layer_2_nodes], stddev=stddev), name='W2')
W3 = tf.Variable(tf.truncated_normal([hidden_layer_2_nodes, output_layer_nodes], stddev=stddev), name='W3')
W4 = tf.Variable(tf.truncated_normal([output_layer_nodes, classes], stddev=stddev), name='W4')

# Biases Vectors
b1 = tf.Variable(tf.truncated_normal([hidden_layer_1_nodes], stddev=stddev), name='b1')
b2 = tf.Variable(tf.truncated_normal([hidden_layer_2_nodes], stddev=stddev), name='b2')
b3 = tf.Variable(tf.truncated_normal([output_layer_nodes], stddev=stddev), name='b3')
b4 = tf.Variable(tf.truncated_normal([classes], stddev=stddev), name='b4')

# Define the Neural Network
def nn_model(X):
    input_layer     =    {'weights': W1, 'biases': b1}
    hidden_layer_1  =    {'weights': W2, 'biases': b2}
    hidden_layer_2  =    {'weights': W3, 'biases': b3}
    output_layer    =    {'weights': W4, 'biases': b4}

    input_layer_sum = tf.add(tf.matmul(X, input_layer['weights']), input_layer['biases'])
    input_layer_sum = tf.nn.relu(input_layer_sum)

    hidden_layer_1_sum = tf.add(tf.matmul(input_layer_sum, hidden_layer_1['weights']), hidden_layer_1['biases'])
    hidden_layer_1_sum = tf.nn.relu(hidden_layer_1_sum)

    hidden_layer_2_sum = tf.add(tf.matmul(hidden_layer_1_sum, hidden_layer_2['weights']), hidden_layer_2['biases'])
    hidden_layer_2_sum = tf.nn.relu(hidden_layer_2_sum)

    output_layer_sum = tf.add(tf.matmul(hidden_layer_2_sum, output_layer['weights']), output_layer['biases'])
    return output_layer_sum

# Train the Neural Network
def nn_train(X):
    pred = nn_model(X)
    pred = tf.identity(pred)
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
    optimizer = tf.train.AdagradOptimizer(learning_rate=learning_rate).minimize(cost)

    with tf.Session() as sess:
        init_op = tf.global_variables_initializer()
        #saver = tf.train.Saver()
        sess.run(init_op)

        for epoch in range(epochs):
            epoch_loss = 0.0

            i = 0
            while i < len(X_train_data):
                start = i
                end = i+batch_size
                # reshape before feeding.
                batch_x = np.array(X_train_data[start:end]).reshape(batch_size, 25 * 4)
                batch_y = np.array(y_train_data[start:end]).reshape(batch_size, classes)

                _, c = sess.run([optimizer, cost], feed_dict={X: batch_x, y: batch_y})
                epoch_loss += c
                i+= batch_size

            epoch_errors.append(epoch_loss)
            print('Epoch ', epoch + 1, ' of ', epochs, ' with loss: ', epoch_loss)

        correct_result = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
        accuracy = tf.reduce_mean(tf.cast(correct_result, 'float'))
        print('Acc: ', accuracy.eval({X:X_test_data.reshape(-1, 25 * 4), y:y_test_data.reshape(-1, classes)}))

if __name__ == "__main__":
    nn_train(X)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...