2015Äê11ÔÂ9Èչȸ迪ԴÁËÈ˹¤ÖÇÄÜÆ½Ì¨TensorFlow£¬Í¬Ê±³ÉΪ2015Äê×îÊܹØ×¢µÄ¿ªÔ´ÏîĿ֮һ¡£¾ÀúÁË´Óv0.1µ½v0.12µÄ12¸ö°æ±¾µü´úºó£¬¹È¸èÓÚ2017Äê2ÔÂ15ÈÕ·¢²¼ÁËTensorFlow
1.0 °æ±¾£¬²¢Í¬Ê±ÔÚÃÀ¹ú¼ÓÖÝɽ¾°³Ç¾Ù°ìÁËÊ×½ìTensorFlow Dev Summit»áÒé¡£
TensorFlow 1.0¼°Dev Summit£¨2017£©»Ø¹Ë
ºÍÒÔÍù°æ±¾Ïà±È£¬TensorFlow 1.0 µÄÌØÐԸĽøÖ÷ÒªÌåÏÖÔÚÒÔϼ¸¸ö·½Ã棺
Ëٶȸü¿ì£ºTensorFlow 1.0°æ±¾²ÉÓÃÁËXLAµÄ±àÒë¼¼Êõ£¬¸Ä½øÁËTensorFlowµÄÔËÐÐÐÔÄܼ°ÄÚ´æÀûÓᣴÓBenchmarkÎÊÌâµÄ²âÊÔ½á¹ûÀ´¿´£¬¶Ôµ¥»úInception
v3Ä£ÐÍ£¬ÊµÏÖÁËÔÚµ¥»ú8 GPUsÉÏ7.3±¶µÄÔËËã¼ÓËÙ£»¶Ô·Ö²¼Ê½Inception v3Ä£ÐÍ£¬ÊµÏÖÁËÔÚ¶à»ú64
GPUsÉÏ58±¶µÄÔËËã¼ÓËÙ¡£
¸ü¼ÓÁé»î£º¸Ã°æ±¾³ýÁËÖ§³Ötf.layers£¬tf.metrics¼°tf.lossesÄ£Ð͵ÄHigh-Level
APIÍ⣬ʵÏÖÁ˶Ôkeras£¨high-level neural networks library£©APIµÄÈ«Ãæ¼æÈÝ¡£
¸ü²úÆ·»¯£ºTensorFlow Python APIÔÚv1.0°æ±¾ÖÐÇ÷ÓÚÎȶ¨£¬Îª²úÆ·¼æÈÝÐÔ´òϼáʵ»ù´¡¡£
ÔÚTensorFlow 1.0°æ±¾·¢²¼µÄµ±Ì죬¹È¸è¹«Ë¾»¹¾Ù°ìÁËTensorFlow 2017 DEV
Summit¡£¸ÃÈÕ³ÌÖ÷Òª°üÀ¨ÒÔϼ¸¸ö·½ÃæµÄÖ÷ÌâÑݽ²£º
XLA (TensorFlow, Compiled)±àÒë¼¼Êõ £º½éÉܲÉÓÃXLA¼¼Êõ×îС»¯Í¼¼ÆËãÖ´ÐÐʱ¼äºÍ×î´ó»¯ÀûÓüÆËã×ÊÔ´£¬ÓÃÓÚ¼õÉÙÊý¾ÝѵÁ·ºÍÄ£Ðͽá¹ûÍÆ¶Ïʱ¼ä¡£
Hands-on TensorBoard¿ÉÊÓ»¯¼¼Êõ£º½éÉÜÁËÈçºÎʹÓÃTensorBoard£¬ÒÔ¼°TensorFlowͼģÐÍ¡¢ÑµÁ·Êý¾ÝµÄ¿ÉÊÓ»¯µÈ¡£
TensorFlow High-Level API£º½éÉÜÁËʹÓÃLayers, Estimators,
and Canned Estimators High-Level API¶¨ÒåѵÁ·Ä£ÐÍ¡£
Integrating Keras & TensorFlow: ½éÉÜÁËÈçºÎÔÚTensorFlowÖÐʹÓÃKeras
API½øÐÐÄ£ÐͶ¨Ò弰ѵÁ·¡£
TensorFlow at DeepMind£º½éÉÜÁËÔÚDeepMindÖÐʹÓÃTensorFlowƽ̨µÄµäÐͰ¸Àý£¬°üÀ¨AlphaGoµÈÓ¦Óá£
Skin Cancer Image Classification£º½éÉÜÁË˹̹¸£Ò½Ñ§ÔºÊ¹ÓÃTensorFlow·ÖÀàÆ¤·ô°©ÕÕÆ¬£¬ÓÃÓÚҽѧÕï¶Ï¡£
Mobile and Embedded TensorFlow£º½éÉÜÁËÈçºÎ°ÑTensorFlowÄ£ÐÍÔËÐÐÔÚÒÆ¶¯ÖÕ¶Ë¡¢Ç¶ÈëʽÉ豸£¬°üÀ¨°²×¿£¬iOSµÈϵͳ¡£
Distributed TensorFlow£ºÏµÍ³ÐԵؽéÉÜÁË·Ö²¼Ê½TensorFlowµÄÏà¹Ø¼¼Êõ£¬ÒÔ¼°ÈçºÎÓ¦ÓÃÓÚ´ó¹æÄ£Ä£ÐÍѵÁ·¡£
TensorFlow Ecosystem£º½²½âÁËTensorFlowµÄÉú̬ϵͳ£¬°üÀ¨Éú³ÉѵÁ·Êý¾Ý£¬·Ö²¼Ê½ÔËÐÐTensorFlowºÍserving
modelsµÄ²úÆ·»¯Á÷³Ì¡£
Serving Models in Production with TensorFlow Serving£ºÏµÍ³ÐÔ½²½âÁËÈçºÎÔÚÉú²ú»·¾³ÖÐÓ¦ÓÃTensorFlow
ServingÄ£ÐÍ¡£
ML Toolkit£º½éÉÜÁËTensorFlowµÄ»úÆ÷ѧϰ¿â£¬ÈçÏßÐԻع飬KMeansµÈË㷨ģÐ͵ÄʹÓá£
Sequence Models and the RNN API£º½éÉÜÁËÈçºÎ¹¹½¨¸ßÐÔÄܵÄsequence-to-sequenceÄ£ÐÍ£¬ÒÔ¼°Ïà¹ØAPI¡£
Wide & Deep Learning: ½éÉÜÁËÈçºÎ½áºÏWideÄ£ÐͺÍDeepÄ£Ð͹¹½¨×ÛºÏѵÁ·Ä£ÐÍ¡£
Magenta£¬Music and Art Generation£ºÊ¹ÓÃÔöÇ¿ÐÍÉî¶ÈѧϰģÐÍÉú³ÉÒôÀÖÉùÒôºÍÒÕÊõͼƬ¡£
Case Study£¬TensorFlow in Medicine - Retinal Imaging£ºÊ¹ÓÃTensorFlow»úÆ÷ѧϰƽ̨¶ÔҽѧÊÓÍøÄ¤Í¼Æ¬½øÐзÖÀ࣬¸¨ÖúҽѧÕï¶Ï¡£
TensorFlowϵͳ¼Ü¹¹
TensorFlow×÷Ϊ·Ö²¼Ê½»úÆ÷ѧϰƽ̨£¬Ö÷Òª¼Ü¹¹ÈçÏÂͼËùʾ¡£RPCºÍRDMAÎªÍøÂç²ã£¬Ö÷Òª¸ºÔð´«µÝÉñ¾ÍøÂçËã·¨²ÎÊý¡£CPUºÍGPUΪÉ豸²ã£¬Ö÷Òª¸ºÔðÉñ¾ÍøÂçËã·¨ÖоßÌåµÄÔËËã²Ù×÷¡£KernelΪTensorFlowÖÐËã·¨²Ù×÷µÄ¾ßÌåʵÏÖ£¬Èç¾í»ý²Ù×÷£¬¼¤»î²Ù×÷µÈ¡£Distributed
MasterÓÃÓÚ¹¹½¨×Óͼ£»Çиî×ÓͼΪ¶à¸ö·ÖƬ£¬²»Í¬µÄ×Óͼ·ÖƬÔËÐÐÔÚ²»Í¬µÄÉ豸ÉÏ£»Master»¹¸ºÔð·Ö·¢×Óͼ·ÖƬµ½Executor/Work¶Ë¡£Executor/WorkÔÚÉ豸£¨CPUs£¬GPUs£¬etc.£©ÉÏ£¬µ÷¶ÈÖ´ÐÐ×Óͼ²Ù×÷£»²¢¸ºÔðÏòÆäËüWorker·¢ËͺͽÓÊÕͼ²Ù×÷µÄÔËÐнá¹û¡£C
API°ÑTensorFlow·Ö¸îΪǰ¶ËºÍºó¶Ë£¬Ç°¶Ë£¨Python/C++/Java Client£©»ùÓÚC
API´¥·¢TensorFlowºó¶Ë³ÌÐòÔËÐС£Training librariesºÍInference
libsÊÇÄ£ÐÍѵÁ·ºÍÍÆµ¼µÄ¿âº¯Êý£¬ÎªÓû§¿ª·¢Ó¦ÓÃÄ£ÐÍʹÓá£

