mlp_tf.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import tensorflow as tf
  2. import numpy as np
  3. def get_one_hot(targets, nb_classes):
  4. res = np.eye(nb_classes)[np.array(targets).reshape(-1)]
  5. return res.reshape(list(targets.shape)+[nb_classes])
  6. data_slice = 5
  7. def load():
  8. raw_data = np.loadtxt('car.data', delimiter=',')
  9. data_size = len(raw_data)
  10. np.random.shuffle(raw_data)
  11. data = np.array_split(raw_data, data_slice)
  12. ret = [np.split(i, [1,], axis=1) for i in data]
  13. return ret
  14. # learning params
  15. learning_rate = 0.1
  16. training_epochs = 400
  17. batch_size = 4
  18. # network params
  19. n_hidden_1 = 32
  20. n_hidden_2 = 16
  21. n_input = 6
  22. n_classses = 4
  23. data_pieces = load()
  24. val_idx = 0
  25. train_label = np.concatenate(
  26. [data_pieces[i][0] for i in list(range(data_slice))[:val_idx] + list(range(data_slice))[val_idx+1:]]
  27. )
  28. # train_label = train_label - 1
  29. train_label = train_label.flatten().astype(int)
  30. train_label = get_one_hot(train_label, n_classses)
  31. train_data = np.concatenate(
  32. [data_pieces[i][1] for i in list(range(data_slice))[:val_idx] + list(range(data_slice))[val_idx+1:]]
  33. )
  34. val_label = data_pieces[val_idx][0]
  35. val_data = data_pieces[val_idx][1]
  36. # val_label = val_label - 1
  37. val_label = val_label.flatten().astype(int)
  38. val_label = get_one_hot(val_label, n_classses)
  39. # model
  40. x = tf.placeholder("float", [None, n_input])
  41. y = tf.placeholder("float", [None, n_classses])
  42. def mlp(_X, _weights, _biases):
  43. layer1 = tf.nn.sigmoid(tf.add(tf.matmul(_X, _weights['h1']), _biases['b1']))
  44. layer2 = tf.nn.sigmoid(tf.add(tf.matmul(layer1, _weights['h2']), _biases['b2']))
  45. # layer2 = tf.nn.sigmoid(tf.add(tf.matmul(_X, _weights['h2']), _biases['b2']))
  46. return tf.matmul(layer2, _weights['out']) + _biases['out']
  47. weights = {
  48. 'h1' : tf.Variable(tf.random_normal([n_input, n_hidden_1])),
  49. 'h2' : tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
  50. 'out' : tf.Variable(tf.random_normal([n_hidden_2, n_classses]))
  51. }
  52. biases = {
  53. 'b1' : tf.Variable(tf.random_normal([n_hidden_1])),
  54. 'b2' : tf.Variable(tf.random_normal([n_hidden_2])),
  55. 'out' : tf.Variable(tf.random_normal([n_classses]))
  56. }
  57. pred = mlp(x, weights, biases)
  58. cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=y, logits=pred))
  59. optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
  60. init = tf.global_variables_initializer()
  61. train_data_batches = np.array_split(train_data, len(train_data) // batch_size)
  62. train_label_batches = np.array_split(train_label, len(train_label) // batch_size)
  63. correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
  64. with tf.Session() as sess:
  65. sess.run(init)
  66. #Training cycle
  67. for epoch in range(training_epochs):
  68. for i, j in zip(train_data_batches, train_label_batches):
  69. sess.run(optimizer, feed_dict={x: i, y: j})
  70. accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
  71. if (accuracy.eval({x: train_data, y: train_label}) > 0.95):
  72. print(epoch)
  73. if (accuracy.eval({x: train_data, y: train_label}) > 0.99):
  74. print(epoch)
  75. print("Val Accuracy:", accuracy.eval({x: val_data, y: val_label}))
  76. exit()
  77. #print("Train Accuracy:", accuracy.eval({x: train_data, y: train_label}))
  78. #