具有意外预测的 tflearn 多层感知器
tflearn multi layer perceptron with unexpected prediction
我想重建我首先使用 scikit-learn 的 MLPRegressor 和 tflearn 实现的 MLP。
sklearn.neural_network.MLPRegressor 实施:
train_data = pd.read_csv('train_data.csv', delimiter = ';', decimal = ',', header = 0)
test_data = pd.read_csv('test_data.csv', delimiter = ';', decimal = ',', header = 0)
X_train = np.array(train_data.drop(['output'], 1))
X_scaler = StandardScaler()
X_scaler.fit(X_train)
X_train = X_scaler.transform(X_train)
Y_train = np.array(train_data['output'])
clf = MLPRegressor(activation = 'tanh', solver='lbfgs', alpha=0.0001, hidden_layer_sizes=(3))
clf.fit(X_train, Y_train)
prediction = clf.predict(X_train)
模型成功了,我得到了 0.85
的准确度。现在我想用 tflearn 构建一个类似的 MLP。我从以下代码开始:
train_data = pd.read_csv('train_data.csv', delimiter = ';', decimal = ',', header = 0)
test_data = pd.read_csv('test_data.csv', delimiter = ';', decimal = ',', header = 0)
X_train = np.array(train_data.drop(['output'], 1))
X_scaler = StandardScaler()
X_scaler.fit(X_train)
X_train = X_scaler.transform(X_train)
Y_train = np.array(train_data['output'])
Y_scaler = StandardScaler()
Y_scaler.fit(Y_train)
Y_train = Y_scaler.transform(Y_train.reshape((-1,1)))
net = tfl.input_data(shape=[None, 6])
net = tfl.fully_connected(net, 3, activation='tanh')
net = tfl.fully_connected(net, 1, activation='sigmoid')
net = tfl.regression(net, optimizer='sgd', loss='mean_square', learning_rate=3.)
clf = tfl.DNN(net)
clf.fit(X_train, Y_train, n_epoch=200, show_metric=True)
prediction = clf.predict(X_train)
在某些时候,我确实配置了错误的方式,因为预测偏离了。 Y_train 的范围在 20
和 88
之间,预测显示 0.005
左右的数字。在 tflearn 文档中,我刚刚找到了分类示例。
更新 1:
我意识到回归层默认使用 'categorical_crossentropy'
作为分类问题的损失函数。所以我选择了 'mean_square'
。我还尝试规范化 Y_train
。预测仍然不符合 Y_train
的范围。有什么想法吗?
最终更新:
看看已接受的答案。
第一步应该是不要缩放输出。
我也在研究回归问题,我只缩放输入,它在一些神经网络上工作得很好。尽管如果我使用 tflearn 我会得到错误的预测。
我犯了几个非常愚蠢的错误。
首先,我将输出调整为 0
到 1
的区间,但在 output-layer 中使用了激活函数 tanh
,它从 [=13] 传递值=] 到 1
。所以我不得不使用激活函数输出 0
和 1
之间的值(例如 sigmoid
)或 linear
而不应用任何缩放。
其次,也是最重要的一点,对于我的数据,我为 learning rate
和 n_epoch
选择了一个非常糟糕的组合。我没有指定任何学习率,我认为默认的学习率是 0.1
。无论如何它都太小了(我最终使用 3.0
)。同时,纪元计数 (10
) 也太小了,200
效果很好。
我还明确选择 sgd
作为 optimizer
(默认值:adam
),结果效果更好。
我更新了问题中的代码。
我想重建我首先使用 scikit-learn 的 MLPRegressor 和 tflearn 实现的 MLP。
sklearn.neural_network.MLPRegressor 实施:
train_data = pd.read_csv('train_data.csv', delimiter = ';', decimal = ',', header = 0)
test_data = pd.read_csv('test_data.csv', delimiter = ';', decimal = ',', header = 0)
X_train = np.array(train_data.drop(['output'], 1))
X_scaler = StandardScaler()
X_scaler.fit(X_train)
X_train = X_scaler.transform(X_train)
Y_train = np.array(train_data['output'])
clf = MLPRegressor(activation = 'tanh', solver='lbfgs', alpha=0.0001, hidden_layer_sizes=(3))
clf.fit(X_train, Y_train)
prediction = clf.predict(X_train)
模型成功了,我得到了 0.85
的准确度。现在我想用 tflearn 构建一个类似的 MLP。我从以下代码开始:
train_data = pd.read_csv('train_data.csv', delimiter = ';', decimal = ',', header = 0)
test_data = pd.read_csv('test_data.csv', delimiter = ';', decimal = ',', header = 0)
X_train = np.array(train_data.drop(['output'], 1))
X_scaler = StandardScaler()
X_scaler.fit(X_train)
X_train = X_scaler.transform(X_train)
Y_train = np.array(train_data['output'])
Y_scaler = StandardScaler()
Y_scaler.fit(Y_train)
Y_train = Y_scaler.transform(Y_train.reshape((-1,1)))
net = tfl.input_data(shape=[None, 6])
net = tfl.fully_connected(net, 3, activation='tanh')
net = tfl.fully_connected(net, 1, activation='sigmoid')
net = tfl.regression(net, optimizer='sgd', loss='mean_square', learning_rate=3.)
clf = tfl.DNN(net)
clf.fit(X_train, Y_train, n_epoch=200, show_metric=True)
prediction = clf.predict(X_train)
在某些时候,我确实配置了错误的方式,因为预测偏离了。 Y_train 的范围在 20
和 88
之间,预测显示 0.005
左右的数字。在 tflearn 文档中,我刚刚找到了分类示例。
更新 1:
我意识到回归层默认使用 'categorical_crossentropy'
作为分类问题的损失函数。所以我选择了 'mean_square'
。我还尝试规范化 Y_train
。预测仍然不符合 Y_train
的范围。有什么想法吗?
最终更新:
看看已接受的答案。
第一步应该是不要缩放输出。 我也在研究回归问题,我只缩放输入,它在一些神经网络上工作得很好。尽管如果我使用 tflearn 我会得到错误的预测。
我犯了几个非常愚蠢的错误。
首先,我将输出调整为 0
到 1
的区间,但在 output-layer 中使用了激活函数 tanh
,它从 [=13] 传递值=] 到 1
。所以我不得不使用激活函数输出 0
和 1
之间的值(例如 sigmoid
)或 linear
而不应用任何缩放。
其次,也是最重要的一点,对于我的数据,我为 learning rate
和 n_epoch
选择了一个非常糟糕的组合。我没有指定任何学习率,我认为默认的学习率是 0.1
。无论如何它都太小了(我最终使用 3.0
)。同时,纪元计数 (10
) 也太小了,200
效果很好。
我还明确选择 sgd
作为 optimizer
(默认值:adam
),结果效果更好。
我更新了问题中的代码。