Предсказать следующее число в массиве с помощью Tensorflow Python - PullRequest
0 голосов
/ 17 января 2019

Вот сделка, я получил скрипт на Python, и в качестве входных данных у меня есть 2 массива, один имеет значения функции (x_train), другой имеет время измеренных значений (y_train).Сценарий вызывается из Java, и параметры выглядят так:

a)

[38.0, 45.0, 42.0, 35.0, 41.0, 45.0, 69.0, 35.0, 33.0, 34.0]
[85.0, 86.0, 87.0, 88.0, 89.0, 90.0, 91.0, 92.0, 93.0, 94.0]

b)

[38.0, 45.0, 42.0, 35.0, 41.0, 45.0, 69.0, 35.0, 33.0, 34.0]
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]

c)

[38.0, 45.0, 42.0, 35.0, 41.0, 45.0, 69.0, 35.0, 33.0, 34.0]
[1.562571106116E12, 1.562657506116E12, 1.562743906116E12, 1.562830306116E12, 1.562916706116E12, 1.563003106116E12, 1.563089506116E12, 1.563175906116E12, 1.563262306116E12, 1.563348706116E12]

Все это мне нужно, чтобы сделать функцию 9 класса и предсказать следующий элемент массива, то есть коэффициенты функций (a9, a8, a7, a6, a5, a4, a3, a2, a1,a0 и потери), а затем вычислите с ними 11-е число.

Выгода в том, что когда я использую опцию (a) и (c), я получаю NAN для всех коэффициентов в результате процесса, но когда я использую опцию (b), я получаю НЕКОТОРЫЕ результаты (это вопрос параметров запуска функции, к которым я вернусь позже), и с ними я могу работать.

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

Вот весь сценарий Python:

import tensorflow  
import sys

s1 = sys.stdin.readline().strip()
s2 = sys.stdin.readline().strip()
s3 = sys.stdin.readline().strip()

#Trainable Parameters  
startParam0 = 2 
startParam1 = 0.1
startParam2 = 0.1
startParam3 = 0.00016
startParam4 = 0.0000002
startParam5 = 0.0000000000238
startParam6 = 0.000000003202899 
startParam7 = 0.000000000000041
startParam8 = 0.000000000000001
startParam9 = 0.0000000000000001

a0 = tensorflow.Variable([startParam0], dtype=tensorflow.float32)  
a1 = tensorflow.Variable([startParam1], dtype=tensorflow.float32) 
a2 = tensorflow.Variable([startParam2], dtype=tensorflow.float32) 
a3 = tensorflow.Variable([startParam3], dtype=tensorflow.float32)  
a4 = tensorflow.Variable([startParam4], dtype=tensorflow.float32)  
a5 = tensorflow.Variable([startParam5], dtype=tensorflow.float32)  
a6 = tensorflow.Variable([startParam6], dtype=tensorflow.float32)  
a7 = tensorflow.Variable([startParam7], dtype=tensorflow.float32)  
a8 = tensorflow.Variable([startParam8], dtype=tensorflow.float32)  
a9 = tensorflow.Variable([startParam9], dtype=tensorflow.float32)  
a10 = tensorflow.Variable([startParam2], dtype=tensorflow.float32)  
a11 = tensorflow.Variable([startParam3], dtype=tensorflow.float32) 
a12 = tensorflow.Variable([startParam4], dtype=tensorflow.float32)  
a13 = tensorflow.Variable([startParam4], dtype=tensorflow.float32)  
a14 = tensorflow.Variable([startParam3], dtype=tensorflow.float32)  
a15 = tensorflow.Variable([startParam2], dtype=tensorflow.float32)  
a16 = tensorflow.Variable([startParam1], dtype=tensorflow.float32)  
a17 = tensorflow.Variable([startParam1], dtype=tensorflow.float32)  
a18 = tensorflow.Variable([startParam2], dtype=tensorflow.float32)  
a19 = tensorflow.Variable([startParam3], dtype=tensorflow.float32)  

variableArray = [a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19]

curr_a0 = 0
curr_a1 = 0
curr_a2 = 0
curr_a3 = 0
curr_a4 = 0
curr_a5 = 0
curr_a6 = 0
curr_a7 = 0
curr_a8 = 0
curr_a9 = 0
curr_a10 = 0
curr_a11 = 0
curr_a12 = 0
curr_a13 = 0
curr_a14 = 0
curr_a15 = 0
curr_a16 = 0
curr_a17 = 0
curr_a18 = 0
curr_a19 = 0
curr_loss = 0

