基于RNN神经网络和BPTT算法实现的简单二进制计数器
2016-08-03 14:48
691 查看
import argparse
import time
import numpy as np
import copy
np.random.seed(0)
weightMat = [128, 64, 32, 16, 8, 4, 2, 1]
def sigmoid(x):
output = 1 / (1 + np.exp(-x))
return output
def sigmoid_derivative_value_byOutPut(output):
return output * (1 - output)
def binary2int(input):
if(len(input) != binary_dim):
print "input length is not " + str(binary_dim)
return -1
num = 0
for i in range(binary_dim):
num += input[i] * weightMat[i]
return num
int2binary = {}
binary_dim = 8
largest_number = pow(2,binary_dim)
binary = np.unpackbits(np.array([range(largest_number)], dtype = np.uint8).T, axis = 1)
for i in range(largest_number):
int2binary[i] = binary[i]
alpha = 0.1
input_dim = 2
hidden_dim = 16
output_dim = 1
MaxIterator = 20000
synapse_0 = 2 * np.random.random((input_dim, hidden_dim)) - 1
synapse_1 = 2 * np.random.random((hidden_dim, output_dim)) - 1
synapse_h = 2 * np.random.random((hidden_dim, hidden_dim)) - 1
synapse_0_update = np.zeros_like(synapse_0)
synapse_1_update = np.zeros_like(synapse_1)
synapse_h_update = np.zeros_like(synapse_h)
#train logic
for j in range(MaxIterator):
a_int = np.random.randint(largest_number / 2)
a = int2binary[a_int]
# print "a: " + str(a_int)
b_int = np.random.randint(largest_number / 2)
b = int2binary[b_int]
# print "b: " + str(b_int)
c_int = a_int + b_int
c = int2binary[c_int]
d = np.zeros_like(c)
overallError = 0
layer_2_deltas = list()
layer_1_values = list()
layer_1_values.append(np.zeros(hidden_dim))
for position in range(binary_dim):
#generate input and output
x = np.array([[a[binary_dim - position - 1], b[binary_dim - position - 1]]])
y = np.array([[c[binary_dim - position - 1]]]).T
#hidden layer out value : layer_1
layer_1 = sigmoid(np.dot(x, synapse_0) + np.dot(layer_1_values[-1], synapse_h))
layer_2 = sigmoid(np.dot(layer_1, synapse_1))
layer_2_error = y - layer_2
layer_2_delta = layer_2_error * sigmoid_derivative_value_byOutPut(layer_2)
layer_2_deltas.append(layer_2_delta)
overallError += np.abs(layer_2_error[0])
d[binary_dim - position - 1] = np.round(layer_2[0][0])
layer_1_values.append(copy.deepcopy(layer_1))
future_layer_1_delta = np.zeros(hidden_dim)
for position in range(binary_dim):
x = np.array([[a[position], b[position]]])
layer_1 = layer_1_values[-position-1]
pre_layer_1 = layer_1_values[-position-2]
layer_2_delta = layer_2_deltas[-position-1]
layer_1_delta = (future_layer_1_delta.dot(synapse_h.T) + layer_2_delta.dot(synapse_1.T)) * sigmoid_derivative_value_byOutPut(layer_1)
synapse_1_update += np.atleast_2d(layer_1).T.dot(layer_2_delta)
synapse_0_update += x.T.dot(layer_1_delta)
synapse_h_update += np.atleast_2d(pre_layer_1).T.dot(layer_1_delta)
future_layer_1_delta = layer_1_delta
synapse_0 += synapse_0_update * alpha
synapse_1 += synapse_1_update * alpha
synapse_h += synapse_h_update * alpha
synapse_0_update *= 0
synapse_1_update *= 0
synapse_h_update *= 0
#print out rnn train progress
if(j % 1000 == 0):
print "iterator : " + str(j)
print "Error: " + str(overallError)
print "Predict out: " + str(d) + " " + str(binary2int(d))
print "True answer: " + str(c) + " " + str(c_int)
out = 0
for index,x in enumerate(reversed(d)):
out += x * pow(2, index)
print str(a_int) + " + " + str(b_int) + " = " + str(out)
print "........................"
#if __name__ == '__main__':
import time
import numpy as np
import copy
np.random.seed(0)
weightMat = [128, 64, 32, 16, 8, 4, 2, 1]
def sigmoid(x):
output = 1 / (1 + np.exp(-x))
return output
def sigmoid_derivative_value_byOutPut(output):
return output * (1 - output)
def binary2int(input):
if(len(input) != binary_dim):
print "input length is not " + str(binary_dim)
return -1
num = 0
for i in range(binary_dim):
num += input[i] * weightMat[i]
return num
int2binary = {}
binary_dim = 8
largest_number = pow(2,binary_dim)
binary = np.unpackbits(np.array([range(largest_number)], dtype = np.uint8).T, axis = 1)
for i in range(largest_number):
int2binary[i] = binary[i]
alpha = 0.1
input_dim = 2
hidden_dim = 16
output_dim = 1
MaxIterator = 20000
synapse_0 = 2 * np.random.random((input_dim, hidden_dim)) - 1
synapse_1 = 2 * np.random.random((hidden_dim, output_dim)) - 1
synapse_h = 2 * np.random.random((hidden_dim, hidden_dim)) - 1
synapse_0_update = np.zeros_like(synapse_0)
synapse_1_update = np.zeros_like(synapse_1)
synapse_h_update = np.zeros_like(synapse_h)
#train logic
for j in range(MaxIterator):
a_int = np.random.randint(largest_number / 2)
a = int2binary[a_int]
# print "a: " + str(a_int)
b_int = np.random.randint(largest_number / 2)
b = int2binary[b_int]
# print "b: " + str(b_int)
c_int = a_int + b_int
c = int2binary[c_int]
d = np.zeros_like(c)
overallError = 0
layer_2_deltas = list()
layer_1_values = list()
layer_1_values.append(np.zeros(hidden_dim))
for position in range(binary_dim):
#generate input and output
x = np.array([[a[binary_dim - position - 1], b[binary_dim - position - 1]]])
y = np.array([[c[binary_dim - position - 1]]]).T
#hidden layer out value : layer_1
layer_1 = sigmoid(np.dot(x, synapse_0) + np.dot(layer_1_values[-1], synapse_h))
layer_2 = sigmoid(np.dot(layer_1, synapse_1))
layer_2_error = y - layer_2
layer_2_delta = layer_2_error * sigmoid_derivative_value_byOutPut(layer_2)
layer_2_deltas.append(layer_2_delta)
overallError += np.abs(layer_2_error[0])
d[binary_dim - position - 1] = np.round(layer_2[0][0])
layer_1_values.append(copy.deepcopy(layer_1))
future_layer_1_delta = np.zeros(hidden_dim)
for position in range(binary_dim):
x = np.array([[a[position], b[position]]])
layer_1 = layer_1_values[-position-1]
pre_layer_1 = layer_1_values[-position-2]
layer_2_delta = layer_2_deltas[-position-1]
layer_1_delta = (future_layer_1_delta.dot(synapse_h.T) + layer_2_delta.dot(synapse_1.T)) * sigmoid_derivative_value_byOutPut(layer_1)
synapse_1_update += np.atleast_2d(layer_1).T.dot(layer_2_delta)
synapse_0_update += x.T.dot(layer_1_delta)
synapse_h_update += np.atleast_2d(pre_layer_1).T.dot(layer_1_delta)
future_layer_1_delta = layer_1_delta
synapse_0 += synapse_0_update * alpha
synapse_1 += synapse_1_update * alpha
synapse_h += synapse_h_update * alpha
synapse_0_update *= 0
synapse_1_update *= 0
synapse_h_update *= 0
#print out rnn train progress
if(j % 1000 == 0):
print "iterator : " + str(j)
print "Error: " + str(overallError)
print "Predict out: " + str(d) + " " + str(binary2int(d))
print "True answer: " + str(c) + " " + str(c_int)
out = 0
for index,x in enumerate(reversed(d)):
out += x * pow(2, index)
print str(a_int) + " + " + str(b_int) + " = " + str(out)
print "........................"
#if __name__ == '__main__':
相关文章推荐
- RNN循环神经网络的直观理解:基于TensorFlow的简单RNN例子
- [置顶] 【深度学习】RNN循环神经网络Python简单实现
- 分享一个简单的unityAI框架,基于神经网络和遗传算法,可以简单的实现自成长的游戏对象
- 基于循环神经网络实现基于字符的语言模型(char-level RNN Language Model)-tensorflow实现
- 基于python实现一个简单的神经网络
- 基于循环神经网络(RNN)实现影评情感分类
- 最简单的三层神经网络Matlab实现
- 三层神经网络简单实现(Python版)
- 神经网络及其简单实现(MATLAB)
- 基于weka实现的神经网络算法实现
- 神经网络、logistic回归等分类算法简单实现
- 基于Theano的多层神经网络及其实现(一)
- 循环神经网络教程4-用Python和Theano实现GRU/LSTM RNN, Part 4 – Implementing a GRU/LSTM RNN with Python and Theano
- python实现简单神经网络算法
- Android 网络:基于TCP协议通信,多线程,实现简单的C/S聊天室
- 基于Theano的多层神经网络及其实现(二)
- 神经网络BP的简单实现
- Java网络编程 - 基于UDP协议 实现简单的聊天室程序
- 深度学习笔记(五)用Torch实现RNN来制作一个神经网络计时器
- 深度学习笔记(五)用Torch实现RNN来制作一个神经网络计时器