मैं ML और TensorFlow के लिए नया हूं (मैंने कुछ घंटों पहले शुरू किया था), और मैं एक समय श्रृंखला में अगले कुछ डेटा बिंदुओं की भविष्यवाणी करने के लिए इसका उपयोग करने की कोशिश कर रहा हूं। मैं अपना इनपुट ले रहा हूं और इसके साथ यह कर रहा हूं:
/----------- x ------------\
.-------------------------------.
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
'-------------------------------'
\----------- y ------------/
मैंने जो सोचा था कि मैं इनपुट डेटा के रूप में x का उपयोग कर रहा हूं और उस इनपुट के लिए वांछित आउटपुट के रूप में y का उपयोग कर रहा हूं , ताकि 0-6 मुझे 1-7 (विशेष रूप से 7) मिल सके। हालाँकि, जब मैं इनपुट के रूप में x के साथ अपना ग्राफ चलाता हूं, तो मुझे जो मिलता है वह एक भविष्यवाणी है जो y की तुलना में x की तरह दिखता है ।
यहाँ कोड है ( इस पोस्ट और इस पोस्ट के आधार पर ):
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plot
import pandas as pd
import csv
def load_data_points(filename):
print("Opening CSV file")
with open(filename) as csvfile:
print("Creating CSV reader")
reader = csv.reader(csvfile)
print("Reading CSV")
return [[[float(p)] for p in row] for row in reader]
flatten = lambda l: [item for sublist in l for item in sublist]
data_points = load_data_points('dataset.csv')
print("Loaded")
prediction_size = 10
num_test_rows = 1
num_data_rows = len(data_points) - num_test_rows
row_size = len(data_points[0]) - prediction_size
# Training data
data_rows = data_points[:-num_test_rows]
x_data_points = np.array([row[:-prediction_size] for row in data_rows]).reshape([-1, row_size, 1])
y_data_points = np.array([row[prediction_size:] for row in data_rows]).reshape([-1, row_size, 1])
# Test data
test_rows = data_points[-num_test_rows:]
x_test_points = np.array([[data_points[0][:-prediction_size]]]).reshape([-1, row_size, 1])
y_test_points = np.array([[data_points[0][prediction_size:]]]).reshape([-1, row_size, 1])
tf.reset_default_graph()
num_hidden = 100
x = tf.placeholder(tf.float32, [None, row_size, 1])
y = tf.placeholder(tf.float32, [None, row_size, 1])
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=num_hidden, activation=tf.nn.relu)
rnn_outputs, _ = tf.nn.dynamic_rnn(basic_cell, x, dtype=tf.float32)
learning_rate = 0.001
stacked_rnn_outputs = tf.reshape(rnn_outputs, [-1, num_hidden])
stacked_outputs = tf.layers.dense(stacked_rnn_outputs, 1)
outputs = tf.reshape(stacked_outputs, [-1, row_size, 1])
loss = tf.reduce_sum(tf.square(outputs - y))
optimizer = tf.train.AdamOptimizer(learning_rate)
training_op = optimizer.minimize(loss)
init = tf.global_variables_initializer()
iterations = 1000
with tf.Session() as sess:
init.run()
for ep in range(iterations):
sess.run(training_op, feed_dict={x: x_data_points, y: y_data_points})
if ep % 100 == 0:
mse = loss.eval(feed_dict={x: x_data_points, y: y_data_points})
print(ep, "\tMSE:", mse)
y_pred = sess.run(stacked_outputs, feed_dict={x: x_test_points})
plot.rcParams["figure.figsize"] = (20, 10)
plot.title("Actual vs Predicted")
plot.plot(pd.Series(np.ravel(x_test_points)), 'g:', markersize=2, label="X")
plot.plot(pd.Series(np.ravel(y_test_points)), 'b--', markersize=2, label="Y")
plot.plot(pd.Series(np.ravel(y_pred)), 'r-', markersize=2, label="Predicted")
plot.legend(loc='upper left')
plot.xlabel("Time periods")
plot.tick_params(
axis='y',
which='both',
left='off',
right='off',
labelleft='off')
plot.show()
नीचे दिए गए ग्राफ़ में दिखाया गया परिणाम एक पूर्वानुमान है जो x का अनुसरण करता है , बजाय बाईं ओर स्थानांतरित होने के (और दाईं ओर अनुमानित बिंदुओं सहित) क्योंकि यह y जैसा दिखना चाहिए । स्पष्ट रूप से इच्छा लाल रेखा के लिए संभव है कि नीले रंग के करीब हो।
मुझे नहीं पता कि मैं यह सब क्या कर रहा हूं, इसलिए कृपया ELI5 करें।
ओह, इसके अलावा, मेरे डेटा पॉइंट काफी कम संख्या (0.0001 का क्रम) हैं। अगर मैं उन्हें गुणा नहीं करूं, तो मान लीजिए, 1000000, परिणाम इतने छोटे हैं कि चार्ट के नीचे लाल रेखा लगभग सपाट है। क्यों? मैं अनुमान लगा रहा हूं कि यह फिटनेस फंक्शन में स्क्वेरिंग के कारण है। क्या उपयोग करने से पहले डेटा को सामान्य किया जाना चाहिए, और यदि हां, तो क्या करना है? 0-1? अगर मैं उपयोग करता हूं:
normalized_points = [(p - min_point) / (max_point - min_point) for p in data_points]
जैसे-जैसे यह आगे बढ़ता है, मेरी भविष्यवाणी में बेतहाशा उतार-चढ़ाव आता है:
संपादित करें: मैं गूंगा हो रहा हूं और केवल एक उदाहरण से सीख रहा हूं कि 500 नहीं, मैं नहीं हूं? तो मुझे इसे कई 500-बिंदु नमूने देने चाहिए, है ना?