outputArray = [curr_a0, curr_a1, curr_a2, curr_a3, curr_a4, curr_a5, curr_a6, curr_a7, curr_a8, curr_a9, curr_a10, curr_a11, curr_a12, curr_a13, curr_a14, curr_a15, curr_a16, curr_a17, curr_a18, curr_a19]

#Training Data (inputs/outputs)  
x = tensorflow.placeholder(dtype=tensorflow.float32)  
y = tensorflow.placeholder(dtype=tensorflow.float32)  

# recive parameters from java
lines = s1.split("[")[1].split("]")[0].split(",");
y_train = []
counter = 0
for l in lines:
    s = l.strip()
    y_train.append(float(l.strip()))
    counter = counter + 1

lines = s2.split("[")[1].split("]")[0].split(",");
x_train = []
counter = 0
for l in lines:
    s = l.strip()
    x_train.append(float(s))
    counter = counter +1

grade = int(s3.strip());
linear_model = tensorflow.Variable([0], dtype=tensorflow.float32)  
sessionInput = [ None for k in range( grade + 2 ) ]
sessionOutput = [ None for k in range( grade + 2 ) ]

for i in range(grade + 1):
    s = 1
    for j in range (i): 
        s = s * x 
    linear_model = linear_model + variableArray[i] * s
    sessionInput[i] = variableArray[grade - i] 
    sessionOutput[i] = outputArray[grade - i]

#Linear Regression Loss Function - sum of the squares  
squared_deltas = tensorflow.square(linear_model - y_train)  
loss = tensorflow.reduce_sum(squared_deltas) 
curr_loss = 0
sessionInput[grade+1] = loss
sessionOutput[grade+1] = curr_loss

#Gradient descent optimizer  
#optimizer = tensorflow.train.GradientDescentOptimizer(learning_rate=0.01)  
optimizer = tensorflow.train.AdamOptimizer(learning_rate=0.25)  
train = optimizer.minimize(loss=loss)  

#Creating a session 
sess = tensorflow.Session()  

writer = tensorflow.summary.FileWriter("/tmp/log/", sess.graph)  

#Initializing variables  
init = tensorflow.global_variables_initializer()  
sess.run(init)  

#Optimizing the parameters  
for i in range(10000):  
    sess.run(train, feed_dict={x: x_train, y: y_train})  

#Print the parameters and loss  
outputArray = sess.run(sessionInput, {x: x_train, y: y_train})  
s = ""
for i in range(0, grade + 2):
    s = s + str(outputArray[i])
    if not(i == grade + 1):
        s = s + ","

print(s)  

writer.close()  

sess.close()  

И код Java:

BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
PrintWriter stdOutput = new PrintWriter(new OutputStreamWriter(process.getOutputStream()));

System.out.println(values); //y_train
stdOutput.println(values);
stdOutput.flush();

System.out.println(dates); //x_train
stdOutput.println(dates);
stdOutput.flush();

stdOutput.println(grade); //grade=9
stdOutput.flush();

// for reading the ouput from stream
String s1 = null;

List<Double> coefList = new ArrayList<Double>();

while ((s1 = stdInput.readLine()) != null) {
    System.out.println(s1);
    if (s1.indexOf("\\[") == -1) {
        Integer n = s1.split("\\[").length;
        if (n == grade + 2) { 
            try {
                for(int i = 0; i < grade+1; i++){
                    coefList.add( Double.parseDouble(s1.split("\\[")[1 + i].split("\\]")[0]));
                }
            } catch(NumberFormatException E) {
                System.err.println("Received NAN instead of a number for the parameters!");
            }
        }
    }
}

В конце он печатает коэффициенты.

В варианте (b) результат таков:

[4.3143527e-06],[-1.3367743e-05],[5.2168118e-05],[0.00026263],[0.0007228],[0.00161756],[0.00351851],[0.10692083],[0.11532306],[2.0412211],17321398.0

и прогноз для 11-го числаr: 58.70016770335398 (что кажется нормальным)

В варианте (a) и (c) результат таков: [nan], [nan], [nan], [nan], [nan], [nan], [nan], [nan], [nan], [nan], nan

Нет ошибок!Пожалуйста, помогите мне решить это ... потому что мне нужны параметры в миллисекундах (как в варианте (с))

Дайте мне знать, если вам нужно что-то еще.Можно рассмотреть любые варианты, даже снизить оценку функции или что-то еще, если результат остается в пределах диапазона параметров.

Спасибо.

...