Я изучаю, как обращаться с 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). Возможно, эта проблема в # классов.