我试图创建一个利用强化学习的神经网络。我选择scikit-neuralnetwork作为库(因为它很简单)。但是,两次匹配似乎会使Theano崩溃。
下面是导致崩溃的最简单的代码(注意,这与有哪些层无关,也与学习率或n_iter无关):
import numpy as np
from sknn.mlp import Classifier, Layer
clf = Classifier(
layers=[
Layer("Softmax")
],
learning_rate=0.001,
n_iter=1)
clf.fit(np.array([[0.]]), np.array([[0.]])) # Initialize the network for learning
X = np.array([[-1.], [1.]])
Y = np.array([[1.], [0.]])
clf.fit(X, Y) # crash
这里是我得到的错误:
ValueError: Input dimension mis-match. (input[0].shape[1] = 2, input[1].shape[1] = 1)
Apply node that caused the error: Elemwise{Mul}[(0, 1)](y, LogSoftmax.0)
Toposort index: 12
Inputs types: [TensorType(float64, matrix), TensorType(float64, matrix)]
Inputs shapes: [(1L, 2L), (1L, 1L)]
Inputs strides: [(16L, 8L), (8L, 8L)]
Inputs values: [array([[ 1., 0.]]), array([[ 0.]])]
Outputs clients: [[Sum{axis=[1], acc_dtype=float64}(Elemwise{Mul}[(0, 1)].0)]]
在Python 2.7.11中测试
sknn不支持多次拟合,还是我犯了一些愚蠢的错误?如果没有,你该如何实现强化学习?
我不经常使用sknn
,但它与sklearn
非常相似,所以我可能能够提供帮助!
首先,当使用fit
方法时,您将重新初始化权重,如果您想根据新数据更新权重,您应该使用partial_fit
方法。
关于崩溃,这是因为你的X
数组在第一个维度而不是第二个维度是不同的形状。
import numpy as np
from sknn.mlp import Classifier, Layer
clf = Classifier(
layers=[
Layer("Softmax")
],
learning_rate=0.001,
n_iter=1)
# Original training data
X = np.array([[0.]])
Y = np.array([[0.]])
print X.shape, Y.shape
# Data used for second fitting
X = np.array([[-1.], [1.]])
Y = np.array([[1.], [0.]])
print X.shape, Y.shape
# Use the partial fit method to update weights
clf.partial_fit(X, Y) # Initialize the network for learning
clf.partial_fit(X, Y) # Update the weights
# Multiple training examples by stacking two on top of each other
X = np.concatenate((X, X))
Y = np.concatenate((Y, Y))
print X.shape, Y.shape
clf.partial_fit(X, Y)
输出:
(1, 1) (1, 1)
(2, 1) (2, 1)
(4, 1) (4, 1)