用 Tensorflow 找出隐藏的公式(Handling Numeric I/O)
Find the hidden formula with Tensorflow (Handling Numeric I/O)
我有一个标准的 CSV 文件,其中有一堆行,所有行都有 60 列随机数(浮点数)。在第 61-63 列上,我有数字(又是浮点数),它们是前 60 列的某些函数。
对于第一个“输出”列,我将前 20 列的总和乘以接下来的 40 列的总和,然后对接下来的两个输出列进行其他任意变化。我希望我的机器学习算法能够理解这种公式关系并预测三个输出数字。
这是我读取数据的方式
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
import pandas as pd
from sklearn.utils import shuffle
from sklearn.model_selection import train_test_split
def read_data():
rd = pd.read_csv(file_path)
x = rd[rd.columns[0:60]].values
y = rd[rd.columns[60:63]].values
X = x.astype(float) #just making sure we have the right dtype
Y = y.astype(float)
print(X.shape)
print(Y.shape)
return (X, Y)
X, Y = read_data()
然后我将数据洗牌并拆分为训练集和测试集
X, Y = shuffle(X, Y, random_state=1)
train_x, test_x, train_y, test_y = train_test_split(X, Y, test_size=0.25, random_state=117)
接下来我定义模型、权重和偏差
n_dim = X.shape[1]
print("n_dim", n_dim)
n_output = Y.shape[1]
print("n_output", n_output)
n_hidden_1 = 100
n_hidden_2 = 75
n_hidden_3 = 50
n_hidden_4 = 50
x = tf.placeholder(tf.float32, [None, n_dim])
W = tf.Variable(tf.zeros([n_dim, n_output]))
b = tf.Variable(tf.zeros([n_output]))
y = tf.placeholder(tf.float32, [None, n_output])
def layered_model(x, weights, biases):
# 4 hidden layers with sigmoid and relu
layer_1 = tf.add(tf.matmul(x, weights['w1']), biases['b1'])
layer_1 = tf.nn.sigmoid(layer_1)
layer_2 = tf.add(tf.matmul(layer_1, weights['w2']), biases['b2'])
layer_2 = tf.nn.sigmoid(layer_2)
layer_3 = tf.add(tf.matmul(layer_2, weights['w3']), biases['b3'])
layer_3 = tf.nn.sigmoid(layer_3)
layer_4 = tf.add(tf.matmul(layer_3, weights['w4']), biases['b4'])
layer_4 = tf.nn.relu(layer_4)
out_layer = tf.matmul(layer_4, weights['out']) + biases['out']
return out_layer
weights = {
'w1': tf.Variable(tf.truncated_normal([n_dim, n_hidden_1])),
'w2': tf.Variable(tf.truncated_normal([n_hidden_1, n_hidden_2])),
'w3': tf.Variable(tf.truncated_normal([n_hidden_2, n_hidden_3])),
'w4': tf.Variable(tf.truncated_normal([n_hidden_3, n_hidden_4])),
'out': tf.Variable(tf.truncated_normal([n_hidden_4, n_output]))
}
biases = {
'b1': tf.Variable(tf.truncated_normal([n_hidden_1])),
'b2': tf.Variable(tf.truncated_normal([n_hidden_2])),
'b3': tf.Variable(tf.truncated_normal([n_hidden_3])),
'b4': tf.Variable(tf.truncated_normal([n_hidden_4])),
'out': tf.Variable(tf.truncated_normal([n_output]))
}
如何将我的数据输入成本函数,然后将其用于我的时代?我能找到的所有教程都是针对标记数据集的,将内容放入 "buckets"。而这是一个纯数字 input/output。
我能找到的唯一信息是数字成本函数通常使用平方误差方法,feed_dict 是必要的:
cost_function = tf.reduce_mean(tf.square(prediction - actual))
我设法得到它 "working"。然而,成本函数被最小化为一个接近所有训练结果的数字,然后它总是 return 这个数字,无论输入如何。不是真正意义上的"learning"。
我发现我必须先将我的问题分解为分类任务,然后机器学习才能做出有用的预测。
我有一个标准的 CSV 文件,其中有一堆行,所有行都有 60 列随机数(浮点数)。在第 61-63 列上,我有数字(又是浮点数),它们是前 60 列的某些函数。
对于第一个“输出”列,我将前 20 列的总和乘以接下来的 40 列的总和,然后对接下来的两个输出列进行其他任意变化。我希望我的机器学习算法能够理解这种公式关系并预测三个输出数字。
这是我读取数据的方式
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
import pandas as pd
from sklearn.utils import shuffle
from sklearn.model_selection import train_test_split
def read_data():
rd = pd.read_csv(file_path)
x = rd[rd.columns[0:60]].values
y = rd[rd.columns[60:63]].values
X = x.astype(float) #just making sure we have the right dtype
Y = y.astype(float)
print(X.shape)
print(Y.shape)
return (X, Y)
X, Y = read_data()
然后我将数据洗牌并拆分为训练集和测试集
X, Y = shuffle(X, Y, random_state=1)
train_x, test_x, train_y, test_y = train_test_split(X, Y, test_size=0.25, random_state=117)
接下来我定义模型、权重和偏差
n_dim = X.shape[1]
print("n_dim", n_dim)
n_output = Y.shape[1]
print("n_output", n_output)
n_hidden_1 = 100
n_hidden_2 = 75
n_hidden_3 = 50
n_hidden_4 = 50
x = tf.placeholder(tf.float32, [None, n_dim])
W = tf.Variable(tf.zeros([n_dim, n_output]))
b = tf.Variable(tf.zeros([n_output]))
y = tf.placeholder(tf.float32, [None, n_output])
def layered_model(x, weights, biases):
# 4 hidden layers with sigmoid and relu
layer_1 = tf.add(tf.matmul(x, weights['w1']), biases['b1'])
layer_1 = tf.nn.sigmoid(layer_1)
layer_2 = tf.add(tf.matmul(layer_1, weights['w2']), biases['b2'])
layer_2 = tf.nn.sigmoid(layer_2)
layer_3 = tf.add(tf.matmul(layer_2, weights['w3']), biases['b3'])
layer_3 = tf.nn.sigmoid(layer_3)
layer_4 = tf.add(tf.matmul(layer_3, weights['w4']), biases['b4'])
layer_4 = tf.nn.relu(layer_4)
out_layer = tf.matmul(layer_4, weights['out']) + biases['out']
return out_layer
weights = {
'w1': tf.Variable(tf.truncated_normal([n_dim, n_hidden_1])),
'w2': tf.Variable(tf.truncated_normal([n_hidden_1, n_hidden_2])),
'w3': tf.Variable(tf.truncated_normal([n_hidden_2, n_hidden_3])),
'w4': tf.Variable(tf.truncated_normal([n_hidden_3, n_hidden_4])),
'out': tf.Variable(tf.truncated_normal([n_hidden_4, n_output]))
}
biases = {
'b1': tf.Variable(tf.truncated_normal([n_hidden_1])),
'b2': tf.Variable(tf.truncated_normal([n_hidden_2])),
'b3': tf.Variable(tf.truncated_normal([n_hidden_3])),
'b4': tf.Variable(tf.truncated_normal([n_hidden_4])),
'out': tf.Variable(tf.truncated_normal([n_output]))
}
如何将我的数据输入成本函数,然后将其用于我的时代?我能找到的所有教程都是针对标记数据集的,将内容放入 "buckets"。而这是一个纯数字 input/output。
我能找到的唯一信息是数字成本函数通常使用平方误差方法,feed_dict 是必要的:
cost_function = tf.reduce_mean(tf.square(prediction - actual))
我设法得到它 "working"。然而,成本函数被最小化为一个接近所有训练结果的数字,然后它总是 return 这个数字,无论输入如何。不是真正意义上的"learning"。
我发现我必须先将我的问题分解为分类任务,然后机器学习才能做出有用的预测。