ÏÂͼΪClient¡¢Master¼°WorkerµÄÄÚ²¿¹¤×÷ÔÀí¡£"/job:worker/task:0"
ºÍ "/job:ps/task:0" ±íʾworkerÖеÄÖ´ÐзþÎñ¡£"job:ps"±íʾ²ÎÊý·þÎñÆ÷£¬ÓÃÓÚ´æ´¢¼°¸üÐÂÄ£ÐͲÎÊý¡£"job:worker"ÓÃÓÚÓÅ»¯Ä£ÐͲÎÊý£¬²¢·¢²ÎÊý·¢Ë͵½²ÎÊý·þÎñÆ÷ÉÏ¡£Distributed
MasterºÍWorker ServiceÖ»´æÔÚÓÚ·Ö²¼Ê½TensorFlowÖС£µ¥»ú°æ±¾µÄTensorFlowʵÏÖÁËLocalµÄSession£¬Í¨¹ý±¾µØ½ø³ÌµÄÄÚ²¿Í¨Ñ¶ÊµÏÖÉÏÊö¹¦ÄÜ¡£

Óû§±àдTensorFlowÓ¦ÓóÌÐòÉú³É¼ÆËãͼ£¬Client×é¼þ»á´´½¨Session£¬²¢Í¨¹ýÐòÁл¯¼¼Êõ£¬·¢ËÍͼ¶¨Òåµ½Distributed
Master×é¼þ¡£ÏÂͼÖУ¬Client´´½¨ÁËÒ»¸ö s+=w*x+bµÄͼ¼ÆËãÄ£ÐÍ¡£
µ±Client´¥·¢SessionÔËËãµÄʱºò£¬Maser¹¹½¨½«ÒªÔËÐеÄ×Óͼ¡£²¢¸ù¾ÝÉ豸Çé¿ö£¬Çиî×ÓͼΪ¶à¸ö·ÖƬ¡£ÏÂÃæÎªMaster¹¹½¨µÄÔËÐÐ×Óͼ£º

