import numpy as np
import tensorflow as tf
def xavier_init(fan_in, fan_out, constant=1):
low = -constant * np.sqrt(6.0 / (fan_in + fan_out))
high = constant * np.sqrt(6.0 / (fan_in + fan_out))
return tf.random_uniform((fan_in, fan_out), minval=low, maxval=high,
dtype=tf.float32)
class AdditiveGaussionNoiseAutoencoder(object):
def __init__(self, n_input, n_hidden, transfer_function=tf.nn.relu,
optimizer=tf.train.AdamOptimizer(), scale=0.1):
self.n_input = n_input
self.n_hidden = n_hidden
self.transfer = transfer_function
self.scale = tf.placeholder(tf.float32)
self.training_scale = scale
network_weights = self._initialize_weights()
self.weights = network_weights
self.x = tf.placeholder(tf.float32, [None, self.n_input])
self.hidden = self.transfer(tf.add(tf.matmul(
self.x + scale * tf.random_normal((n_input,)),
self.weights['w1']), self.weights['b1']))
self.reconstruction = tf.add(tf.matmul(self.hidden,
self.weights['w2']), self.weights['b2'])
self.cost = tf.sqrt(tf.reduce_mean(tf.pow(tf.subtract(
self.reconstruction, self.x), 2.0)))
self.optimizer = optimizer.minimize(self.cost)
init = tf.global_variables_initializer()
self.sess = tf.Session()
self.sess.run(init)
def _initialize_weights(self):
all_weights = dict()
all_weights['w1'] = tf.Variable(xavier_init(self.n_input, self.n_hidden))
all_weights['b1'] = tf.Variable(tf.zeros([self.n_hidden], dtype=tf.float32))
all_weights['w2'] = tf.Variable(tf.zeros([self.n_hidden, self.n_input], dtype=tf.float32))
all_weights['b2'] = tf.Variable(tf.zeros([self.n_input], dtype=tf.float32))
return all_weights
def partial_fit(self, X):
cost, opt = self.sess.run((self.cost, self.optimizer),
feed_dict={self.x: X, self.scale: self.training_scale})
return cost
def calc_total_cost(self, X):
return self.sess.run(self.cost,
feed_dict={self.x: X, self.scale: self.training_scale})
def transform(self, X):
return self.sess.run(self.hidden,
feed_dict={self.x: X, self.scale: self.training_scale})
def generate(self, hidden=None):
if hidden is None:
hidden = np.random.normal(size=self.weights['b1'])
return self.sess.run(self.reconstruction, feed_dict={self.hidden: hidden})
def reconstruct(self, X):
return self.sess.run(self.reconstruction, feed_dict={self.x: X, self.scale: self.training_scale})
def getweights(self):
return self.sess.run(self.weights['w1'])
def getbiases(self):
return self.sess.run(self.weights['b1'])
import numpy as np
import tensorflow as tf
from DSAE import AdditiveGaussionNoiseAutoencoder
import xlrd
import sklearn.preprocessing as prep
#数据读取,可转换为csv文件,好处理,参见ConvertData
train_input = "/Users/Patrick/Desktop/traffic_data/train_500010092_input.xls"
train_output = "/Users/Patrick/Desktop/traffic_data/train_500010092_output.xls"
test_input = "/Users/Patrick/Desktop/traffic_data/test_500010092_input.xls"
test_output = "/Users/Patrick/Desktop/traffic_data/test_500010092_output.xls"
book_train_input = xlrd.open_workbook(train_input, encoding_override='utf-8')
book_train_output = xlrd.open_workbook(train_output, encoding_override='utf-8')
book_test_input = xlrd.open_workbook(test_input, encoding_override='utf-8')
book_test_output = xlrd.open_workbook(test_output, encoding_override='utf-8')
sheet_train_input = book_train_input.sheet_by_index(0)
sheet_train_output = book_train_output.sheet_by_index(0)
sheet_test_input = book_test_input.sheet_by_index(0)
sheet_test_output = book_test_output.sheet_by_index(0)
data_train_input = np.asarray([sheet_train_input.row_values(i)
for i in range(2, sheet_train_input.nrows)])
data_train_output = np.asarray(([sheet_train_output.row_values(i)
for i in range(2, sheet_train_output.ncols)]))
data_test_input = np.asarray([sheet_test_input.row_values(i)
for i in range(2, sheet_test_input.nrows)])
data_test_output = np.asarray(([sheet_test_output.row_values(i)
for i in range(2, sheet_test_output.ncols)]))
def standard_scale(X_train, X_test):
preprocessor=prep.StandardScaler().fit(X_train)
X_train=preprocessor.transform(X_train)
X_test=preprocessor.transform(X_test)
return X_train, X_test
X_train, X_test = standard_scale(data_train_input, data_test_input)
def get_block_form_data(data, batch_size, k):
#start_index =0
start_index = k * batch_size
return data[start_index:(start_index+batch_size)]
training_epochs = 20
batch_size = 288
n_samples = sheet_test_output.nrows
display_step = 1
stack_size = 3
hidden_size = [10, 8, 10]
sdae = []
for i in range(stack_size):
if i == 0:
ae = AdditiveGaussionNoiseAutoencoder(n_input=12, n_hidden=hidden_size[i], transfer_function=tf.nn.relu, optimizer=tf.train.AdamOptimizer(learning_rate=0.01), scale=0.01)
ae._initialize_weights()
sdae.append(ae)
else:
ae = AdditiveGaussionNoiseAutoencoder(n_input=hidden_size[i-1],
n_hidden=hidden_size[i],
transfer_function=tf.nn.relu,
optimizer=tf.train.AdamOptimizer(learning_rate=0.01),
scale=0.01)
ae._initialize_weights()
sdae.append(ae)
W = []
b = []
hidden_feacture = []
X_train = np.array([0])
for j in range(stack_size):
if j == 0:
X_train = data_train_input
X_test = data_test_input
else:
X_train_pre = X_train
X_train = sdae[j-1].transform(X_train_pre)
print(X_train.shape)
hidden_feacture.append(X_train)
for epoch in range(training_epochs):
avg_cost = 0.
total_batch = int(n_samples / batch_size)
for i in range(total_batch):
batch_xs = get_block_form_data(X_train, batch_size, i)
cost = sdae[j].partial_fit(batch_xs)
avg_cost += cost / n_samples * batch_size
if epoch % display_step == 0:
print("Epoch:", '%04d' % (epoch + 1), "cost=",
"{:.9f}".format(avg_cost))
weight = sdae[j].getweights()
W.append(weight)
print(np.shape(W))
b.append(sdae[j].getbiases())
print(np.shape(b))
然后报错如下:
File "/Applications/PyCharm.app/Contents/helpers/pydev/pydev_run_in_console.py", line 53, in run_file
pydev_imports.execfile(file, globals, locals) # execute the script
File "/Applications/PyCharm.app/Contents/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "/Users/Patrick/PycharmProjects/DSAE-SVM/DLmain.py", line 80, in <module>
X_train = sdae[j-1].transform(X_train_pre)
File "/Users/Patrick/PycharmProjects/DSAE-SVM/DSAE.py", line 70, in transform
feed_dict={self.x: X, self.scale: self.training_scale})
File "/Users/Patrick/anaconda3/envs/tensorflow/lib/python3.4/site-packages/tensorflow/python/client/session.py", line 905, in run
run_metadata_ptr)
File "/Users/Patrick/anaconda3/envs/tensorflow/lib/python3.4/site-packages/tensorflow/python/client/session.py", line 1113, in _run
str(subfeed_t.get_shape())))
ValueError: Cannot feed value of shape (18143, 3) for Tensor 'Placeholder_1:0', which has shape '(?, 12)'
PyDev console: starting.
Python 3.4.5 |Continuum Analytics, Inc.| (default, Jul 2 2016, 17:47:57)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
实在是不知道该如何修改palceholder的shape 求帮忙讲解