Tensorflow Несовместимые формы - PullRequest
0 голосов
/ 19 марта 2019

Я изучаю, как обращаться с Tensorflow и как предсказывать некоторые данные из файлов .csv. По сути, я следую указаниям https://blog.goodaudience.com/first-experience-of-building-a-lstm-model-with-tensorflow-e632bde911e1, но столкнулся с некоторыми проблемами при классификации по нескольким классам. Согласно статье, я должен использовать tensorflow.nn.softmax_cross_entropy_with_logits для таких значений, но каждый раз, когда я делаю это, у меня возникают проблемы с несовместимыми фигурами. Затем я обнаружил, что могу использовать tf.nn.sigmoid_cross_entropy_with_logits, если нормализую свои данные. Он успешно работает с двоичными метками, но когда я изменяю его на другие столбцы (с целыми числами), он прерывается с

InvalidArgumentError (см. Выше для отслеживания): несовместимые фигуры: [544] против [32] [[Узел: logistic_loss / mul = Mul [T = DT_FLOAT, _device = "/ job: localhost / replica: 0 / task: 0 / gpu: 0"] (Reshape, _recv_Placeholder_1_0 / _1)]] [[Узел: Среднее / _15 = _Recvclient_terminated = false, recv_device = "/ job: localhost / replica: 0 / task: 0 / cpu: 0", send_device = "/ job: localhost / replica: 0 / task: 0 / gpu : 0 ", send_device_incarnation = 1, тензор_имя =" edge_265_Mean ", тензор_тип = DT_FLOAT, _device =" / job: localhost / реплика: 0 / задача: 0 / процессор: 0 "]]

Полный код здесь

import tensorflow as tf
import pandas as pd
import os
import numpy as np
from tensorflow.contrib import rnn
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score, accuracy_score, recall_score, precision_score

#default settings
epochs = 8
n_units = 200
batch_size = 32
n_classes = 1
n_features = 29


def read_data(filename):
    dataset = pd.read_csv(filename)
    dataset = dataset.fillna(method='ffill')
    list_of_features = ["col2","col3"]
    label = "col1"
    #to normalize the dataset
    train_set = dataset[list_of_features]/dataset[list_of_features].max()
    label_set = dataset[label]/dataset[label].max()

    X_train, X_test, y_train, y_test = train_test_split(train_set, label_set, test_size=0.3, shuffle=False, random_state=42)
    n_classes = len(dataset[label].unique())-1
    n_features = len(list_of_features)
    xplaceholder = tf.placeholder('float', [None, n_features])
    yplaceholder = tf.placeholder('float')
    train_neural_network(X_train, X_test, y_train, y_test, xplaceholder, yplaceholder, n_classes, n_features, batch_size)

def recurrent_neural_network_model(xplaceholder,n_features, n_classes):
    layer = {'weights': tf.Variable(tf.random_normal([n_units, n_classes])),
             'bias': tf.Variable(tf.random_normal([n_classes]))}

    x = tf.split(xplaceholder, n_features, 1)
    print(x)

    lstm_cell = rnn.BasicLSTMCell(n_units)

    outputs, states = rnn.static_rnn(lstm_cell, x, dtype=tf.float32)

    output = tf.matmul(outputs[-1], layer['weights']) + layer['bias']

    return output


def train_neural_network(X_train, X_test, y_train, y_test, xplaceholder, yplaceholder, n_classes, n_features, batch_size):
    logit = recurrent_neural_network_model(xplaceholder,n_features, n_classes)
    logit = tf.reshape(logit, [-1])
    cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logit, labels=yplaceholder))
    optimizer = tf.train.AdamOptimizer().minimize(cost)

    with tf.Session() as sess:

        tf.global_variables_initializer().run()
        tf.local_variables_initializer().run()

        for epoch in range(epochs):
            epoch_loss = 0

            i = 0
            for i in range(int(len(X_train) / batch_size)):
                start = i
                end = i + batch_size

                batch_x = np.array(X_train[start:end])
                batch_y = np.array(y_train[start:end])

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

            print('Epoch', epoch, 'completed out of', epochs, 'loss:', epoch_loss)

        pred = tf.round(tf.nn.sigmoid(logit)).eval({xplaceholder: np.array(X_test), yplaceholder: np.array(y_test)})
        print(pred)
        f1 = f1_score(np.array(y_test), pred, average='macro')
        accuracy = accuracy_score(np.array(y_test), pred)
        recall = recall_score(y_true=np.array(y_test), y_pred=pred)
        precision = precision_score(y_true=np.array(y_test), y_pred=pred)
        print("F1 Score:", f1)
        print("Accuracy Score:", accuracy)
        print("Recall:", recall)
        print("Precision:", precision)


def main():
    read_data("data2.csv")


if __name__ == '__main__':
    main()

Dataset: col1: int col2: float col3: float col4: bool (представлен 0 или 1)

Система: OS X El Capitan 10.11.6 Python 3.6 Tensorflow-GPU 1.1

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

...