½Ó×ÅÇиî×Óͼ£¬°ÑÄ£ÐͲÎÊý·Ö×éÔÚ²ÎÊý·þÎñÆ÷ÉÏ£¬Í¼¼ÆËã²Ù×÷·Ö×éÔÚÔËËãWorkerÉÏ¡£ÏÂͼΪһÖÖ¿ÉÐеÄͼÇиî²ßÂÔ£º

Distributed Master»á¸ù¾ÝÄ£ÐͲÎÊýµÄ·ÖÇøÇé¿ö½øÐÐÇиî±ß£¬ÔÚTask¼ä²åÈë·¢ËͺͽÓÊÕTensorÐÅÏ¢µÄͨÐŽڵ㣬ÈçÏÂͼËùʾ£º

½Ó×ÅDistributed Masterͨ¹ýRegisterGraph·½·¨·¢ËÍ×Óͼ·ÖƬ¸øTask£¬ÈçÏÂͼËùʾ£º

Masterͨ¹ýRunGraph´¥·¢×ÓͼÔËË㣬Worker»áʹÓÃGPU/CPUÔËËãÉ豸ִÐÐTensorFlow
KernelÔËËã¡£ÔÚ±¾½ÚµãµÄCPUºÍGPUÖ®¼ä£¬Ê¹ÓÃcudaMemcpyAsync´«ÊäÊý¾Ý£»ÔÚ±¾½ÚµãGPUºÍGPUÖ®¼ä£¬Ê¹ÓÃpeer-to-peer
DMA´«ÊäÊý¾Ý£¬±ÜÃâͨ¹ýCPU¸´ÖÆÊý¾Ý¡£TensorFlowʹÓÃgRPC£¨TCP£©ºÍRDMA £¨Converged
Ethernet£©¼¼Êõ£¬ÊµÏÖWorker¼äµÄÊý¾ÝͨÐż°´«Ê䣬ÈçÏÂͼËùʾ£º

