
ãã€ã¯ããœããã¯ã人工ç¥èœã®éçºãä¿é²ããããã«å瀟ã䜿çšããããŒã«ã®ãœãŒã¹ã³ãŒããå
¬éããŸãããComputationalNetwork Toolkitã¯ãGithubã§å©çšå¯èœã«ãªããŸããã å©çšå¯èœãªããŒã«ã®åäœãé
ããããããéçºè
ã¯ç¬èªã®ãœãªã¥ãŒã·ã§ã³ãäœæããå¿
èŠããããŸããã éçã³ãŒãã¢ãã©ã€ã¶ãŒã§ãã®ãããžã§ã¯ãããã§ãã¯ããçµæãèŠãŠã¿ãŸãããã
ã¯ããã«
Computational Network Toolkit ïŒCNTKïŒ-ãã¿ãŒã³èªèãé³å£°ç解ãããã¹ãåæãªã©ã«äœ¿çšã§ããããŸããŸãªã¿ã€ãã®ãããã¯ãŒã¯ãèšèšããã³ãã¬ãŒãã³ã°ããããã®ããŒã«ã®ã»ããã
PVS-Studioã¯ãCãC ++ãCïŒã§èšè¿°ãããããã°ã©ã ã®ãœãŒã¹ã³ãŒãã®ãšã©ãŒãæ€åºããããã®éçã¢ãã©ã€ã¶ãŒã§ãã PVS-StudioããŒã«ã¯ãææ°ã®ã¢ããªã±ãŒã·ã§ã³ã®éçºè
åãã§ãããVisual Studio 2010-2015ç°å¢ã«çµ±åãããŸãã
次ã®
éããŠãããããžã§ã¯ãã®ãã§ãã¯ã«é¢ããèšäºãæºåããéã«ãéçã¢ãã©ã€ã¶ãŒãæäŸãããã¹ãŠã®èŠåã«é¢ããæ
å ±ã決ããŠæäŸããŸããã ãããã£ãŠããããžã§ã¯ãã®äœæè
ãç¬èªã«åæãå®è¡ããã¢ãã©ã€ã¶ãŒã«ãã£ãŠçºè¡ããããã¹ãŠã®ã¡ãã»ãŒãžã調æ»ããããšããå§ãããŸãã ãã°ããã®éããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®éçºè
ãžã®éµãæäŸããŸãã
ãšã©ãŒã¯ã»ãšãã©ãªãã£ããšèšããããåŸãŸããã ãããŠãããã¯äºæ³ãããããšã§ãã ãã€ã¯ããœããã®è£œåã³ãŒãã¯éåžžã«é«å質ã§ããããã§ã«äœåºŠããããèŠãŠããŸãããå瀟ãåŸã
ã«ãªãŒãã³ããŠãããããžã§ã¯ãããã§ãã¯ããŠããŸãã ãã ããéçåæã®æå³ã¯ãå®æçãªãã§ãã¯ã§ããã1åéãã®ããã£ããªãŒã¬ã€ããã§
ã¯ãªãããšã
å¿ããªãã§ãã ãã ã
ãããã¿ã€ããã¹
ã¿ã€ããã¹ã¯ã¿ã€ãã³ã°æã®äžå¿«ãªäºæ
ã§ãã 圌ãã¯ãœãŒã·ã£ã«ãããã¯ãŒã¯ãæ¬ããªã³ã©ã€ã³åºçç©ãããã«ã¯ãã¬ãã«ãŸã§äŸµå
¥ããŸããã ãã¬ãŒã³ããã¹ãã§ã¯ãããã¹ããšãã£ã¿ãŒã§ã®ã¹ãã«ãã§ãã¯ã圹ç«ã¡ãŸããããã°ã©ãã³ã°ã§ã¯ããœãŒã¹ã³ãŒãã®éçåæãããã«é©ããŠããŸãã
V501 '||'ã®å·Šãšå³ã«åäžã®å¯æ¬¡åŒ 'ïŒå
¥åïŒ0ïŒ-> HasMBLayoutïŒïŒ'ããããŸãã æŒç®åã trainingnodes.h 1416
virtual void Validate(bool isFinalValidationPass) override { .... if (isFinalValidationPass && !(Input(0)->GetSampleMatrixNumRows() == Input(2)->GetSampleMatrixNumRows() && (Input(0)->GetMBLayout() == Input(2)->GetMBLayout() || !Input(0)->HasMBLayout() ||
ãã®ãã©ã°ã¡ã³ãã®ãã©ãŒãããã¯ãæ確ã«ããããã«å€§ããå€æŽãããŠããŸãã ãã®åŸã«ãªã£ãŠãæ¡ä»¶ã«2ã€ã®åäžã®ãã§ãã¯ãïŒInputïŒ0ïŒ-> HasMBLayoutïŒïŒããå«ãŸããããšãæããã«ãªããŸããã ãããããããã±ãŒã¹ã§ã¯ãã€ã³ããã¯ã¹ã2ãã®èŠçŽ ã䜿çšããããšèããŠããŸããã
V501 ã-ãæŒç®åã®å·Šå³ã«åãå¯æ¬¡åŒããããŸããi0-i0 ssematrix.h 564
void assignpatch(const ssematrixbase &patch, const size_t i0, const size_t i1, const size_t j0, const size_t j1) { .... for (size_t j = j0; j < j1; j++) { const float *pcol = &patch(i0 - i0, j - j0);
ã·ã°ãããã®ãããåŒãi0-i0ãã¯åžžã«ãŒãã§ãã ããããã圌ãã¯ãi1-i0ããŸãã¯ãj-i1ãããŸãã¯äœãä»ã®ãã®ãæžãããã£ãã®ã§ãããã éçºè
ã¯ãã®å Žæã確èªããå¿
èŠããããŸãã
V596ãªããžã§ã¯ãã¯äœæãããŸãããã䜿çšãããŠããŸããã ãthrowãããŒã¯ãŒããæ¬ èœããŠããå¯èœæ§ããããŸãïŒthrow runtime_errorïŒFOOïŒ; simplenetworkbuilder.cpp 1578
template <class ElemType> ComputationNetworkPtr SimpleNetworkBuilder<ElemType>:: BuildNetworkFromDbnFile(const std::wstring& dbnModelFileName) { .... if (this->m_outputLayerSize >= 0) outputLayerSize = this->m_outputLayerSize; else if (m_layerSizes.size() > 0) m_layerSizes[m_layerSizes.size() - 1]; else std::runtime_error("Output layer size must be...");
ãšã©ãŒã¯ããthrowãããŒã¯ãŒãã誀ã£ãŠå¿ããããããšã§ãã ãã®çµæããã®ã³ãŒãã¯ãšã©ãŒã®å Žåã«äŸå€ãã¹ããŒããŸããã ã³ãŒãã®ä¿®æ£ããŒãžã§ã³ïŒ
.... else throw std::runtime_error("Output layer size must be..."); ....
ãã¡ã€ã«ãæäœãã
V739 EOFã¯ããcharãã¿ã€ãã®å€ãšæ¯èŒããªãã§ãã ããã ãcãã¯ãintãã¿ã€ãã§ãªããã°ãªããŸããã fileutil.cpp 852
string fgetstring(FILE* f) { string res; for (;;) { char c = (char) fgetc(f);
ã¢ãã©ã€ã¶ãŒã¯ãEOFå®æ°ã 'char'åã®å€æ°ãšæ¯èŒãããããšãæ€åºããŸããã ããã¯ãäžéšã®æåãããã°ã©ã ã«ãã£ãŠæ£ããåŠçãããªãããšã瀺ããŠããŸãã
EOFã®å®£èšæ¹æ³ãæ€èšããŠãã ããã
#define EOF (-1)
ã芧ã®ãšãããEOF㯠'int'åã® '-1'ã«ãããŸããã fgetcïŒïŒé¢æ°ã¯ãã¿ã€ã 'int'ã®å€ãè¿ããŸãã ã€ãŸãã0ã255ãŸãã¯-1ïŒEOFïŒã®æ°å€ãè¿ãããšãã§ããŸãã èªã¿åãããå€ã¯ãã¿ã€ããcharãã®å€æ°ã«å
¥ããããŸãã ãã®ãããå€ã0xFFïŒ255ïŒã®æåã¯-1ã«ãªãããã¡ã€ã«ã®çµããïŒEOFïŒã®ããã«è§£éãããŸãã
æ¡åŒµASCIIã³ãŒãã䜿çšããŠãããŠãŒã¶ãŒã¯ãã¢ã«ãã¡ãããã®æåã®1ã€ãããã°ã©ã ã«ãã£ãŠèª€ã£ãŠåŠçããããšããšã©ãŒãçºçããå ŽåããããŸãã
ããšãã°ã
Windows-1251ãšã³ã³ãŒãã£ã³ã°ã®ãã·ã¢èªã®ã¢ã«ãã¡ãããã®æåŸã®æåã¯ãã³ãŒã0xFFã®ã¿ãæã¡ãããã°ã©ã ã«ãã£ãŠãã¡ã€ã«ã®çµããã®ã·ã³ãã«ãšããŠèªèãããŸãã
ä¿®æ£ãããã³ãŒãã¹ããããïŒ
int c = fgetc(f); if (c == EOF) RuntimeError(....);
V547åŒ 'val [0] == 0xEF'ã¯åžžã«falseã§ãã charåã®å€ã®ç¯å²ïŒ[-128ã127]ã file.cpp 462
bool File::IsUnicodeBOM(bool skip) { .... else if (m_options & fileOptionsText) { char val[3]; file.ReadString(val, 3); found = (val[0] == 0xEF && val[1] == 0xBB && val[2] == 0xBF); }
ããã©ã«ãã§ã¯ãã¿ã€ããcharãã®å€ã®ç¯å²ã¯[-127; 127]ã§ãã ã³ã³ãã€ã«ãã©ã°/ Jã䜿çšãããšãç¯å²[0; 255]ã䜿çšããããã³ã³ãã€ã©ãŒã«æ瀺ã§ããŸãã ãã ãããã®ãœãŒã¹ãã¡ã€ã«ã«ã¯ãã®ãããªãã©ã°ãæå®ãããŠããªãããããã®ãããªã³ãŒãã¯ãã¡ã€ã«ã«
BOMãå«ãŸããŠãããšå€æããããšã¯ãããŸããã
ã¡ã¢ãªãæäœãã
V595 nullptrã«å¯ŸããŠæ€èšŒãããåã«ããm_rowIndicesããã€ã³ã¿ãŒã䜿çšãããŸããã è¡ã確èªïŒ171ã175ãlibsvmbinaryreader.cpp 171
template <class ElemType> void SparseBinaryMatrix<ElemType>::ResizeArrays(size_t newNNz) { .... if (m_nnz > 0) { memcpy(rowIndices, m_rowIndices, sizeof(int32_t)....);
ã¢ãã©ã€ã¶ãŒã¯ãnullãã€ã³ã¿ãŒã®éåç
§ã®å¯èœæ§ãæ€åºããŸããã ã³ãŒãã«ãã€ã³ã¿ãŒãšãŒãã®æ¯èŒãå«ãŸããŠããããã³ãŒãå
ã§ãã®ãã€ã³ã¿ãŒãæ€èšŒãªãã§äœ¿çšãããå Žåããã®ãããªã³ãŒãã¯çãããå±éºã§ãã
memcpyïŒïŒé¢æ°ã¯ãã¢ãã¬ã¹ 'm_rowIndices'ããã³ 'm_values'ã«ãããã€ããã³ããŒããŸããããããã®ãã€ã³ã¿ãŒãéåç
§ããŸããäžèšã®ã³ãŒãäŸã§ã¯ãæœåšçã«nullã«ãªãå¯èœæ§ããããŸãã
V510 'sprintf_s'é¢æ°ã¯ã3çªç®ã®å®åŒæ°ãšããŠã¯ã©ã¹åå€æ°ãåãåãããšãæåŸ
ãããŠããŸããã binaryfile.cpp 501
const std::wstring& GetName() { return m_name; } Section* Section::ReadSection(....) { .... char message[256]; sprintf_s(message,"Invalid header in file %ls, in header %s\n", m_file->GetName(), section->GetName());
sprint_sïŒïŒé¢æ°ã®å®éã®ãã©ã¡ãŒã¿ãŒã¯ãPODã¿ã€ãã®ã¿ã§ãã PODã¯ãPlain Old Dataãã®ç¥èªã§ããSimple C-style DataããšããŠç¿»èš³ã§ããŸãã
ãStd :: wstringãã¯PODã¿ã€ãã«ã¯é©çšãããŸããã æååãžã®ãã€ã³ã¿ã®ä»£ããã«ããªããžã§ã¯ãã®ã³ã³ãã³ããã¹ã¿ãã¯ã«é
眮ãããŸãã ãã®ãããªã³ãŒãã¯ããããã¡å
ã®ãæå³äžæãã®åœ¢æããŸãã¯ããã°ã©ã ã®ç°åžžçµäºã«ã€ãªãããŸãã
ä¿®æ£ããããªãã·ã§ã³ïŒ
sprintf_s(message,"Invalid header in file %ls, in header %s\n", m_file->GetName().c_str(), section->GetName().c_str());
V630 ãmallocãé¢æ°ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãå«ãã¯ã©ã¹ã§ãããªããžã§ã¯ãã®é
åã«ã¡ã¢ãªãå²ãåœãŠãããã«äœ¿çšãããŸãã ã©ãã£ã¹ãã©ã¯ãŒãããã¯ã¯ãŒã.cpp 912
void lattice::forwardbackwardalign() { .... aligninfo *refinfo; unsigned short *refalign; refinfo = (aligninfo *) malloc(sizeof(aligninfo) * 1);
ãã®ã³ãŒããã©ã°ã¡ã³ãã§ã¯ããaligninfoãã¿ã€ãã®æ§é ã«å¯Ÿããåçã¡ã¢ãªã®èª€ã£ãå²ãåœãŠãèŠã€ãããŸããã å®éãæ§é äœã®å®çŸ©ã«ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒãããããã®ã¡ã¢ãªå²ãåœãŠæ¹æ³ã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã¯åŒã³åºãããŸããã freeïŒïŒé¢æ°ã䜿çšããŠã¡ã¢ãªã解æŸããå Žåããã¹ãã©ã¯ã¿ãåŒã³åºãããŸããã
以äžã¯ããaligninfoãã¿ã€ãã®èšè¿°ã³ãŒãã§ãã
struct aligninfo // phonetic alignment { unsigned int unit : 19;
ä¿®æ£ããããªãã·ã§ã³ïŒ
aligninfo *refinfo = new aligninfo();
ãããŠãã¡ãããã¡ã¢ãªã解æŸããã«ã¯ãæŒç®åãdeleteããåŒã³åºãå¿
èŠããããŸãã
V599 ãIDataWriterãã¯ã©ã¹ã«ã¯ä»®æ³é¢æ°ãå«ãŸããŠããŸãããä»®æ³ãã¹ãã©ã¯ã¿ã¯ååšããŸããã datawriter.cpp 47
IDataWriter<ElemType>* m_dataWriter; .... template <class ElemType> void DataWriter<ElemType>::Destroy() { delete m_dataWriter;
ã¢ãã©ã€ã¶ãŒã¡ãã»ãŒãžã¯ãç Žå£å¯èœãªãªããžã§ã¯ãã®ããŒã¹ã¿ã€ãã«ä»®æ³ãã¹ãã©ã¯ã¿ãŒããªãããšã瀺ããŸãã ãã®å Žåã掟çã¯ã©ã¹ã®ãªããžã§ã¯ãã®ç Žå£ã¯ãããã°ã©ã ã®æªå®çŸ©ã®åäœãå¿
èŠãšããŸãã å®éã«ã¯ãããã«ããã¡ã¢ãªãªãŒã¯ãçºçããããä»ã®ãªãœãŒã¹ã解æŸãããªãå¯èœæ§ããããŸãã ãã®èŠåã®åå ãç解ããŠã¿ãŸãããã
template <class ElemType> class DATAWRITER_API IDataWriter { public: typedef std::string LabelType; typedef unsigned int LabelIdType; virtual void Init(....) = 0; virtual void Init(....) = 0; virtual void Destroy() = 0; virtual void GetSections(....) = 0; virtual bool SaveData(....) = 0; virtual void SaveMapping(....) = 0; };
ã芧ã®ãšãããããã¯åºæ¬ã¯ã©ã¹ã®å®çŸ©ã§ããä»®æ³é¢æ°ãå«ãŸããŠããŸãããä»®æ³ãã¹ãã©ã¯ã¿ã¯ãããŸããã
m_dataWriter = new HTKMLFWriter<ElemType>();
ãããã£ãŠã掟çã¯ã©ã¹ãHTKMLFWriterãã®ãªããžã§ã¯ãã«ã¡ã¢ãªãå²ãåœãŠãããŸãã 説æãèŠã€ããŸãã
template <class ElemType> class HTKMLFWriter : public IDataWriter<ElemType> { private: std::vector<size_t> outputDims; std::vector<std::vector<std::wstring>> outputFiles; std::vector<size_t> udims; std::map<std::wstring, size_t> outputNameToIdMap; std::map<std::wstring, size_t> outputNameToDimMap; std::map<std::wstring, size_t> outputNameToTypeMap; unsigned int sampPeriod; size_t outputFileIndex; void Save(std::wstring& outputFile, ....); ElemType* m_tempArray; size_t m_tempArraySize; .... };
åºæ¬ã¯ã©ã¹ã«ä»®æ³ãã¹ãã©ã¯ã¿ããªãããããã®ãªããžã§ã¯ãã¯æ£ããç Žæ£ãããŸããã outputDimsãoutputFilesãªã©ã®ãã¹ãã©ã¯ã¿ã¯åŒã³åºãããŸããã äžè¬ã«ããäžå®ã®æ¯ãèããã¯ãããšåŒã°ããç¡é§ã§ã¯ãªãããããã¹ãŠã®çµæãäºæž¬ããããšã¯äžå¯èœã§ãã
ãã®ä»ã®ãšã©ãŒ
V502ãããããã?:ãæŒç®åã¯äºæ³ãšã¯ç°ãªãæ¹æ³ã§åäœããŸãã ãïŒïŒãæŒç®åã®åªå
é äœã¯ã|ããããäœã æŒç®åã sequenceparser.h 338
enum SequenceFlags { seqFlagNull = 0, seqFlagLineBreak = 1,
åªå
äžé
æŒç®å 'ïŒïŒ' äœåªå
床ã®ãããåäœã®ORã|ãã ãšã©ãŒã®ãããã©ã°ã¡ã³ããåå¥ã«æ€èšããŠãã ããã
0 | m_endSequence ? seqFlagStopLabel : 0 | seqFlagLineBreak
ã³ãŒãã§ã¯ããããããšã®æäœã¯æå®ããããã©ã°ã§ã®ã¿å®è¡ãããããšãäºæ³ãããŠããŸããããæŒç®åã®äºæããªãå®è¡é åºã®ããã«ãã0 | m_endSequenceãã§ã¯ãªããm_endSequenceïŒ seqFlagStopLabelïŒ0 | seqFlagLineBreakãã
äžè¬çã«ãããã¯èå³æ·±ãã±ãŒã¹ã§ãã ãšã©ãŒã«ãããããããã³ãŒãã¯æ£ããæ©èœããŸãã è² ããORã0ã®å Žåãå¹æã¯ãããŸããã ããã«ããããããããšã©ãŒã¯æé©ã«ä¿®æ£ãããŸãã
ããã«2ã€ã®ãã®ãããªå ŽæïŒ
- V502ãããããã?:ãæŒç®åã¯äºæ³ãšã¯ç°ãªãæ¹æ³ã§åäœããŸãã ãïŒïŒãæŒç®åã®åªå
é äœã¯ã|ããããäœã æŒç®åã sequenceparser.h 433
- V502ãããããã?:ãæŒç®åã¯äºæ³ãšã¯ç°ãªãæ¹æ³ã§åäœããŸãã ãïŒïŒãæŒç®åã®åªå
é äœã¯ã|ããããäœã æŒç®åã sequenceparser.h 598
V530é¢æ° 'size'ã®æ»ãå€ã䜿çšããå¿
èŠããããŸãã basics.h 428
äžèšã®ã³ã¡ã³ãã瀺ããŠããããã«ããã®æç¹ã§ééãã¯ãããŸããããç§ã¯çç±ã®ããã«ãã®äŸãæããŸããïŒ
ãŸããã³ã³ãã€ã©ã®èŠåãç¡å¹ã«ããããã«ãUNREFERENCED_PARAMETERãã¯ãããããŸãããã®ãã¯ãã®ååã¯ãé¢æ°ãã©ã¡ãŒã¿ãŒãæå³çã«äœ¿çšãããŠããªãããšãæ確ã«ç€ºããŠããŸãã
#define UNREFERENCED_PARAMETER(P) (P) static inline double todouble(const std::string& s) { UNREFERENCED_PARAMETER(s); .... }
第äºã«ããšã©ãŒã瀺ãå¯èœæ§ãé«ãå¥ã®ã¢ãã©ã€ã¶ãŒèŠåã衚瀺ãããïŒ
V530é¢æ° 'empty'ã®æ»ãå€ã䜿çšããå¿
èŠããããŸãã utterancesourcemulti.h 340
template <class UTTREF> std::vector<shiftedvector<....>>getclassids(const UTTREF &uttref) { std::vector<shiftedvector<....>> allclassids; allclassids.empty();
emptyïŒïŒé¢æ°ã®çµæã䜿çšããªãããšã¯æå³ããããŸããã ã»ãšãã©ã®å Žåã圌ãã¯clearïŒïŒé¢æ°ã䜿çšããŠãã¯ãã«ãã¯ãªã¢ãããã£ãã®ã§ãããã
åæ§ã®å ŽæïŒ
- V530é¢æ° 'empty'ã®æ»ãå€ã䜿çšããå¿
èŠããããŸãã utterancesourcemulti.h 364
V688ããŒã«ã«å€æ°ãm_fileãã¯ã¯ã©ã¹ã¡ã³ãã®1ã€ãšåãååãæã£ãŠãããããæ··ä¹±ãæãå¯èœæ§ããããŸãã sequencereader.cpp 552
template <class ElemType> class SequenceReader : public IDataReader<ElemType> { protected: bool m_idx2clsRead; bool m_clsinfoRead; bool m_idx2probRead; std::wstring m_file;
ã¯ã©ã¹ãã¯ã©ã¹é¢æ°ãããã³ã¯ã©ã¹ãã©ã¡ãŒã¿ãŒã§åãååã®å€æ°ã䜿çšããããšã¯ãéåžžã«æªãããã°ã©ãã³ã°ã¹ã¿ã€ã«ã§ãã ãã®äŸã§ã¯ãå€æ° "std :: wstring m_file = readerConfigïŒL" file "ïŒ;"ã®å®£èš æ¬åœã«ããã«ããã¹ãã ã£ããããããã°ã®ããã«äžæçã«è¿œå ãããåŸãåé€ããã®ãå¿ããŸãããïŒ
éçºè
ã¯ãããšæ¬¡ã®å Žæã確èªããå¿
èŠããããŸãã
- V688ããŒã«ã«å€æ°ãm_fileãã¯ã¯ã©ã¹ã¡ã³ãã®1ã€ãšåãååãæã£ãŠãããããæ··ä¹±ãæãå¯èœæ§ããããŸãã sequencereader.cpp 1554
- V688 'm_mbStartSample'é¢æ°ã®åŒæ°ã¯ãã¯ã©ã¹ã¡ã³ããŒã®1ã€ãšåãååãæã£ãŠãããããæ··ä¹±ãçããå¯èœæ§ããããŸãã sequencereader.cpp 2062
- V688ããŒã«ã«å€æ°ãm_fileãã¯ã¯ã©ã¹ã¡ã³ãã®1ã€ãšåãååãæã£ãŠãããããæ··ä¹±ãæãå¯èœæ§ããããŸãã lusequencereader.cpp 417
ãããã«
Computational Network ToolkitïŒCNTKïŒ-æ€èšŒçšã®å°èŠæš¡ãªããéåžžã«èå³æ·±ããããžã§ã¯ãã§ããããšãå€æããŸããã CNTKãããžã§ã¯ãããªãŒãã³ããã®ã¯ããæè¿ã®ããšãªã®ã§ãä»ã®Microsoftãããžã§ã¯ãã®ãªãŒãã³ãåŸ
ã€ãšãšãã«ãCNTKãããžã§ã¯ãã䜿çšããèå³æ·±ããœãªã¥ãŒã·ã§ã³ãåŸ
ã£ãŠããŸãã
è±èªã話ãèŽè¡ãšãã®èšäºãå
±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒSvyatoslav Razmyslovã
ããªã人工ç¥èœããªãã®ã§ããïŒããŸãã¯ãMicrosoft Researchã®CNTKããŒã«ãããã®åæ ã