提交 2c2347df 编写于 作者: D dangqingqing

Merge branch 'develop' of https://github.com/PaddlePaddle/Paddle into convert

...@@ -126,7 +126,7 @@ class ImageClassifier(): ...@@ -126,7 +126,7 @@ class ImageClassifier():
# For oversampling, average predictions across crops. # For oversampling, average predictions across crops.
# If not, the shape of output[name]: (1, class_number), # If not, the shape of output[name]: (1, class_number),
# the mean is also applicable. # the mean is also applicable.
return output[output_layer].mean(0) return output[output_layer]['value'].mean(0)
def predict(self, image=None, output_layer=None): def predict(self, image=None, output_layer=None):
assert isinstance(image, basestring) assert isinstance(image, basestring)
......
...@@ -156,7 +156,7 @@ class ImageClassifier(): ...@@ -156,7 +156,7 @@ class ImageClassifier():
# For oversampling, average predictions across crops. # For oversampling, average predictions across crops.
# If not, the shape of output[name]: (1, class_number), # If not, the shape of output[name]: (1, class_number),
# the mean is also applicable. # the mean is also applicable.
res[name] = output[name].mean(0) res[name] = output[name]['value'].mean(0)
return res return res
......
...@@ -38,6 +38,13 @@ Arguments* Arguments::createByPaddleArgumentVector(void* ptr) { ...@@ -38,6 +38,13 @@ Arguments* Arguments::createByPaddleArgumentVector(void* ptr) {
return args; return args;
} }
Arguments* Arguments::createByPaddleArgument(const void* ptr) {
auto p = (paddle::Argument*)(ptr);
auto args = new Arguments();
args->m->outputs.push_back(*p);
return args;
}
Matrix* Arguments::getSlotValue(size_t idx) const throw(RangeError) { Matrix* Arguments::getSlotValue(size_t idx) const throw(RangeError) {
auto& a = m->getArg(idx); auto& a = m->getArg(idx);
return Matrix::createByPaddleMatrixPtr(&a.value); return Matrix::createByPaddleMatrixPtr(&a.value);
......
...@@ -144,12 +144,12 @@ Parameter* GradientMachine::getParameter(size_t i) throw(RangeError) { ...@@ -144,12 +144,12 @@ Parameter* GradientMachine::getParameter(size_t i) throw(RangeError) {
void GradientMachine::randParameters() { m->machine->randParameters(); } void GradientMachine::randParameters() { m->machine->randParameters(); }
Matrix* GradientMachine::getLayerOutput(const std::string& layerName) const Arguments* GradientMachine::getLayerOutput(const std::string& layerName) const
throw(UnsupportError) { throw(UnsupportError) {
auto nn = std::dynamic_pointer_cast<paddle::NeuralNetwork>(m->machine); auto nn = m->machine;
if (nn) { if (nn) {
auto mat = nn->getLayerOutput(layerName); auto arg = nn->getLayerOutput(layerName);
return Matrix::createByPaddleMatrixPtr(&mat); return Arguments::createByPaddleArgument(&arg);
} else { } else {
throw UnsupportError(); throw UnsupportError();
} }
......
...@@ -454,6 +454,7 @@ public: ...@@ -454,6 +454,7 @@ public:
private: private:
static Arguments* createByPaddleArgumentVector(void* ptr); static Arguments* createByPaddleArgumentVector(void* ptr);
static Arguments* createByPaddleArgument(const void* ptr);
void* getInternalArgumentsPtr() const; void* getInternalArgumentsPtr() const;
private: private:
...@@ -769,7 +770,7 @@ public: ...@@ -769,7 +770,7 @@ public:
void randParameters(); void randParameters();
Matrix* getLayerOutput(const std::string& layerName) const Arguments* getLayerOutput(const std::string& layerName) const
throw(UnsupportError); throw(UnsupportError);
/** /**
...@@ -956,7 +957,7 @@ public: ...@@ -956,7 +957,7 @@ public:
Arguments* getForwardOutput(); Arguments* getForwardOutput();
Matrix* getLayerOutput(const std::string& layerName); Arguments* getLayerOutput(const std::string& layerName) const;
}; };
/// the N-Best results generated from one input sequence. /// the N-Best results generated from one input sequence.
......
...@@ -131,12 +131,11 @@ void Trainer::testOneDataBatch(size_t batchSize, const Arguments& args) { ...@@ -131,12 +131,11 @@ void Trainer::testOneDataBatch(size_t batchSize, const Arguments& args) {
void TrainerPrivate::finishTestPeriod() { tester_->finishTestPeriod(); } void TrainerPrivate::finishTestPeriod() { tester_->finishTestPeriod(); }
void Trainer::finishTestPeriod() { m->finishTestPeriod(); } void Trainer::finishTestPeriod() { m->finishTestPeriod(); }
Matrix* Trainer::getLayerOutput(const std::string& layerName) { Arguments* Trainer::getLayerOutput(const std::string& layerName) const {
auto nn = std::dynamic_pointer_cast<paddle::NeuralNetwork>( auto nn = this->m->getGradientMachine();
this->m->getGradientMachine());
CHECK(nn) << "trainerInternal_.getGradientMachine() is not NeuralNetwork"; CHECK(nn) << "trainerInternal_.getGradientMachine() is not NeuralNetwork";
auto m = nn->getLayerOutput(layerName); auto arg = nn->getLayerOutput(layerName);
return Matrix::createByPaddleMatrixPtr(&m); return Arguments::createByPaddleArgument(&arg);
} }
void Trainer::forwardOneBatch(size_t batchSize) { void Trainer::forwardOneBatch(size_t batchSize) {
......
...@@ -134,6 +134,10 @@ public: ...@@ -134,6 +134,10 @@ public:
backward(callback); backward(callback);
} }
virtual Argument getLayerOutput(const std::string& layerName) {
return *((Argument*)nullptr);
}
// see comment in Layer.h for the function with the same name // see comment in Layer.h for the function with the same name
virtual void resetState() {} virtual void resetState() {}
......
...@@ -282,6 +282,18 @@ void MultiGradientMachine::forwardBackward(const std::vector<Argument>& inArgs, ...@@ -282,6 +282,18 @@ void MultiGradientMachine::forwardBackward(const std::vector<Argument>& inArgs,
backwardImp(callback); backwardImp(callback);
} }
Argument MultiGradientMachine::getLayerOutput(const std::string& layerName) {
std::vector<Argument> args;
args.reserve(threads_.size());
for (auto& thread : threads_) {
args.push_back(thread->getGradientMachine()->getLayerOutput(layerName));
}
outLayerArgs_.concat(args, false /* use_gpu */, outArgStream_, passType_);
return outLayerArgs_;
}
void MultiGradientMachine::backwardImp(const UpdateCallback& callback) { void MultiGradientMachine::backwardImp(const UpdateCallback& callback) {
for (size_t i = 0; i < parameters_.size(); i++) { for (size_t i = 0; i < parameters_.size(); i++) {
if (!parameters_[i]->useGpu() || parameters_[i]->isStatic()) continue; if (!parameters_[i]->useGpu() || parameters_[i]->isStatic()) continue;
......
...@@ -189,6 +189,8 @@ public: ...@@ -189,6 +189,8 @@ public:
PassType passType, PassType passType,
const UpdateCallback& callback); const UpdateCallback& callback);
virtual Argument getLayerOutput(const std::string& layerName);
virtual void onPassEnd(); virtual void onPassEnd();
virtual void finish(); virtual void finish();
...@@ -314,6 +316,8 @@ protected: ...@@ -314,6 +316,8 @@ protected:
std::vector<Argument> outArgs_; std::vector<Argument> outArgs_;
hl_stream_t outArgStream_; hl_stream_t outArgStream_;
Argument outLayerArgs_;
/// ParameterType which needs to be merged from each GPU /// ParameterType which needs to be merged from each GPU
std::vector<ParameterType> mergeTypes_; std::vector<ParameterType> mergeTypes_;
int numDevices_; /* number of gpu devices */ int numDevices_; /* number of gpu devices */
......
...@@ -293,11 +293,10 @@ void NeuralNetwork::backward(const UpdateCallback& callback) { ...@@ -293,11 +293,10 @@ void NeuralNetwork::backward(const UpdateCallback& callback) {
} }
} }
MatrixPtr NeuralNetwork::getLayerOutput(const std::string& layerName) { Argument NeuralNetwork::getLayerOutput(const std::string& layerName) {
auto it = layerMap_.find(layerName); return getLayer(layerName)->getOutput();
CHECK(it != layerMap_.end()) << "Cannot find layer: " << layerName;
return it->second->getOutputValue();
} }
void NeuralNetwork::onPassEnd() { void NeuralNetwork::onPassEnd() {
for (auto& layer : layers_) { for (auto& layer : layers_) {
layer->onPassEnd(); layer->onPassEnd();
......
...@@ -87,7 +87,8 @@ public: ...@@ -87,7 +87,8 @@ public:
virtual void backward(const UpdateCallback& callback = nullptr); virtual void backward(const UpdateCallback& callback = nullptr);
MatrixPtr getLayerOutput(const std::string& layerName); virtual Argument getLayerOutput(const std::string& layerName);
const LayerPtr& getLayer(const std::string& layerName) const { const LayerPtr& getLayer(const std::string& layerName) const {
auto it = layerMap_.find(layerName); auto it = layerMap_.find(layerName);
CHECK(it != layerMap_.end()) << "Unknown layer " << layerName; CHECK(it != layerMap_.end()) << "Unknown layer " << layerName;
......
...@@ -42,7 +42,7 @@ void CosSimLayer::forward(PassType passType) { ...@@ -42,7 +42,7 @@ void CosSimLayer::forward(PassType passType) {
/* malloc memory for the output_ if necessary */ /* malloc memory for the output_ if necessary */
int batchSize = getInputValue(0)->getHeight(); int batchSize = getInputValue(0)->getHeight();
int size = getSize(); int size = getSize();
CHECK_EQ(forward_.size(), 1) << "Only one forward function needed"; CHECK_EQ(forward_.size(), 1UL) << "Only one forward function needed";
{ {
REGISTER_TIMER_INFO("CosFwResetTimer", getName().c_str()); REGISTER_TIMER_INFO("CosFwResetTimer", getName().c_str());
...@@ -68,7 +68,7 @@ void CosSimLayer::forward(PassType passType) { ...@@ -68,7 +68,7 @@ void CosSimLayer::forward(PassType passType) {
void CosSimLayer::backward(const UpdateCallback& callback) { void CosSimLayer::backward(const UpdateCallback& callback) {
/* activation */ { /* activation */ {
REGISTER_TIMER_INFO("CosBpAtvTimer", getName().c_str()); REGISTER_TIMER_INFO("CosBpAtvTimer", getName().c_str());
CHECK_EQ(backward_.size(), 1) << "Only one backward function needed"; CHECK_EQ(backward_.size(), 1UL) << "Only one backward function needed";
const auto outG = this->getOutputGrad(); const auto outG = this->getOutputGrad();
const auto outV = this->getOutputValue(); const auto outV = this->getOutputValue();
......
...@@ -112,7 +112,7 @@ bool CosSimVecMatLayer::init(const LayerMap& layerMap, ...@@ -112,7 +112,7 @@ bool CosSimVecMatLayer::init(const LayerMap& layerMap,
void CosSimVecMatLayer::forward(PassType passType) { void CosSimVecMatLayer::forward(PassType passType) {
Layer::forward(passType); Layer::forward(passType);
CHECK_EQ(forward_.size(), 1) << "Only one forward function needed"; CHECK_EQ(forward_.size(), 1UL) << "Only one forward function needed";
MatrixPtr inV0 = getInputValue(0); MatrixPtr inV0 = getInputValue(0);
MatrixPtr inV1 = getInputValue(1); MatrixPtr inV1 = getInputValue(1);
...@@ -145,7 +145,7 @@ void CosSimVecMatLayer::forward(PassType passType) { ...@@ -145,7 +145,7 @@ void CosSimVecMatLayer::forward(PassType passType) {
} }
void CosSimVecMatLayer::backward(const UpdateCallback& callback) { void CosSimVecMatLayer::backward(const UpdateCallback& callback) {
CHECK_EQ(backward_.size(), 1) << "Only one forward function needed"; CHECK_EQ(backward_.size(), 1UL) << "Only one forward function needed";
MatrixPtr inV0 = getInputValue(0); MatrixPtr inV0 = getInputValue(0);
MatrixPtr inV1 = getInputValue(1); MatrixPtr inV1 = getInputValue(1);
......
...@@ -17,10 +17,10 @@ limitations under the License. */ ...@@ -17,10 +17,10 @@ limitations under the License. */
TEST(RowBuffer, testAutoGrow) { TEST(RowBuffer, testAutoGrow) {
paddle::RowBuffer buf(128); paddle::RowBuffer buf(128);
ASSERT_EQ(128, buf.getWidth()); ASSERT_EQ(128UL, buf.getWidth());
ASSERT_TRUE(buf.isAutoGrowth()); ASSERT_TRUE(buf.isAutoGrowth());
buf.resize(2); buf.resize(2);
ASSERT_EQ(2, buf.getRowCount()); ASSERT_EQ(2UL, buf.getRowCount());
for (size_t i = 0; i < buf.getWidth() * 2; ++i) { for (size_t i = 0; i < buf.getWidth() * 2; ++i) {
buf.data()[i] = i; buf.data()[i] = i;
} }
...@@ -35,7 +35,7 @@ TEST(RowBuffer, testAutoGrow) { ...@@ -35,7 +35,7 @@ TEST(RowBuffer, testAutoGrow) {
data[i] = i; data[i] = i;
} }
ASSERT_EQ(3, buf.getRowCount()); ASSERT_EQ(3UL, buf.getRowCount());
for (size_t i = 0; i < buf.getRowCount() - 1; ++i) { for (size_t i = 0; i < buf.getRowCount() - 1; ++i) {
for (size_t j = 0; j < buf.getWidth(); ++j) { for (size_t j = 0; j < buf.getWidth(); ++j) {
ASSERT_NEAR(i * buf.getWidth() + j, buf.get(i)[j], 1e-5); ASSERT_NEAR(i * buf.getWidth() + j, buf.get(i)[j], 1e-5);
...@@ -51,7 +51,7 @@ TEST(RowBuffer, testWithMemBuf) { ...@@ -51,7 +51,7 @@ TEST(RowBuffer, testWithMemBuf) {
std::make_shared<paddle::CpuMemoryHandle>(128 * 2 * sizeof(real)); std::make_shared<paddle::CpuMemoryHandle>(128 * 2 * sizeof(real));
paddle::RowBuffer buf(mem, 128); paddle::RowBuffer buf(mem, 128);
ASSERT_TRUE(!buf.isAutoGrowth()); ASSERT_TRUE(!buf.isAutoGrowth());
ASSERT_EQ(2, buf.getRowCount()); ASSERT_EQ(2UL, buf.getRowCount());
for (size_t i = 0; i < buf.getWidth() * 2; ++i) { for (size_t i = 0; i < buf.getWidth() * 2; ++i) {
buf.data()[i] = i; buf.data()[i] = i;
} }
......
...@@ -208,7 +208,7 @@ def __monkeypatch_gradient_machine__(): ...@@ -208,7 +208,7 @@ def __monkeypatch_gradient_machine__():
output = dict() output = dict()
for name in layerNames: for name in layerNames:
output[name] = __matrix_to_numpy__(self.getLayerOutput(name)) output[name] = __arguments_to_numpy__(0, self.getLayerOutput(name))
return output return output
swig_paddle.GradientMachine.getLayerOutputs = getLayerOutputs swig_paddle.GradientMachine.getLayerOutputs = getLayerOutputs
......
...@@ -21,3 +21,5 @@ ...@@ -21,3 +21,5 @@
# #
# r = paddle.reader.buffered(paddle.reader.creator.text("hello.txt")) # r = paddle.reader.buffered(paddle.reader.creator.text("hello.txt"))
from decorator import * from decorator import *
import creator
# Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
__all__ = ['np_array', 'text_file']
def np_array(x):
"""
Creates a reader that yields elements of x, if it is a
numpy vector. Or rows of x, if it is a numpy matrix.
Or any sub-hyperplane indexed by the highest dimension.
:param x: the numpy array to create reader from.
:returns: data reader created from x.
"""
def reader():
if x.ndim < 1:
yield x
for e in x:
yield e
return reader
def text_file(path):
"""
Creates a data reader that outputs text line by line from given text file.
Trailing new line ('\n') of each line will be removed.
:path: path of the text file.
:returns: data reader of text file
"""
def reader():
f = open(path, "r")
for l in f:
yield l.rstrip('\n')
f.close()
return reader
...@@ -2,3 +2,8 @@ add_test(NAME reader_decorator_test ...@@ -2,3 +2,8 @@ add_test(NAME reader_decorator_test
COMMAND ${PROJ_ROOT}/paddle/.set_python_path.sh -d ${PROJ_ROOT}/python/ COMMAND ${PROJ_ROOT}/paddle/.set_python_path.sh -d ${PROJ_ROOT}/python/
${PYTHON_EXECUTABLE} ${PROJ_ROOT}/python/paddle/reader/tests/decorator_test.py ${PYTHON_EXECUTABLE} ${PROJ_ROOT}/python/paddle/reader/tests/decorator_test.py
WORKING_DIRECTORY ${PROJ_ROOT}/python/paddle) WORKING_DIRECTORY ${PROJ_ROOT}/python/paddle)
add_test(NAME reader_creator_test
COMMAND ${PROJ_ROOT}/paddle/.set_python_path.sh -d ${PROJ_ROOT}/python/
${PYTHON_EXECUTABLE} ${PROJ_ROOT}/python/paddle/reader/tests/creator_test.py
WORKING_DIRECTORY ${PROJ_ROOT}/python/paddle)
# Copyright PaddlePaddle contributors. All Rights Reserved
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import unittest
import paddle.reader.creator
import numpy as np
import os
class TestNumpyArray(unittest.TestCase):
def test_numpy_array(self):
l = [[1, 2, 3], [4, 5, 6]]
x = np.array(l, np.int32)
reader = paddle.reader.creator.np_array(x)
for idx, e in enumerate(reader()):
self.assertItemsEqual(e, l[idx])
class TestTextFile(unittest.TestCase):
def test_text_file(self):
path = os.path.join(os.path.dirname(__file__), "test_data_creator.txt")
reader = paddle.reader.creator.text_file(path)
for idx, e in enumerate(reader()):
self.assertEqual(e, str(idx * 2) + " " + str(idx * 2 + 1))
if __name__ == '__main__':
unittest.main()
import os
__all__ = ['DATA_HOME']
DATA_HOME = os.path.expanduser('~/.cache/paddle_data_set')
if not os.path.exists(DATA_HOME):
os.makedirs(DATA_HOME)
import sklearn.datasets.mldata
import sklearn.model_selection
import numpy
from config import DATA_HOME
__all__ = ['train_creator', 'test_creator']
def __mnist_reader_creator__(data, target):
def reader():
n_samples = data.shape[0]
for i in xrange(n_samples):
yield (data[i] / 255.0).astype(numpy.float32), int(target[i])
return reader
TEST_SIZE = 10000
data = sklearn.datasets.mldata.fetch_mldata(
"MNIST original", data_home=DATA_HOME)
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(
data.data, data.target, test_size=TEST_SIZE, random_state=0)
def train_creator():
return __mnist_reader_creator__(X_train, y_train)
def test_creator():
return __mnist_reader_creator__(X_test, y_test)
def unittest():
assert len(list(test_creator()())) == TEST_SIZE
if __name__ == '__main__':
unittest()
...@@ -3,7 +3,10 @@ import paddle.trainer_config_helpers.optimizers as v1_optimizers ...@@ -3,7 +3,10 @@ import paddle.trainer_config_helpers.optimizers as v1_optimizers
import paddle.trainer_config_helpers.config_parser_utils as config_parser_utils import paddle.trainer_config_helpers.config_parser_utils as config_parser_utils
import paddle.v2 import paddle.v2
__all__ = ['Adam', 'Adamax'] __all__ = [
'Momentum', 'Adam', 'Adamax', 'AdaGrad', 'DecayedAdaGrad', 'AdaDelta',
'RMSProp', 'ModelAverage', 'L2Regularization'
]
class Optimizer(object): class Optimizer(object):
...@@ -38,6 +41,14 @@ class Optimizer(object): ...@@ -38,6 +41,14 @@ class Optimizer(object):
pass_num) pass_num)
class Momentum(Optimizer):
def __init__(self, momentum=None, sparse=False, **kwargs):
learning_method = v1_optimizers.MomentumOptimizer(
momentum=None, sparse=False)
super(Momentum, self).__init__(
learning_method=learning_method, **kwargs)
class Adam(Optimizer): class Adam(Optimizer):
def __init__(self, beta1=0.9, beta2=0.999, epsilon=1e-8, **kwargs): def __init__(self, beta1=0.9, beta2=0.999, epsilon=1e-8, **kwargs):
learning_method = v1_optimizers.AdamOptimizer( learning_method = v1_optimizers.AdamOptimizer(
...@@ -52,7 +63,45 @@ class Adamax(Optimizer): ...@@ -52,7 +63,45 @@ class Adamax(Optimizer):
super(Adamax, self).__init__(learning_method=learning_method, **kwargs) super(Adamax, self).__init__(learning_method=learning_method, **kwargs)
class AdaGrad(Optimizer):
def __init__(self, **kwargs):
learning_method = v1_optimizers.AdaGradOptimizer()
super(AdaGrad, self).__init__(learning_method=learning_method, **kwargs)
class DecayedAdaGrad(Optimizer):
def __init__(self, rho=0.95, epsilon=1e-06, **kwargs):
learning_method = v1_optimizers.DecayedAdaGradOptimizer(
rho=rho, epsilon=epsilon)
super(DecayedAdaGrad, self).__init__(
learning_method=learning_method, **kwargs)
class AdaDelta(Optimizer):
def __init__(self, rho=0.95, epsilon=1e-06, **kwargs):
learning_method = v1_optimizers.AdaDeltaOptimizer(
rho=rho, epsilon=epsilon)
super(AdaDelta, self).__init__(
learning_method=learning_method, **kwargs)
class RMSProp(Optimizer):
def __init__(self, rho=0.95, epsilon=1e-6, **kwargs):
learning_method = v1_optimizers.RMSPropOptimizer(
rho=rho, epsilon=epsilon)
super(RMSProp, self).__init__(learning_method=learning_method, **kwargs)
ModelAverage = v1_optimizers.ModelAverage
L2Regularization = v1_optimizers.L2Regularization
if __name__ == '__main__': if __name__ == '__main__':
swig_api.initPaddle('--use_gpu=false') swig_api.initPaddle('--use_gpu=false')
opt = paddle.v2.optimizer.Adam() for opt in [
print opt.enable_types() Momentum(), Adam(), Adamax(), AdaGrad(), DecayedAdaGrad(),
AdaDelta(), RMSProp(), Adam(
model_average=ModelAverage(average_window=0.5),
regularization=L2Regularization(rate=0.5),
gradient_clipping_threshold=25)
]:
print opt, opt.enable_types()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册