¸ßÐÔÄܳÌÐòÉè¼Æ
TensorFlowÄں˲ÉÓÃC/C++¿ª·¢£¬²¢ÌṩÁËC++£¬Python£¬Java£¬GoÓïÑÔµÄClient
API¡£ÌرðÊÇPython API£¬ÊÇĿǰÖ÷Á÷µÄTensorFlowÄ£ÐÍ¿ª·¢½Ó¿Ú¡£µ«ÎªÊ²Ã´»¹ÐèÒª²ÉÓÃC++
APIȥѵÁ·Ä£ÐÍÄØ£¿±¾ÎÄ»ùÓÚÈçÏÂÁ½µã¿¼ÂÇ£¬Ê×Ïȵ±ÎÒÃDzÉÓÃPython APIȥѵÁ·Ä£Ð͵Äʱºò£¬ÐèÒª²»¶ÏµØÓÃPython
APIµ÷ÓÃC/C++µ×²ã½Ó¿Ú£¬Öظ´µÄ½Ó¿Úµ÷ÓÃÒ»¶¨³Ì¶ÈÉÏÓ°ÏìÁ˳ÌÐòµÄÖ´ÐÐÐÔÄÜ¡£¸üÎªÖØÒªµÄÊÇ£¬ÔÚGPUÉÏѵÁ·Ä£Ð͵ÄʱºòÐèÒª´óÁ¿µÄÄÚ´æ½»»»£»Èç¹û²ÉÓÃC++
APIȥѵÁ·Ä£ÐÍ£¬¿ÉÌṩ¸üºÃµÄÔËËãÐÔÄܼ°¸üºÃµØ¿ØÖÆGPUÄÚ´æµÄ·ÖÅä¡£
ÏÂͼΪPython APIµÄÔËËã¼Ü¹¹£ºÔÚÄ£ÐÍѵÁ·µÄÿ´Îµü´úÖУ¬³ÌÐòͨ¹ýPython API¶ÁÈ¡Batch
Data£¬È»ºóͨ¹ýTensorFlow Session Run½Ó¿Ú£¬´«µÝÊý¾Ý¸øC++£¬²¢´¥·¢Éñ¾ÍøÂçѵÁ·¡£ÈçÏÂͼËùʾ£º

ÏÂͼΪC++ APIµÄÔËËã¼Ü¹¹£ºÔÚÄ£ÐÍѵÁ·µÄÿ´Îµü´úÖУ¬Í¨¹ýC++ API¶ÁÈ¡Batch Dataºó£¬Ö±½Ó´¥·¢Ä£ÐÍѵÁ·¡£¼õÉÙÁ˲»Í¬ÓïÑÔ¼äAPI½Ó¿ÚµÄÑ»·µ÷Óü°Êý¾Ý´«Êä¡£ÈçÏÂͼËùʾ£º

ΪÁ˲ÉÓÃC++ API½øÐÐÄ£ÐÍѵÁ·£¬ÎÒÃÇÊ×ÏÈÐèÒª±àдѵÁ·Ä£ÐÍ£¬Õâ¸ö±àд¹ý³Ì¿ÉÒÔ²ÉÓÃPythonÓïÑÔÀ´Íê³É¡£ÎÒÃÇÊ×ÏȲÉÓÃPython
API±àдѵÁ·Ä£ÐÍ£¬È»ºó°ÑͼģÐÍת»»ÎªProtobufµÄÐòÁл¯Îļþ¡£½Ó×Åͨ¹ýC++ API¼ÓÔØ¸ÃÄ£ÐÍÎļþ£¬´´½¨TensorFlow
Session£¬³õʼ»¯Ä£ÐͱäÁ¿£¬ÒÔ¼°¼ÓÔØÑµÁ·Êý¾Ý²¢Ö´ÐÐÉñ¾ÍøÂçѵÁ·¡£³ÌÐò¼Ü¹¹ÈçÏÂͼËùʾ£º

