关于 数字识别 章节的问题
Created by: sandycs
今天进展到数字识别章节问题 我这么理解。对于softmax回归来说,输入实际上是一个28x28=784的一维矩阵 输出是一个10个元素的一维矩阵。 于是我对程序作了一些变化: 我的输入是随机的:
global dataX dataX = np.random.rand(1000,3) 我的输出是条件生成的: (逻辑很简单。就是写一些条件,当X满足某些条件的时候,Y是某个确定的值) global dataY dataY = np.zeros((1000,3)) intcount = 0 for e in dataX: if (e[0]>0.5 and e[1]>0.5 and e[2]>0.5): dataY[intcount] = [1.0,0,0] else: if (e[2] <0.5): dataY[intcount] = [0,1.0,0] else: dataY[intcount] = [0,0,1.0] intcount = intcount +1
然后我就把这些输入进去进行训练了。
global UCI_TRAIN_DATA UCI_TRAIN_DATA = dataFinal[:800] global UCI_TEST_DATA UCI_TEST_DATA= dataFinal[800:] x = paddle.layer.data(name='x', type=paddle.data_type.dense_vector(3)) y = paddle.layer.data(name='y', type=paddle.data_type.dense_vector(3)) predict = softmax_regression(x) cost = paddle.layer.classification_cost(input=predict, label=y) # Save the inference topology to protobuf. inference_topology = paddle.topology.Topology(layers=predict) with open("inference_topology.pkl", 'wb') as f: inference_topology.serialize_for_inference(f) parameters = paddle.parameters.create(cost) # create optimizer # optimizer = paddle.optimizer.Momentum(momentum=0) optimizer = paddle.optimizer.Momentum( learning_rate=0.1 / 3.0, momentum=0.9, regularization=paddle.optimizer.L2Regularization(rate=0.0005 * 3)) trainer = paddle.trainer.SGD( cost=cost, parameters=parameters, update_equation=optimizer) # feeding = {'x': 0, 'y': 1} # event_handler to print training and testing info def event_handler(event): if isinstance(event, paddle.event.EndIteration): if event.batch_id % 100 == 0: print "Pass %d, Batch %d, Cost %f, %s" % (event.pass_id, event.batch_id, event.cost, event.metrics) if isinstance(event, paddle.event.EndPass): if event.pass_id % 10 == 0: with open('params_pass_%d.tar' % event.pass_id, 'w') as f: trainer.save_parameter_to_tar(f) result = trainer.test( reader=paddle.batch( testdata(), batch_size=2) ) print "Test with Pass %d, Cost %f, %s\n" % (event.pass_id, result.cost, result.metrics) # training trainer.train( reader=paddle.batch( paddle.reader.shuffle(traindata(), buf_size=500), batch_size=2), event_handler=event_handler, num_passes=300)
一开始的时候,我忘记修改cost,用的仍然使用线性回归课程中的cost,即
cost = paddle.layer.square_error_cost(input=y_predict, label=y)
,运行是正常的。但结果不收敛 检查发现问题后,我把cost修正为现在的样子,即
cost = paddle.layer.classification_cost(input=predict, label=y)
运行出错了。这个错误信息我有点搞不明白,求教:
F1116 05:56:43.303720 11 Matrix.cpp:3626] Check failed: dynamic_cast<CpuIVector*>(&label)
*** Check failure stack trace: ***
@ 0x7f571ade60ed google::LogMessage::Fail()
@ 0x7f571ade8438 google::LogMessage::SendToLog()
@ 0x7f571ade5bfb google::LogMessage::Flush()
@ 0x7f571ade930e google::LogMessageFatal::~LogMessageFatal()
@ 0x7f571ad08152 paddle::CpuMatrix::oneHotCrossEntropy()
@ 0x7f571aae64cf paddle::CostLayer::forward()
@ 0x7f571ab547a9 paddle::NeuralNetwork::forward()
@ 0x7f571adb62c0 GradientMachine::forwardBackward()
@ 0x7f571a964424 _wrap_GradientMachine_forwardBackward
@ 0x4cb45e PyEval_EvalFrameEx
@ 0x4c2765 PyEval_EvalCodeEx
@ 0x4ca8d1 PyEval_EvalFrameEx
@ 0x4c2765 PyEval_EvalCodeEx
@ 0x4ca099 PyEval_EvalFrameEx
@ 0x4c2765 PyEval_EvalCodeEx
@ 0x4ca099 PyEval_EvalFrameEx
@ 0x4c2765 PyEval_EvalCodeEx
@ 0x4ca8d1 PyEval_EvalFrameEx
@ 0x4c2765 PyEval_EvalCodeEx
@ 0x4c2509 PyEval_EvalCode
@ 0x4f1def (unknown)
@ 0x4ec652 PyRun_FileExFlags
@ 0x4eae31 PyRun_SimpleFileExFlags
@ 0x49e14a Py_Main
@ 0x7f5734ae1830 __libc_start_main
@ 0x49d9d9 _start
@ (nil) (unknown)
Aborted
请问是哪里出了问题 还有,我这个例子用来做回归行不行?