基于RNN神经网络和BPTT算法实现的简单二进制计数器
来源:互联网 发布:bigworld引擎全套源码 编辑:程序博客网 时间:2024/05/22 03:25
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__':
0 0
- 基于RNN神经网络和BPTT算法实现的简单二进制计数器
- RNN循环神经网络里的BPTT算法
- RNN上的BPTT的简单推导
- 循环神经网络(RNN)反向传播算法(BPTT)理解
- 循环神经网络(RNN)反向传播算法(BPTT)理解
- RNN循环神经网络中的权重更新算法-BPTT
- 循环神经网络(RNN)反向传播算法(BPTT)
- 神经网络中的BPTT算法简单介绍
- 递归神经网络RNN原理——Elman网络原理——结合实例MATLAB(BPTT算法)实现
- BPTT-应用于简单的循环神经网络
- Recurrent Neural Network系列3--理解RNN的BPTT算法和梯度消失
- Recurrent Neural Network系列3--理解RNN的BPTT算法和梯度消失_0
- Recurrent Neural Network系列3--理解RNN的BPTT算法和梯度消失
- RNN与反向传播算法(BPTT)的理解
- RNN中BPTT的推导和可能的问题
- BP神经网络和RNN神经网络的学习和实现。
- 基于RNN的mnist数字识别神经网络实现
- 基于RNN的中文古诗词生成神经网络实现
- MongoDB 安装成为Windows服务
- mysql数据库导出表的数据字典
- 打开mxd和两控件复制
- 在TOMCAT中部署war
- 【C/C++】用回调函数实现计算器
- 基于RNN神经网络和BPTT算法实现的简单二进制计数器
- GDB 调试 C++ 程序 core dump
- 第14课Scala集合上的函数式编程实战及Spark源码鉴赏
- Arrays.asList方法
- 二次实践自定义标题栏
- JavaScript笔记_1
- 烧写Uboot到SD卡,,打开 sd_mbr.bat 失败,打开 SD-bl1-8k.bin 失败,failed to open'SD-bl1-8k.bin',
- PHP购物车类Cart.class.php定义与用法示例
- Socket网络编程学习笔记