我正在做一个简单的神经网络,当输入2张牌时,它会通过预测是举起还是折叠来玩扑克。我正在用10461x6的数据集训练它。你知道吗
前几行是这样的:
┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓
┃ Card1/12 ┇ Card2/12 ┇Suited?┇ Average ┇Max Difference┇Min Difference┃
┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━┫
┃0.642857143┇0.285714286┇ 0 ┇0.464285714┇ 0.178571429 ┇ 0.178571429 ┃
┣┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅┅┅┅┫
┃0.357142857┇0.214285714┇ 0 ┇0.285714286┇ 0.071428571 ┇ 0.071428571 ┃
┣┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅┅┅┅┫
┃0.857142857┇0.285714286┇ 0 ┇0.571428571┇ 0.285714286 ┇ 0.285714286 ┃
┣┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅┅┅┅╋┅┅┅┅┅┅┅┅┅┅┅┅┅┅┫
┃0.928571429┇0.571428571┇ 0 ┇ 0.75 ┇ 0.178571429 ┇ 0.178571429 ┃
┗━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━┛
我将此数据集存储在csv中,并使用np.genfromtxt()
将其转换为python中的数组。然后这些数据通过神经网络进行训练。然而,我遇到了一个小问题,因为数据集太大,完全崩溃了我的操作系统。你知道吗
以下是我认为正在发生的事情:
我需要一个更有效的方法来训练我的神经网络与这个大数据集。你知道吗
这是我的密码:
import numpy as np
import csv
class nn:
#make sigma
def sigma(self,x):
return 1/(1+np.exp(-x))
#sigma gradient
def sigmaDeriv(self,x):
return x*(1-x)
def train(self):
#define datasets
x = np.genfromtxt('hands.csv', delimiter=',')
y = np.genfromtxt('correctpred.csv', delimiter=',')[np.newaxis]
y = y.T
#seed
np.random.seed(1)
w0 = 2*np.random.random((6,10461))-1
w1 = 2*np.random.random((10461,10461))-1
w2 = 2*np.random.random((10461,10461))-1
w3 = 2*np.random.random((10461,1))-1
#train
for t in xrange(1000):
#forward propagation
l0 = x
l1 = self.sigma(np.dot(l0, w0))
l2 = self.sigma(np.dot(l1, w1))
l3 = self.sigma(np.dot(l2, w2))
l4 = self.sigma(np.dot(l3, w3))
#error + change calc
l4_error = y - l4
l4_change = l4_error*self.sigmaDeriv(l4)
l3_error = l4_change.dot(w3.T)
l3_change = l3_error * self.sigmaDeriv(l3)
l2_error = l3_change.dot(w2.T)
l2_change = l2_error * self.sigmaDeriv(l2)
l1_error= l2_change.dot(w1.T)
l1_change = l1_error * self.sigmaDeriv(l1)
#update weights
w3 += np.dot(l3.T, l4_change)
w2 += np.dot(l2.T, l3_change)
w1 += np.dot(l1.T, l2_change)
w0 += np.dot(l0.T, l1_change)
print "Output after training"
print l4
nn().train()
使用stochastic gradient descent,它正是为了这种目的而创建的。你知道吗
基本上不使用所有的数据向前向后传播并计算误差(损失),而只使用一批b样本来计算损失并得到梯度。然后训练10461/b迭代,每次使用不同的一批样本,直到看到整个数据集。一旦你对整个数据集进行训练,那就叫做一个历元。重复10个时代左右(可调)。你知道吗
相关问题 更多 >
编程相关推荐