ÏÂÃæÎªÊ¹ÓÃPython API¶¨ÒåѵÁ·Ä£Ð͵ÄʾÀý£º
with tf.Session() as sess:
#¶¨ÒåPlaceholder Tensor½ÓÈëѵÁ·Êý¾Ý
x = tf.placeholder(tf.float32, [None, 32], name="x")
y = tf.placeholder(tf.float32, [None, 8], name="y")
#¶¨ÒåѵÁ·Ä£ÐÍ
w1 = tf.Variable (tf.truncated_normal([32, 16],
stddev=0.1))
b1 = tf.Variable (tf.constant(0.0, shape=[16]))
w2 = tf.Variable (tf.truncated_normal([16, 8],
stddev=0.1))
b2 = tf.Variable (tf.constant(0.0, shape=[8]))
a = tf.nn.tanh (tf.nn.bias_add(tf.matmul(x,
w1), b1))
y_out = tf.nn.tanh (tf.nn.bias_add(tf.matmul(a,
w2), b2), name="y_out")
cost = tf.reduce_sum (tf.square(y-y_out), name="cost")
optimizer = tf.train. AdamOptimizer().minimize(cost,
name="train")
#¶¨Òå±äÁ¿³õʼ»¯²Ù×÷
init = tf.initialize_variables(tf.all_variables(),
name='init_all_vars_op')
#°ÑͼģÐÍת»»ÎªProtobufÎļþ
tf.train.write_graph(sess.graph_def, './', 'mlp.pb',
as_text=False) |
ÏÂÃæÎªÊ¹ÓÃC++ API¼ÓÔØProtobufͼģÐÍ£¬²¢Ö´ÐÐѵÁ·µÄʾÀý£º
#include "tensorflow/core/public/session.h"
#include "tensorflow/core/graph/default_device.h"
using namespace tensorflow;
int main(int argc, char* argv[]) {
//ProtobufÄ£ÐÍÎļþÃû
std::string graph_definition = "mlp.pb";
//Tensorflow Sesssion
Session* session;
//¶¨ÒåͼģÐͶÔÏó
GraphDef graph_def;
SessionOptions opts;
//´æ´¢Session»á»°µÄÔËÐнá¹û
std::vector<Tensor> outputs;
#¼ÓÔØProtobufÄ£ÐÍÎļþµ½Í¼Ä£ÐͶÔÏóÖÐ
TF_CHECK_OK(ReadBinaryProto (Env::Default(),
graph_definition, &graph_def));
// ĬÈÏÔÚgpu 0ÉÏÖ´ÐÐÄ£Ð͵ÄѵÁ·²Ù×÷
graph::SetDefaultDevice("/gpu:0",
&graph_def);
//É趨GPUÏÔ´æÊ¹ÓòÎÊý
opts.config.mutable_gpu_options() -> set_per_process_gpu_memory_fraction(0.5);
opts.config.mutable_gpu_options()-> set_allow_growth(true);
//´´½¨TensorFlow»á»°
TF_CHECK_OK(NewSession(opts, &session));
// ¼ÓÔØÍ¼¶ÔÏ󵽻ỰÖÐ
TF_CHECK_OK(session->Create(graph_def));
// Ö´ÐÐÄ£ÐͲÎÊý³õʼ»¯²Ù×÷
TF_CHECK_OK(session->Run({}, {}, {"init_all_vars_op"},
nullptr));
//¶¨ÒåÄ£ÐÍÊäÈëÊý¾Ý£¬°üÀ¨Êý¾ÝÀàÐͺÍά¶ÈÐÅÏ¢
Tensor x(DT_FLOAT, TensorShape({100, 32}));
Tensor y(DT_FLOAT, TensorShape({100, 8}));
//°ÑTensorת»»Îª¾ØÕ󣬲¢³õʼ»¯TensorÊý¾Ý
auto _XTensor = x.matrix<float>();
auto _YTensor = y.matrix<float>();
_XTensor.setRandom();
_YTensor.setRandom();
for (int i = 0; i < 10; ++i) {
//Ö´ÐÐÄ£Ð͵ÄѵÁ·²Ù×÷£¬{{"x", x}, {"y",
y}} ±íʾÊäÈëÊý¾ÝTensorÃû³ÆºÍTensor¶ÔÏó£»{"cost"}±íʾҪ»ñÈ¡Êä³öÖµµÄ²Ù×÷Ãû³Æ£»
&outputs±íʾִÐÐ"cost"²Ù×÷ºó·µ»ØµÄTensor¶ÔÏó
TF_CHECK_OK(session->Run({{"x",
x}, {"y", y}}, {"cost"},
{}, &outputs));
//»ñȡִÐС°cost¡°²Ù×÷ºóµÄÔËËã½á¹û
float cost = outputs[0].scalar<float>()(0);
std::cout << "Cost: " <<
cost << std::endl;
//Ö´ÐÐ"train"²Ù×÷
TF_CHECK_OK(session->Run({{"x",
x}, {"y", y}}, {}, {"train"},
nullptr)); // Train
outputs.clear();
}
//¹Ø±ÕSession¼°É¾³ýSession¶ÔÏó
session->Close();
delete session;
return 0;
} |
µ±C++³ÌÐòдºÃºó£¬±àÒëʱºòÐèÒªÁ´½ÓµÄÍ·Îļþ£¬¿ªÔ´ÒѾ°ïÎÒÃÇÕûÀíºÃÁË£¬´æ·ÅÓÚĿ¼/usr/lib/python2.7/site-packages/tensorflow/includeÏ¡£±àÒëºÍÔËÐеÄʱºòÐèÒªÁ´½Ólibtensorflow_cc.so£¬¿ÉÒÔ°´ÕÕÏÂÃæµÄ·½Ê½±àÒë¸Ã¿âÎļþ£ºbazel
build -c opt //tensorflow:libtensorflow_cc.so --copt=-m64
--linkopt=-m64 --spawn_strategy=standalone --genrule_strategy=standalone
--verbose_failures¡£¾ßÌå¿É²Î¿¼TensorFlowÔ´´úÂëµÄ¹Ù·½±àÒëÎĵµ¡£
×ܽá
±¾ÎÄÊ×ÏȻعËÁËTensorFlow 1.0Ö÷ÒªÐÂÌØÐÔ¼°TensorFlow 2017 Dev SummitµÄÖ÷ÒªÒé³Ì¡£µ½Ä¿Ç°ÎªÖ¹TensorFlowµÄGitHub
StarÅÅÃûΪ51000+£¬ ForkÅÅÃûÒÑ´ï24000+£¬ÓÐ15000+ commits¡£²¢Ëæ×ÅTensorFlowа汾µÄ²»¶Ï·¢²¼ÒÔ¼°ÐÂÌØÐԵIJ»¶ÏÔö¼Ó£¬TensorFlowʹÓøü¼ÓÁé»î£¬ÔËÐÐËٶȸü¿ì£¬Ê¹Ó÷½Ê½¸ü²úÆ·»¯£¬ÒѳÉΪĿǰÖ÷Á÷µÄÉî¶Èѧϰƽ̨֮һ¡£
½Ó׎éÉÜÁËTensorFlowµÄϵͳ¼Ü¹¹£¬°üÀ¨Client£¬Master£¬Worker£¬KernelµÄÏà¹Ø¸ÅÄî¼°ÔËÐз½Ê½£¬ÊÇÒ»ÖÖÊʺϴó¹æÄ£·Ö²¼Ê½ÑµÁ·µÄ»úÆ÷ѧϰƽ̨¡£´ÓÉÏÊöϵͳ¼Ü¹¹ÖпÉÒÔ¿´µ½£¬TensorFlowÄں˲ÉÓÃC/C++¿ª·¢£¬µ±²ÉÓÃPython
APIȥѵÁ·Ä£Ð͵Äʱºò£¬ÐèÒª²»¶ÏµØÓÃPythonµ÷ÓÃC/C++µ×²ã½Ó¿Ú£¬Öظ´µÄ½Ó¿Úµ÷ÓÃÒ»¶¨³Ì¶ÈÉÏÓ°ÏìÁ˳ÌÐòµÄÖ´ÐÐÐÔÄÜ¡£Èç¹ûÓÐ×îÇó¸ßÐÔÄÜÔËËãµÄÅóÓÑ£¬¿ÉÒÔ³¢ÊÔÓÃϱ¾ÎĸßÐÔÄÜÔËËãÕ½ÚÍÆ¼öµÄ·½·¨¡£ |