<!DOCTYPE html>
<html class='v2 list-page' dir='ltr' itemscope='' itemtype='http://schema.org/Blog' lang='zh-HK' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'>
<head>
<link href='https://www.blogger.com/static/v1/widgets/2727757643-css_bundle_v2.css' rel='stylesheet' type='text/css'/>
<title>
谷歌开发者中文博客
</title>
<meta content='width=device-width, height=device-height, minimum-scale=1.0, initial-scale=1.0, user-scalable=0' name='viewport'/>
<meta content='IE=Edge' http-equiv='X-UA-Compatible'/>
<meta content='谷歌开发者中文博客' property='og:title'/>
<meta content='en_US' property='og:locale'/>
<meta content='https://googledeveloperschina.blogspot.com/' property='og:url'/>
<meta content='谷歌开发者中文博客' property='og:site_name'/>
<link href='https://googledeveloperschina.blogspot.com/' rel='canonical'/>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
<meta content='blogger' name='generator'/>
<link href='https://googledeveloperschina.blogspot.com/favicon.ico' rel='icon' type='image/x-icon'/>
<link href='https://googledeveloperschina.blogspot.com/' rel='canonical'/>
<link rel="alternate" type="application/atom+xml" title="谷歌开发者中文博客 - Atom" href="https://googledeveloperschina.blogspot.com/feeds/posts/default" />
<link rel="alternate" type="application/rss+xml" title="谷歌开发者中文博客 - RSS" href="https://googledeveloperschina.blogspot.com/feeds/posts/default?alt=rss" />
<link rel="service.post" type="application/atom+xml" title="谷歌开发者中文博客 - Atom" href="https://www.blogger.com/feeds/2676409160252236148/posts/default" />
<!--[if IE]><script type="text/javascript" src="https://www.blogger.com/static/v1/jsbin/864213505-ieretrofit.js"></script>
<![endif]-->
<meta content='https://googledeveloperschina.blogspot.com/' property='og:url'/>
<meta content='谷歌开发者中文博客' property='og:title'/>
<meta content='' property='og:description'/>
<!--[if IE]> <script> (function() { var html5 = ("abbr,article,aside,audio,canvas,datalist,details," + "figure,footer,header,hgroup,mark,menu,meter,nav,output," + "progress,section,time,video").split(','); for (var i = 0; i < html5.length; i++) { document.createElement(html5[i]); } try { document.execCommand('BackgroundImageCache', false, true); } catch(e) {} })(); </script> <![endif]-->
<style>
		@import url(//fonts.googleapis.com/earlyaccess/notosansscsliced.css);
	</style>
<link href='https://fonts.googleapis.com/icon?family=Material+Icons' rel='stylesheet'/>
<script src='https://cdn.bootcss.com/jquery/1.11.3/jquery.min.js' type='text/javascript'></script>
<!-- End -->
<style type='text/css'>
.header-outer {
border-bottom: 1px solid #e0e0e0;
background: $(header.background.color);
}
html, .Label h2, #sidebar .rss a, .BlogArchive h2, .FollowByEmail h2.title, .widget .post h2 {
font-family: 'Noto Sans SC Sliced', sans-serif;
}
.plusfollowers h2.title, .post h2.title, .widget h2.title {
font-family: 'Noto Sans SC Sliced', sans-serif;
}
.widget-item-control {
height: 100%;
}
.widget.Header, #header {
position: relative;
height: 100%;
width: 100%;
}
}
.widget.Header .header-logo1 {
float: left;
margin-right: 15px;
padding-right: 15px;
border-right: 1px solid #ddd;
}
.header-title h2 {
color: rgba(0,0,0,.54);
display: inline-block;
font-size: 40px;
font-family: 'Noto Sans SC Sliced', sans-serif;
font-weight: normal;
line-height: 55px;
vertical-align: top;
}
.header-inner {
background-repeat: no-repeat;
background-position: right 0px;
}
.post-author,
.byline-author {
font-size: 14px;
font-weight: normal;
color: #757575;
color: rgba(0,0,0,.54);
}
.post-content .img-border {
border: 1px solid rgb(235, 235, 235);
padding: 4px;
}
.header-title a {
text-decoration: none !important;
}
pre {
border: 1px solid #bbbbbb;
margin-top: 1em 0 0 0;
padding: 0.99em;
overflow-x: auto;
overflow-y: auto;
}
pre, code {
font-size: 9pt;
background-color: #fafafa;
line-height: 125%;
font-family: monospace;
}
pre, code {
color: #060;
font: 13px/1.54 "courier new",courier,monospace;
}
.header-left .header-logo1 {
width: 128px !important;
}
.header-desc {
line-height: 20px;
margin-top: 8px;
color: white;
font-size: 14px;
}
.fb-custom img, .twitter-custom img, .gplus-share img {
cursor: pointer;
opacity: 0.54;
}
.fb-custom img:hover, .twitter-custom img:hover, .gplus-share img:hover {
opacity: 0.87;
}
.fb-like {
width: 80px;
}
.post .share {
float: right;
}
</style>    
<style type="text/css"><!-- /*

    <style id='page-skin-1' type='text/css'><!--
/*
<Group description="Header Color" selector="header">
<Variable name="header.background.color" description="Header Background"
type="color" default="#ffffff"/>
</Group>
*/
/** CUSTOM CODE **/

--></style>
<style id='template-skin-1' type='text/css'><!--
.header-outer {
clear: both;
background-color: #617D8A;
}
.header-inner {
margin: auto;
padding: 0px;
}
.header-title h2 {
color: #fff;
}
.footer-outer {
background: #f5f5f5;
clear: both;
margin: 0;
}
.footer-inner {
margin: auto;
padding: 0px;
}
.footer-inner-2 {
/* Account for right hand column elasticity. */
max-width: calc(100% - 248px);
}
.google-footer-outer {
clear: both;
}
.cols-wrapper, .google-footer-outer, .footer-inner, .header-inner {
max-width: 978px;
margin-left: auto;
margin-right: auto;
}
.cols-wrapper {
margin: auto;
clear: both;
margin-top: 60px;
margin-bottom: 60px;
overflow: hidden;
}
.col-main-wrapper {
float: left;
width: 100%;
}
.col-main {
margin-right: 278px;
max-width: 660px;
}
.col-right {
float: right;
width: 248px;
margin-left: -278px;
}
/* Tweaks for layout mode. */
body#layout .google-footer-outer {
display: none;
}
body#layout .header-outer, body#layout .footer-outer {
background: none;
}
body#layout .header-inner {
height: initial;
}
body#layout .cols-wrapper {
margin-top: initial;
margin-bottom: initial;
}
--></style>
<base target='_self'/>
<style>
      html {
        font-family: 'Noto Sans SC Sliced', sans-serif;
        -moz-osx-font-smoothing: grayscale;
        -webkit-font-smoothing: antialiased;
      }
      body {
        padding: 0;
        /* This ensures that the scroll bar is always present, which is needed */
        /* because content render happens after page load; otherwise the header */
        /* would "bounce" in-between states. */
        min-height: 150%;
      }
      h2 {
        font-size: 16px;
      }
      h1, h2, h3, h4, h5 {
        line-height: 2em;
      }
      html, h4, h5, h6 {
        font-size: 14px;
      }
      a, a:visited {
        color: #4184F3;
        text-decoration: none;
      }
      a:focus, a:hover, a:active {
        text-decoration: none;
      }
      .Header {
        margin-top: 15px;
      }
      .Header h1 {
        font-size: 32px;
        font-weight: 300;
        line-height: 32px;
        height: 42px;
      }
      .header-inner .Header .titlewrapper {
        padding: 0;
        margin-top: 30px;
      }
      .header-inner .Header .descriptionwrapper {
        padding: 0;
        margin: 0;
      }
      .cols-wrapper {
        margin-top: 56px;
      }
      .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer {
        padding: 0 60px;
      }
      .header-inner {
        height: 256px;
        position: relative;
      }
      html, .header-inner a {
        color: #212121;
        color: rgba(0,0,0,.87);
      }
      .header-inner .google-logo {
        display: inline-block;
        background-size: contain;
        z-index: 1;
        height: 63px;
        overflow: hidden;
        margin-top: 4px;
      }
      .header-left {
        position: absolute;
        top: 50%;
        -webkit-transform: translateY(-50%);
        transform: translateY(-50%);
        margin-top: 12px;
        width: 100%;
      }
      .google-logo {
        margin-left: -4px;
      }
      .google-logo img {
        height: 60px;
      }
      #google-footer {
        position: relative;
        font-size: 13px;
        list-style: none;
        text-align: right;
      }
      #google-footer a {
        color: #444;
      }
      #google-footer ul {
        margin: 0;
        padding: 0;
        height: 144px;
        line-height: 144px;
      }
      #google-footer ul li {
        display: inline;
      }
      #google-footer ul li:before {
        color: #999;
        content: "\00b7";
        font-weight: bold;
        margin: 5px;
      }
      #google-footer ul li:first-child:before {
        content: '';
      }
      #google-footer .google-logo-dark {
        left: 0;
        margin-top: -16px;
        position: absolute;
        top: 50%;
      }
      /** Sitemap links. **/
      .footer-inner-2 {
        font-size: 14px;
        padding-top: 42px;
        padding-bottom: 74px;
      }
      .footer-inner-2 .HTML h2 {
        color: #212121;
        color: rgba(0,0,0,.87);
        font-size: 14px;
        font-weight: 500;
        padding-left: 0;
        margin: 10px 0;
      }
      .footer-inner-2 .HTML ul {
        font-weight: normal;
        list-style: none;
        padding-left: 0;
      }
      .footer-inner-2 .HTML li {
        line-height: 24px;
        padding: 0;
      }
      .footer-inner-2 li a {
        color: rgba(65,132,243,.87);
      }
      /** Archive widget. **/
      .BlogArchive {
        font-size: 13px;
        font-weight: normal;
      }
      .BlogArchive .widget-content {
        display: none;
      }
      .BlogArchive h2, .Label h2 {
        color: #4184F3;
        text-decoration: none;
      }
      .BlogArchive .hierarchy li {
        display: inline-block;
      }
      /* Specificity needed here to override widget CSS defaults. */
      .BlogArchive #ArchiveList ul li, .BlogArchive #ArchiveList ul ul li {
        margin: 0;
        padding-left: 0;
        text-indent: 0;
      }
      .BlogArchive .intervalToggle {
        cursor: pointer;
      }
      .BlogArchive .expanded .intervalToggle .new-toggle {
        -ms-transform: rotate(180deg);
        transform: rotate(180deg);
      }
      .BlogArchive .new-toggle {
        float: right;
        padding-top: 3px;
        opacity: 0.87;
      }
      #ArchiveList {
        text-transform: uppercase;
      }
      #ArchiveList .expanded > ul:last-child {
        margin-bottom: 16px;
      }
      #ArchiveList .archivedate {
        width: 100%;
      }
      /* Months */
      .BlogArchive .items {
        max-width: 150px;
        margin-left: -4px;
      }
      .BlogArchive .expanded .items {
        margin-bottom: 10px;
        overflow: hidden;
      }
      .BlogArchive .items > ul {
        float: left;
        height: 32px;
      }
      .BlogArchive .items a {
        padding: 0 4px;
      }
      .Label {
        font-size: 13px;
        font-weight: normal;
      }
      .sidebar-icon {
        display: inline-block;
        width: 24px;
        height: 24px;
        vertical-align: middle;
        margin-right: 12px;
        margin-top: -1px
      }
      .Label a {
        margin-right: 4px;
      }
      .Label .widget-content {
        display: none;
      }
      .FollowByEmail {
        font-size: 13px;
        font-weight: normal;
      }
      .FollowByEmail h2 {
        background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUBJREFUeNrMkSGLAlEUhb+ZB4JFi8mx2cz+ApvhRUGTcUCrNqNJDYIi+DO0GUwmQXDK2DSIoGgZcSaIjDrzwrK4ssvChj1w0733O+fdp+m6PozH4yQSCfb7Pa7r8pOi0SjJZBLP8zgej4gAIMvlMuPxmADIYrHger1+C6lUKmo+NJ/NZojb7SZDWiwWo1qtks1msW2bw+HwZdkwDHq9HvV6nel0SqvVYrvdIh6Ph3Qch+VyqRYLhQJSSjRNw7IsfN9XgGKxSLfbJZfL0e/3aTabrFYr7vc7IujLcOh8PqunrNdr0uk0pVKJVCpFJBJRgEajweVyod1uMxgM2O12BAGUgRbU8DV2JpOhVquRz+cRQii3+XxOp9NRN3jVR5LPOp1OjEYjlSL8hclkgmmabDabt4d+m+S30vkD/R/IU4ABAPTZgnZdmG/PAAAAAElFTkSuQmCC");
        background-repeat: no-repeat;
        background-position: 0 50%;
        text-indent: 30px;
      }
      .FollowByEmail .widget-content {
        display: none;
      }
      .searchBox input {
        border: 1px solid #eee;
        color: #212121;
        color: rgba(0,0,0,.87);
        font-size: 14px;
        padding: 8px 8px 8px 40px;
        width: 164px;
        font-family: 'Noto Sans SC Sliced', sans-serif;
        background: url("//www.gstatic.cn/images/icons/material/system/1x/search_grey600_24dp.png") 8px center no-repeat;
      }
      .searchBox ::-webkit-input-placeholder { /* WebKit, Blink, Edge */
        color:    rgba(0,0,0,.54);
      }
      .searchBox :-moz-placeholder { /* Mozilla Firefox 4 to 18 */
        color:    #000;
        opacity:  0.54;
      }
      .searchBox ::-moz-placeholder { /* Mozilla Firefox 19+ */
        color:    #000;
        opacity:  0.54;
      }
      .searchBox :-ms-input-placeholder { /* Internet Explorer 10-11 */
        color:    #757575;
      }
      .widget-item-control {
        margin-top: 0px;
      }
      .section {
        margin: 0;
        padding: 0;
      }
      #sidebar-top {
        border: 1px solid #eee;
      }
      #sidebar-top > div {
        margin: 16px 0;
      }
      .widget ul {
        line-height: 1.6;
      }
      /*main post*/
      .post {
        margin-bottom:30px;
      }
      #main .post .title {
        margin: 0;
      }
      #main .post .title a {
        color: #212121;
        color: rgba(0,0,0,.87);
        font-weight: normal;
        font-size: 24px;
      }
      #main .post .title a:hover {
        text-decoration:none;
        color:#4184F3;
      }
      .message,  #main .post .post-header {
        margin: 0;
        padding: 0;
      }
      #main .post .post-header .caption, #main .post .post-header .labels-caption,  #main .post .post-footer .caption, #main .post .post-footer .labels-caption {
        color: #444;
        font-weight: 500;
      }
      #main .tr-caption-container td {
        text-align: left;
      }
      #main .post .tr-caption {
        color: #757575;
        color: rgba(0,0,0,.54);
        display: block;
        max-width: 560px;
        padding-bottom: 20px;
      }
      #main .post .tr-caption-container {
        line-height: 24px;
        margin: -1px 0 0 0 !important;
        padding: 4px 0;
        text-align: left;
      }
      #main .post .post-header .published{
        font-size:11px;
        font-weight:bold;
      }
      .post-header .publishdate {
        font-size: 17px;
        font-weight:normal;
        color: #757575;
        color: rgba(0,0,0,.54);
      }
      #main .post .post-footer{
        font-size:12px;
        padding-bottom: 21px;
      }
      .label-footer {
        margin-bottom: 12px;
        margin-top: 12px;
      }
      .comment-img {
        margin-right: 16px;
        opacity: 0.54;
        vertical-align: middle;
      }
      #main .post .post-header .published {
        margin-bottom: 40px;
        margin-top: -2px;
      }
      .post .post-content {
        color: #212121;
        color: rgba(0,0,0,.87);
        font-size: 17px;
        margin: 25px 0 36px 0;
        line-height: 32px;
      }
      .post-body .post-content ul, .post-body .post-content ol {
        margin: 16px 0;
        padding: 0 48px;
      }
      .post-summary {
        display: none;
      }
      /* Another old-style caption. */
      .post-content div i, .post-content div + i {
        font-size: 14px;
        font-style: normal;
        color: #757575;
        color: rgba(0,0,0,.54);
        display: block;
        line-height: 24px;
        margin-bottom: 16px;
        text-align: left;
      }
      /* Another old-style caption (with link) */
      .post-content a > i {
        color: #4184F3 !important;
      }
      /* Old-style captions for images. */
      .post-content .separator + div:not(.separator) {
        margin-top: -16px;
      }
      /* Capture section headers. */
      .post-content br + br + b, .post-content .space + .space + b, .post-content .separator + b {
        display: inline-block;
        margin-bottom: 8px;
        margin-top: 24px;
      }
      .post-content li {
        line-height: 32px;
      }
      /* Override all post images/videos to left align. */
      .post-content .separator, .post-content > div {
        text-align: left;
      }
      .post-content .separator > a, .post-content .separator > span {
        margin-left: 0 !important;
      }
      .post-content img {
        max-width: 100%;
        height: auto;
        width: auto;
      }
      .post-content .tr-caption-container img {
        margin-bottom: 12px;
      }
      .post-content iframe, .post-content embed {
        max-width: 100%;
      }
      .post-content .carousel-container {
        margin-bottom: 48px;
      }
      #main .post-content b {
        font-weight: 500;
      }
      /* These are the main paragraph spacing tweaks. */
      #main .post-content br {
        content: ' ';
        display: block;
        padding: 4px;
      }
      .post-content .space {
        display: block;
        height: 8px;
      }
      .post-content iframe + .space, .post-content iframe + br {
        padding: 0 !important;
      }
      #main .post .jump-link {
        margin-bottom:10px;
      }
      .post-content img, .post-content iframe {
        margin: 30px 0 20px 0;
      }
      .post-content > img:first-child, .post-content > iframe:first-child {
        margin-top: 0;
      }
      .col-right .section {
        padding: 0 16px;
      }
      #aside {
        background:#fff;
        border:1px solid #eee;
        border-top: 0;
      }
      #aside .widget {
        margin:0;
      }
      #aside .widget h2, #ArchiveList .toggle + a.post-count-link {
        color: #212121;
        color: rgba(0,0,0,.87);
        font-weight: 400 !important;
        margin: 0;
      }
      #ArchiveList .toggle {
        float: right;
      }
      #ArchiveList .toggle .material-icons {
        padding-top: 4px;
      }
      #sidebar .tab {
        cursor: pointer;
      }
      #sidebar .tab .arrow {
        display: inline-block;
        float: right;
      }
      #sidebar .tab .icon {
        display: inline-block;
        vertical-align: top;
        height: 24px;
        width: 24px;
        margin-right: 13px;
        margin-left: -1px;
        margin-top: 1px;
        color: #757575;
        color: rgba(0,0,0,.54);
      }
      #sidebar .widget-content > :first-child {
        padding-top: 8px;
      }
      #sidebar .active .tab .arrow {
        -ms-transform: rotate(180deg);
        transform: rotate(180deg);
      }
      #sidebar .arrow {
        color: #757575;
        color: rgba(0,0,0,.54);
      }
      #sidebar .widget h2 {
        font-size: 14px;
        line-height: 24px;
        display: inline-block;
      }
      #sidebar .widget .BlogArchive {
        padding-bottom: 8px;
      }
      #sidebar .widget {
        border-bottom: 1px solid #eee;
        box-shadow: 0px 1px 0 white;
        margin-bottom: 0;
        padding: 14px 0;
        min-height: 20px;
      }
      #sidebar .widget:last-child {
        border-bottom: none;
        box-shadow: none;
        margin-bottom: 0;
      }
      #sidebar ul {
        margin: 0;
        padding: 0;
      }
      #sidebar ul li {
        list-style:none;
        padding:0;
      }
      #sidebar ul li a {
        line-height: 32px;
      }
      #sidebar .archive {
        background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAYCAYAAADzoH0MAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUeNpiNDY23s9AAWBioBCwYBM8c+YMVsUmJibEGYBNMS5DaeMFfDYSZQA2v9I3FrB5AZeriI4FmnrBccCT8mhmGs1MwyAzAQQYAKEWG9zm9QFEAAAAAElFTkSuQmCC");
        height: 24px;
        line-height: 24px;
        padding-left: 30px;
      }
      #sidebar .labels {
        background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUxJREFUeNpiNDY23s9AAMycOfM7UF05kHkZmzwTMkdSUhKrIcXFxZy3bt3qBjIN8RrS09PDsHnzZjCNDr58+cKQlpbGDjSoHcg1w2oIyAUODg5gARCNzUVIBrUCuVYYhjx//pzhwIEDYAEQDeJjA1CDWIAGNQK59jBxRuSABbkAlwHIgIeHh2HWrFn/1NTU2oDcvSgBS4wBSC5iArqoCsj1YGIgEyAZVMoEchqlBjEB/cZAiUHg2AEGznpKDAImxOeM////B4VLKtBvEUCngZ1ILKivr3/u6+ubBzJAGZQ9gC5aQoqLgAY8BhkAZL4BuQQkxgXE34A4BuiiZEIuAhrwEGhAEZD5DpzYoIaA2UAM4kQADUrHZRDUgAIg8wO2XAwzbQXQa5OweQ1owB10AyA6gS7BgX1u3ry5397eHow3bdo0EyjGi00tQIABANPgyAH1q1eaAAAAAElFTkSuQmCC");
        height: 20px;
        line-height: 20px;
        padding-left: 30px;
      }
      #sidebar .rss a {
        background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAX5JREFUeNqsVDGSgkAQHL2rIiIikohIc/EBRkbwAIwuwgfwAXiAD9AHSI7kEkECRCb6AIyINDLx7K0aa6kT7uq0q7YYtnZ7umdnt7darXbr9Zpegeu61DNNc0dvwCcH4/GYJpMJnc9nOhwOVJbl/4hAAokMECZJQtvt9k+kH7qufyEYDAakqqqYxFdRFBqNRmTbNg2HQ0rTlK7XayvR0xqBdDqdkuM4dE/0ULhYLOh4PHYrknG5XGi/31MYhuL/nkwonM1mlGUZ1XXdrsiyLGEDhY7juJEZ1u5tIixDGdYhmYw+B7CAzPP5nDabjdgIAgCksMX1832/3drtdqPT6SQWapomiGEFNkDEdpDMMAzK81ys/7XYy+XyoQgq2WoURSIJ2iIIgp/WZCCTvFm2wgeAU31aI3Q2GhIDMeB53qPYPIcm5VrxXIOIOxsDMStjVawAc1VViRgN22lNBiuQN3GR+SY07hpOoStmFQAKXRRFY93bnpG+fONfedi+BRgAbkS8Fxp7QQIAAAAASUVORK5CYII=");
      }
      #sidebar .subscription a {
        background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUBJREFUeNrMkSGLAlEUhb+ZB4JFi8mx2cz+ApvhRUGTcUCrNqNJDYIi+DO0GUwmQXDK2DSIoGgZcSaIjDrzwrK4ssvChj1w0733O+fdp+m6PozH4yQSCfb7Pa7r8pOi0SjJZBLP8zgej4gAIMvlMuPxmADIYrHger1+C6lUKmo+NJ/NZojb7SZDWiwWo1qtks1msW2bw+HwZdkwDHq9HvV6nel0SqvVYrvdIh6Ph3Qch+VyqRYLhQJSSjRNw7IsfN9XgGKxSLfbJZfL0e/3aTabrFYr7vc7IujLcOh8PqunrNdr0uk0pVKJVCpFJBJRgEajweVyod1uMxgM2O12BAGUgRbU8DV2JpOhVquRz+cRQii3+XxOp9NRN3jVR5LPOp1OjEYjlSL8hclkgmmabDabt4d+m+S30vkD/R/IU4ABAPTZgnZdmG/PAAAAAElFTkSuQmCC");
      }
      #sidebar-bottom {
        background: #f5f5f5;
        border-top:1px solid #eee;
      }
      #sidebar-bottom .widget {
        border-bottom: 1px solid #e0e0e0;
        padding: 15px 0;
        text-align: center;
      }
      #sidebar-bottom > div:last-child {
        border-bottom: 0;
      }
      #sidebar-bottom .text {
        line-height: 20px;
      }
      /* Home, forward, and backward pagination. */
      .blog-pager {
        border-top : 1px #e0e0e0 solid;
        padding-top: 10px;
        margin-top: 15px;
        text-align: right !important;
      }
      #blog-pager {
        margin-botom: 0;
        margin-top: -14px;
        padding: 16px 0 0 0;
      }
      #blog-pager a {
        display: inline-block;
      }
      .blog-pager i.disabled {
        opacity: 0.2 !important;
      }
      .blog-pager i {
        color: black;
        margin-left: 16px;
        opacity: 0.54;
      }
      .blog-pager i:hover, .blog-pager i:active {
        opacity: 0.87;
      }
      #blog-pager-older-link, #blog-pager-newer-link {
        float: none;
      }
      .gplus-profile {
        background-color: #fafafa;
        border: 1px solid #eee;
        overflow: hidden;
        width: 212px;
      }
      .gplus-profile-inner {
        margin-left: -1px;
        margin-top: -1px;
      }
      /* Sidebar follow buttons. */
      .followgooglewrapper {
        padding: 12px 0 0 0;
      }
      .loading {
        visibility: hidden;
      }
      .detail-page .post-footer .cmt_iframe_holder {
        padding-top: 40px !important;
      }
      /** Desktop **/
      @media (max-width: 900px) {
        .col-right {
          display: none;
        }
        .col-main {
          margin-right: 0;
          min-width: initial;
        }
        .footer-outer {
          display: none;
        }
        .cols-wrapper {
          min-width: initial;
        }
        .google-footer-outer {
          background-color: #f5f5f5;
        }
    .header-title h2 {
          line-height: 55px;
        }
      }
      /** Tablet **/
      @media (max-width: 720px) {
        .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer {
          padding: 0 40px;
        }
      }
      /* An extra breakpoint accommodating for long blog titles. */
      @media (max-width: 600px) {
        .header-left {
        position: absolute;
        top: 40%;
        -webkit-transform: translateY(-50%);
        transform: translateY(-50%);
        margin-top: 30px;
        width: 100%;
      }
      
        .header-title {
          margin-top: 18px;
        }
        .header-inner .google-logo {
          height: 90px;
          margin-top: 3px;
        }
        .header-title h2 {
          font-size: 2em;
          line-height: 43px;
        }
        .header-desc {
          bottom: 24px;
          position: absolute;
        }
        .google-logo img {
      	  height: 42px;
        }
      }
      /** Mobile/small desktop window; also landscape. **/
      @media (max-width: 480px), (max-height: 480px) {
        .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer {
          padding: 0 16px;
        }
    .header-title h2 {
          font-size: 1.8em;
          line-height: 25px;
        }
        .cols-wrapper {
          margin-top: 0;
        }
        .post-header .publishdate, .post .post-content {
          font-size: 16px;
        }
        .post .post-content {
          line-height: 28px;
          margin-bottom: 30px;
        }
        .post {
          margin-top: 30px;
        }
        .byline-author {
          display: block;
          font-size: 12px;
          line-height: 24px;
          margin-top: 6px;
        }
        #main .post .title a {
          font-weight: 500;
          color: #4c4c4c;
          color: rgba(0,0,0,.70);
        }
        #main .post .post-header {
          padding-bottom: 12px;
        }
        #main .post .post-header .published {
          margin-bottom: -8px;
          margin-top: 3px;
        }
        .post .read-more {
          display: block;
          margin-top: 14px;
        }
        .post .tr-caption {
          font-size: 12px;
        }
        #main .post .title a {
          font-size: 20px;
          line-height: 30px;
        }
        .post-content iframe {
          /* iframe won't keep aspect ratio when scaled down. */
          max-height: 240px;
        }
        .post-content .separator img, .post-content .tr-caption-container img, .post-content iframe {
          margin-left: -16px;
          max-width: inherit;
          width: calc(100% + 32px);
        }
        .post-content table, .post-content td {
          width: 100%;
        }
        #blog-pager {
          margin: 0;
          padding: 16px 0;
        }
        /** List page tweaks. **/
        .list-page .post-original {
          display: none;
        }
        .list-page .post-summary {
          display: block;
        }
        .list-page .comment-container {
          display: none;
        } 
        .list-page #blog-pager {
          padding-top: 0;
          border: 0;
          margin-top: -8px;
        }
        .list-page .label-footer {
          display: none;
        }
        .list-page #main .post .post-footer {
          border-bottom: 1px solid #eee;
          margin: -16px 0 0 0;
          padding: 0 0 20px 0;
        }
        .list-page .post .share {
          display: none;
        }
        /** Detail page tweaks. **/
        .detail-page .post-footer .cmt_iframe_holder {
          padding-top: 32px !important;
        }
        .detail-page .label-footer {
          margin-bottom: 0;
        }
        .detail-page #main .post .post-footer {
          padding-bottom: 0;
        }
        .detail-page #comments {
          display: none;
        }

       
    
      }
      @media (max-width: 600px) and (min-width: 410px) {
    .header-title h2 {
      font-size: 2.5em;
          line-height: 43px;
        }
      }
      [data-about-pullquote], [data-is-preview], [data-about-syndication] {
        display: none;
      }
    </style>
<noscript>
<style>
        .loading { visibility: visible }</style>
</noscript>
<script type='text/javascript'>
        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
        })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
        ga('create', 'UA-89524466-1', 'auto', 'blogger');
        ga('blogger.send', 'pageview');
      </script>
<link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=2676409160252236148&amp;zx=66a3a7fc-6577-4087-bdf9-b62f50de3869' media='none' onload='if(media!=&#39;all&#39;)media=&#39;all&#39;' rel='stylesheet'/><noscript><link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=2676409160252236148&amp;zx=66a3a7fc-6577-4087-bdf9-b62f50de3869' rel='stylesheet'/></noscript>

</head>
<body>
<!-- Header -->
<div class='header-outer'>
<div class='header-inner'>
<div class='section' id='header'><div class='widget Header' data-version='1' id='Header1'>
<div class='header-left'>
<div class='header-title'>
<a class='google-logo' href='https://googledeveloperschina.blogspot.com/'>
<img src='//3.bp.blogspot.com/-zUHy3_0bJkg/W02cFhDF0kI/AAAAAAAAsIE/G7HvV4LDWPMz8J48IBl_0tkhvEzCYsnNQCK4BGAYYCw/s1600/lockup_google_developers_horizontal_knockout_wht.png'/>
</a>
</div>
<div class='header-desc'>

		Local blog for Chinese language
      </div>
</div>
</div></div>
</div>
</div>
<!-- all content wrapper start -->
<div class='cols-wrapper loading'>
<div class='col-main-wrapper'>
<div class='col-main'>
<div class='section' id='main'><div class='widget Blog' data-version='1' id='Blog1'>
<div class='post' data-id='400270690231694348' itemscope='' itemtype='http://schema.org/BlogPosting'>
<h2 class='title' itemprop='name'>
<a href='https://googledeveloperschina.blogspot.com/2018/07/making-healthcare-data-work-better-with.html' itemprop='url' title='通过机器学习让医疗数据更好用'>
通过机器学习让医疗数据更好用
</a>
</h2>
<div class='post-header'>
<div class='published'>
<span class='publishdate' itemprop='datePublished'>
2018年7月18日星期三
</span>
</div>
</div>
<div class='post-body'>
<div class='post-content' itemprop='articleBody'>
<script type='text/template'>
                          &#65279;<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><style>code { background-color: transparent }</style>
                          <span class="byline-author">发布人&#65306;Google Brain 团队软件工程师 Patrik Sundberg 和产品经理 Eyal Oren</span><br>
<br>
在过去 10 年间&#65292;医疗数据已经从以纸质文件为主<a href="https://dashboard.healthit.gov/evaluations/data-briefs/non-federal-acute-care-hospital-ehr-adoption-2008-2015.php">几乎完全数字化</a>为电子健康记录&#12290;但是&#65292;理解这些数据涉及一些关键挑战&#12290;第一&#65292;供应商之间没有共同的数据表示形式&#65307;每个供应商都使用不同的方式来构建他们的数据&#12290;第二&#65292;即使使用相同供应商的网站也可能存在很大不同&#65292;例如&#65292;他们通常为同一种药物使用不同的代码&#12290;第三&#65292;数据可能分布在多个表格中&#65292;一些表格包含患者就医记录&#65292;一些包含实验室结果&#65292;其他的则包含生命体征数据&#12290; <br>
<br>
<a href="https://www.hl7.org/fhir/">快速医疗互操作性资源</a> (FHIR) 标准解决了其中的大多数挑战&#65306;它具有一个坚实并且可扩展的数据模型并基于成熟的网络标准构建&#65292;正在快速成为个体记录和<a href="http://docs.smarthealthit.org/flat-fhir/">批量数据访问</a>的<a href="https://www.healthit.gov/techlab/innovation/connecting-accelerating-fhir-app-ecosystem">事实标准</a>&#12290;但是&#65292;为了实现<a href="http://arxiv.org/abs/1801.07860">大规模机器学习</a>&#65292;我们需要一些补充&#65306;各种编程语言的实现&#65292;将大量数据序列化到磁盘的有效方法&#65292;以及允许分析大型数据集的表示形式&#12290; <br>
<br>
今天&#65292;我们高兴地<a href="https://github.com/google/fhir">开源</a> FHIR 标准的一种<a href="https://developers.google.com/protocol-buffers/">协议缓冲区</a>实现&#65292;它可以解决这些问题&#12290;当前版本支持 Java&#65292;并且将很快支持 C++&#12289;Go 和 Python&#12290;对配置文件的支持也即将发布&#65292;还会推出一些工具&#65292;帮助用户将旧数据转换成 FHIR&#12290;<br>
<br>
<b>将 FHIR 用作核心数据模型</b><br>
过去几年&#65292;我们一直与众多学术医疗中心<a href="https://www.blog.google/topics/machine-learning/partnering-machine-learning-healthcare/">合作</a>&#65292;将机器学习应用于匿名病历&#65292;我们需要正面解决医疗数据的复杂性&#65292;这一点已经变得非常明显&#12290;确实&#65292;要让机器学习有效用于医疗数据&#65292;我们需要从整体上了解每名患者随着时间推移的情况&#12290;作为奖励&#65292;我们想要一种可以直接用于临床环境的数据表示形式&#12290; <br>
<br>
尽管 FHIR 标准可以解决我们的大多数需求&#65292;但是为了使医疗数据比&#8220;旧&#8221;数据结构更加易于管理和确保大规模机器学习不依赖于供应商&#65292;我们认为引入协议缓冲区可以帮助应用开发者和&#65288;机器学习&#65289;研究人员使用 FHIR&#12290;<br>
<br>
<b>当前版本的协议缓冲区</b><br>
为了让我们的协议缓冲区表示适合编程访问和数据库查询&#65292;我们做了大量工作&#12290;提供的一个示例显示了如何将 FHIR 数据上传到 Google Cloud <a href="http://cloud.google.com/bigquery">BigQuery</a> 中并让它可以用于查询&#65292;我们将添加直接从批量数据导出上传的其他示例&#12290;我们的协议缓冲区符合 FHIR 标准&#65288;这些缓冲区实际上是从此标准自动生成的&#65289;&#65292;但可以实现更高级的查询&#12290;<br>
<br>
当前版本还不可以用于训练 <a href="https://www.tensorflow.org/">TensorFlow</a> 模型&#65292;不过&#65292;敬请关注未来更新&#12290;我们打算开源尽可能多的<a href="http://arxiv.org/abs/1801.07860">近期工作</a>&#65292;以便提升我们的研究在现实世界情景中的重现性和适用性&#12290;此外&#65292;我们还在与 Google Cloud 团队的同事紧密合作&#65292;推出更多用于管理大规模医疗数据的<a href="https://github.com/GoogleCloudPlatform/healthcare">工具</a>&#12290;<br>
<br>
<b>致谢</b><br>
<i>我们非常欣赏来自 FHIR 社区的出色讨论和有用反馈&#65292;特别感谢 <a href="http://blog.hl7.org/author/grahame-grieve">Grahame Grieve</a>&#12289;<a href="https://github.com/ewoutkramer">Ewout Kramer</a> 和 <a href="https://www.linkedin.com/in/joshua-mandel-88347235/">Josh Mandel</a> 等人的意见和建议&#12290;感谢我们在 <a href="https://deepmind.com/applied/deepmind-health/">DeepMind</a>&#12289;<a href="//g.co/brain">Google Brain 团队</a>的同事和我们的<a href="https://blog.google/topics/machine-learning/partnering-machine-learning-healthcare/">学术协作者</a>&#12290;</i> <span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person">
  <meta content="https://plus.google.com/116899029375914044550" itemprop="url">
</span>
                        <!--<meta name="original_url" content="https://research.googleblog.com/2018/03/making-healthcare-data-work-better-with.html"><meta name="original_title" content="Research Blog: Making Healthcare Data Work Better with Machine Learning"><meta name="original_blog" content="Google Research Blog">-->
                        </script>
</div>
</div>
</div>
<div class='post' data-id='3834619134430198387' itemscope='' itemtype='http://schema.org/BlogPosting'>
<h2 class='title' itemprop='name'>
<a href='https://googledeveloperschina.blogspot.com/2018/07/expressive-speech-synthesis-with.html' itemprop='url' title='通过 Tacotron 进行富有表现力的语音合成'>
通过 Tacotron 进行富有表现力的语音合成
</a>
</h2>
<div class='post-header'>
<div class='published'>
<span class='publishdate' itemprop='datePublished'>
2018年7月18日星期三
</span>
</div>
</div>
<div class='post-body'>
<div class='post-content' itemprop='articleBody'>
<script type='text/template'>
                          &#65279;<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><style>code { background-color: transparent }</style>
                          <span class="byline-author">发布人&#65306;研究员 Yuxuan Wang 和软件工程师 RJ Skerry-Ryan&#65292;代表机器感知&#12289;Google Brain 和 TTS 研究团队发布</span><br>
<br>
最近&#65292;Google 在基于神经网络的文字转语音 (TTS) 研究上取得重大突破&#65292;我们对此感到非常兴奋&#12290;尤其是端到端架构&#65292;例如&#65292;去年推出的 <a href="https://research.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html">Tacotron</a> 系统既可以简化语音构建管道&#65292;又能生成自然的语音&#12290;这将帮助我们构建更好的人机接口&#65292;例如会话助手&#12289;有声读物朗诵&#12289;新闻阅读器或语音设计软件&#12290;不过&#65292;为了实现真正像人一样的发音&#65292;TTS 系统必须学会对<a href="https://en.wikipedia.org/wiki/Prosody_(linguistics)">韵律</a>建模&#65292;韵律包含语音的所有表现力因素&#65292;例如语调&#12289;重音和节奏&#12290;大多数最新的端到端系统&#65288;包括 Tacotron 在内&#65289;都没有明确地对韵律建模&#65292;这意味着它们无法精确控制生成的语音应当如何发音&#12290;这可能生成单调的语音&#65292;即使模型在非常富有表现力的数据集&#65288;例如有声读物&#65292;其中包含的人物语音有显著变化&#65289;上训练也无济于事&#12290;今天&#65292;我们高兴地与大家分享两篇可以解决这些问题的新论文&#12290;<br>
<br>
我们的第一篇论文&#8220;<a href="https://arxiv.org/abs/1803.09047">Towards End-to-End Prosody Transfer for Expressive Speech Synthesis with Tacotron</a>&#8221;引入了<i>韵律嵌入</i>的概念&#12290;我们在 Tacotron 架构中增加了一个可以从人类语音片段&#65288;参考音频&#65289;计算低维嵌入的韵律编码器&#12290;<br>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-gLeFjXaaXAs/WrmeKUvv16I/AAAAAAAACg0/jyB3-yRv4lU3YpBNd55IcSpHyzUDtzarwCLcBGAs/s1600/image1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="232" data-original-width="861" height="172" src="https://1.bp.blogspot.com/-gLeFjXaaXAs/WrmeKUvv16I/AAAAAAAACg0/jyB3-yRv4lU3YpBNd55IcSpHyzUDtzarwCLcBGAs/s640/image1.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">我们为 Tacotron 增加了一个韵律编码器&#12290;上图的下半部分是原始的 Tacotron 序列到序列模型&#12290;如需了解技术细节&#65292;请参阅<a href="https://arxiv.org/abs/1803.09047">论文</a>&#12290;</td></tr>
</tbody></table>
此嵌入可以捕捉独立于语音信息和特殊的说话者特质的音频特征&#65292;例如重音&#12289;语调和语速&#12290;推理时&#65292;我们可以使用此嵌入执行韵律迁移&#65292;根据一个完全不同的说话者的声音生成语音&#65292;但是体现参考音频的韵律&#12290;<br>
<br>
<div style="color: #666666; font-style: italic; padding-bottom: 10px; text-align: center;">
文本&#65306;<b>*Is*</b> that Utah travel agency?</div>
<table style="margin-left: auto; margin-right: auto; text-align: right;"><tbody>
<tr>     <td>参考韵律&#65288;澳大利亚人&#65289;</td>   <td><audio controls="controls" src="https://google.github.io/tacotron/publications/end_to_end_prosody_transfer/demos/00087.wav"></audio></td>   </tr>
<tr>     <td>合成韵律&#65292;不带韵律嵌入&#65288;美国人&#65289;</td>     <td><audio controls="controls" src="https://google.github.io/tacotron/publications/end_to_end_prosody_transfer/demos/00088.wav"></audio></td>   </tr>
<tr>     <td>合成韵律&#65292;带有韵律嵌入&#65288;美国人&#65289;</td>      <td><audio controls="controls" src="https://google.github.io/tacotron/publications/end_to_end_prosody_transfer/demos/00094.wav"></audio></td>   </tr>
</tbody></table>
<br>
嵌入也可以将时间对齐的精确韵律从一个短语迁移到稍微不同的短语&#65292;当参考短语与目标短语的长度和结构相似时&#65292;这种技术的效果最好&#12290;<br>
<br>
<div style="color: #666666; font-style: italic; padding-bottom: 10px; text-align: center;">
参考文本&#65306;For the first time in her life she had been danced tired.</div>
<div style="color: #666666; font-style: italic; padding-bottom: 10px; text-align: center;">
合成文本&#65306;For the last time in his life he had been handily embarrassed.</div>
<table style="margin-left: auto; margin-right: auto; text-align: right;"><tbody>
<tr>     <td>参考韵律&#65288;美国人&#65289;</td><td><audio controls="controls" src="https://google.github.io/tacotron/publications/end_to_end_prosody_transfer/demos/00252.wav"></audio></td>   </tr>
<tr>     <td>合成韵律&#65292;不带韵律嵌入&#65288;美国人&#65289;</td><td><audio controls="controls" src="https://google.github.io/tacotron/publications/end_to_end_prosody_transfer/demos/00253.wav"></audio></td>   </tr>
<tr>     <td>合成韵律&#65292;带有韵律嵌入&#65288;美国人&#65289;</td><td><audio controls="controls" src="https://google.github.io/tacotron/publications/end_to_end_prosody_transfer/demos/00254.wav"></audio></td>   </tr>
</tbody></table>
<br>
令人激动的是&#65292;即使参考音频来自语音未包含在 Tacotron 训练数据中的说话者&#65292;我们也可以观察到韵律迁移&#12290; <br>
<br>
<div style="color: #666666; font-style: italic; padding-bottom: 10px; text-align: center;">
文本&#65306;I've Swallowed a Pollywog.</div>
<table style="margin-left: auto; margin-right: auto; text-align: right;"><tbody>
<tr>       <td>参考韵律&#65288;事前未看过原文的美国人&#65289;</td>     <td><audio controls="controls" src="https://google.github.io/tacotron/publications/end_to_end_prosody_transfer/demos/00179.wav"></audio></td>   </tr>
<tr>       <td>合成韵律&#65292;不带韵律嵌入&#65288;英国人&#65289;</td>     <td><audio controls="controls" src="https://google.github.io/tacotron/publications/end_to_end_prosody_transfer/demos/00181.wav"></audio></td>   </tr>
<tr>       <td>合成韵律&#65292;带有韵律嵌入&#65288;英国人&#65289;</td>    <td><audio controls="controls" src="https://google.github.io/tacotron/publications/end_to_end_prosody_transfer/demos/00185.wav"></audio></td>   </tr>
</tbody></table>
<br>
这是一个很有希望的结果&#65292;它为语音交互设计者利用自己的声音自定义语音合成铺平了道路&#12290;您可以在<a href="https://google.github.io/tacotron/publications/end_to_end_prosody_transfer/">这个网页</a>上试听&#8220;<a href="https://arxiv.org/abs/1803.09047">Towards End-to-End Prosody Transfer for Expressive Speech Synthesis with Tacotron</a>&#8221;中使用的所有演示音频&#12290;<br>
<br>
尽管可以迁移具有高保真度的韵律&#65292;上述论文中的嵌入并没有将韵律与参考音频片段中的内容完全分开&#12290;&#65288;这解释了为什么迁移韵律对相似结构和长度的短语效果最佳&#12290;&#65289;此外&#65292;它们在推理时还需要一个参考音频片段&#12290;这就自然而然地引出一个问题&#65306;我们能否开发一种富有表现力语音的模型来缓解这些问题&#65311;<br>
<br>
这正是我们在第二篇论文&#8220;<a href="https://arxiv.org/abs/1803.09017">Style Tokens:Unsupervised Style Modeling, Control and Transfer in End-to-End Speech Synthesis</a>&#8221;中所做的工作&#12290;在第一篇论文介绍的架构的基础上&#65292;我们提出了一种对语音的潜在&#8220;因素&#8221;建模的无监督新方法&#12290;这个模型的关键是&#65292;它学习的是更高级的说话风格模式&#65292;而不是时间对齐的精确韵律元素&#65292;前者可在任意不同的短语间迁移&#12290;  <br>
<br>
模型的工作原理是向 Tacotron 添加一个额外的注意机制&#65292;强制它将任何语音片段的韵律嵌入表示为基础嵌入固定集合的线性组合&#12290;我们将这些嵌入称为<i>全局风格符号</i> (GST)&#65292;并发现它们能学习说话者风格&#65288;温柔&#12289;高音调和激烈等&#65289;中与文本无关的变化&#65292;无需显式风格标签&#12290; <br>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-Qq7kYTllplg/Wrp2uVX_vlI/AAAAAAAAChI/QF3QgeeDm7IgxlXmXvM4yE4MCTVwnQMuQCLcBGAs/s1600/image2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="280" data-original-width="871" height="204" src="https://2.bp.blogspot.com/-Qq7kYTllplg/Wrp2uVX_vlI/AAAAAAAAChI/QF3QgeeDm7IgxlXmXvM4yE4MCTVwnQMuQCLcBGAs/s640/image2.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">全局风格符号的模型架构&#12290;韵律嵌入被分解成&#8220;风格符号&#8221;&#65292;从而实现无监督的风格控制与迁移&#12290;如需了解技术细节&#65292;请参阅<a href="https://arxiv.org/abs/1803.09017">论文</a>&#12290;</td></tr>
</tbody></table>
推理时&#65292;我们可以选择或者修改符号的组合权重&#65292;这让我们能够强制 Tacotron 使用特定的说话风格&#65292;不需要参考音频片段&#12290;例如&#65292;使用 GST&#65292;我们可以让长度不同的语句听起来更&#8220;活泼&#8221;&#12289;&#8220;气愤&#8221;和&#8220;悲伤&#8221;等&#65306;<br>
<br>
<div style="color: #666666; font-style: italic; text-align: left;">
<div style="text-align: center;">
文本&#65306;United Airlines five six three from Los Angeles to New Orleans has Landed.</div>
</div>
<table style="margin-left: auto; margin-right: auto; text-align: right;"><tbody>
<tr><td>风格 1</td><td><audio controls=""><source src="https://google.github.io/tacotron/publications/global_style_tokens/demos/gstwn/gstwn_vs_g.wav"></audio></td></tr>
<tr><td>风格 2</td><td><audio controls=""><source src="https://google.github.io/tacotron/publications/global_style_tokens/demos/gstwn/gstwn_vs_g_2.wav"></audio></td></tr>
<tr><td>风格 3</td><td><audio controls=""><source src="https://google.github.io/tacotron/publications/global_style_tokens/demos/gstwn/gstwn_vs_g_3.wav"></audio></td></tr>
<tr><td>风格 4</td><td><audio controls=""><source src="https://google.github.io/tacotron/publications/global_style_tokens/demos/gstwn/gstwn_vs_g_4.wav"></audio></td></tr>
<tr><td>风格 5</td><td><audio controls=""><source src="https://google.github.io/tacotron/publications/global_style_tokens/demos/gstwn/gstwn_vs_g_5.wav"></audio></td></tr>
</tbody></table>
GST 与文本无关的特性让它们非常适合<i>风格迁移</i>&#65292;这会采用特定风格的参考音频片段&#65292;将它的风格迁移到我们选择的任意目标短语&#12290;为此&#65292;我们首先运行推理来预测想要模仿其风格的语句的 GST 组合权重&#12290;然后&#65292;我们将这些组合权重馈送到模型&#65292;以相同风格合成完全不同的短语&#65292;即使长度和结构差异很大&#12290;<br>
<br>
最后&#65292;我们的论文表明全局风格符号不仅仅可以对说话风格建模&#12290;在来自未标记说话者的嘈杂 YouTube 音频上进行训练时&#65292;启用 GST 的 Tacotron 可以学会用单独的符号表示噪音源和不同的说话者&#12290;也就是说&#65292;通过选择用于推理的 GST&#65292;我们可以合成无背景噪声的语音&#65292;或者合成来自数据集中特定的未标记说话者的语音&#12290;这个令人兴奋的结果为高度可扩展并具备稳定性的语音合成开辟了道路&#12290;您可以试听&#8220;<a href="https://arxiv.org/abs/1803.09017">Style Tokens:Unsupervised Style Modeling, Control and Transfer in End-to-End Speech Synthesis</a>&#8221;中使用的所有演示音频&#65292;要试听&#65292;请访问<a href="https://google.github.io/tacotron/publications/global_style_tokens">此网页</a>&#12290;<br>
<br>
我们对这两个研究主体可以实现的潜在应用和机会感到非常兴奋&#12290;同时&#65292;也有一些新的重要研究问题亟待解决&#12290;我们希望拓展第一篇论文的技术&#65292;以支持在目标说话者的自然音高范围内进行韵律迁移&#12290;我们还希望开发一种可以根据环境自动选择适当韵律或说话风格的技术&#65292;例如&#65292;将自然语言理解与 TTS 集成&#12290;最后&#65292;尽管我们的第一篇论文为韵律迁移提出了一套初步的客观和主观指标&#65292;我们仍希望进一步完善这些指标&#65292;以便帮助建立公认的韵律评估方法&#12290;<br>
<br>
<b>致谢</b><br>
<i>这些项目由多个 Google 团队联合完成&#12290;贡献者包括 RJ Skerry-Ryan&#12289;Yuxuan Wang&#12289;Daisy Stanton&#12289;Eric Battenberg&#12289;Ying Xiao&#12289;Joel Shor&#12289;Rif A. Saurous&#12289;Yu Zhang&#12289;Ron J. Weiss&#12289;Rob Clark&#12289;Fei Ren 和 Ye Jia&#12290;</i><br>
<br>
<br>
<span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person">
  <meta content="https://plus.google.com/116899029375914044550" itemprop="url">
</span>
                        <!--<meta name="original_url" content="https://research.googleblog.com/2018/03/expressive-speech-synthesis-with.html"><meta name="original_title" content="Research Blog: Expressive Speech Synthesis with Tacotron"><meta name="original_blog" content="Google Research Blog">-->
                        </script>
</div>
</div>
</div>
<div class='post' data-id='5679304349637655839' itemscope='' itemtype='http://schema.org/BlogPosting'>
<h2 class='title' itemprop='name'>
<a href='https://googledeveloperschina.blogspot.com/2018/07/mobilenetv2-next-generation-of-on.html' itemprop='url' title='MobileNetV2：下一代设备上计算机视觉网络'>
MobileNetV2&#65306;下一代设备上计算机视觉网络
</a>
</h2>
<div class='post-header'>
<div class='published'>
<span class='publishdate' itemprop='datePublished'>
2018年7月18日星期三
</span>
</div>
</div>
<div class='post-body'>
<div class='post-content' itemprop='articleBody'>
<script type='text/template'>
                          &#65279;<span class="byline-author">发布人&#65306;Google Research Mark Sandler 和 Andrew Howard</span><br />
<br />
去年&#65292;我们引入了面向移动设备设计的通用型计算机视觉神经网络系列 <a href="https://research.googleblog.com/2017/06/mobilenets-open-source-models-for.html">MobileNetV1</a>&#65292;支持分类和检测等功能&#12290;在个人移动设备上运行深度网络可以提升用户体验&#65292;允许随时随地访问&#65292;并且在安全性&#12289;隐私和能耗方面同样具有优势&#12290;随着可让用户与现实世界实时交互的新应用的出现&#65292;对更高效神经网络的需求也逐渐增加&#12290;<br />
<br />
今天&#65292;我们很高兴地宣布&#65292;<a href="https://github.com/tensorflow/models/tree/master/research/slim/nets/mobilenet">MobileNetV2</a> 已经发布&#65292;它将为下一代移动视觉应用提供支持&#12290;MobileNetV2 在 MobileNetV1 的基础上进行了重大改进&#65292;并推动了移动视觉识别技术的发展&#65292;包括分类&#12289;对象检测和语义分割&#12290;MobileNetV2 作为 <a href="https://github.com/tensorflow/models/blob/master/research/slim/README.md">TensorFlow-Slim 图像分类库</a>的一部分发布&#65292;您也可以在 <a href="https://colab.research.google.com/github/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet_example.ipynb">Colaboratory</a> 中浏览 MobileNetV2&#12290;或者&#65292;也可以<a href="https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet_example.ipynb">下载</a>笔记本并在本地使用 <a href="http://jupyter.org/">Jupyter</a> 操作&#12290;MobileNetV2 还将作为 TF-Hub 中的<a href="https://www.tensorflow.org/hub/modules/image#mobilenet">模块</a>&#65292;预训练检查点位于 <a href="https://github.com/tensorflow/models/tree/master/research/slim/nets/mobilenet">github</a> 中&#12290;<br />
<br />
MobileNetV2 以 MobileNetV1 [1] 的理念为基础&#65292;使用深度可分离卷积作为高效构建块&#12290;此外&#65292;V2 在架构中引入了两项新功能&#65306;1) 层之间的线性瓶颈&#65292;以及 2) 瓶颈之间的快捷连接<a href="https://www.blogger.com/blogger.g?blogID=2676409160252236148#1" name="top1"><sup>1</sup></a>&#12290;基本结构如下所示&#12290;<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-M8UvZJWNW4E/WsKk-tbzp8I/AAAAAAAAChw/OqxBVPbDygMIQWGug4ZnHNDvuyK5FBMcQCLcBGAs/s1600/image5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="773" data-original-width="1000" height="494" src="https://1.bp.blogspot.com/-M8UvZJWNW4E/WsKk-tbzp8I/AAAAAAAAChw/OqxBVPbDygMIQWGug4ZnHNDvuyK5FBMcQCLcBGAs/s640/image5.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">MobileNetV2 架构概览&#12290;蓝色块表示上面所示的复合卷积构建块&#12290;</td></tr>
</tbody></table>
我们可以直观地理解为&#65292;瓶颈层对模型的中间输入和输出进行编码&#65292;而内层封装了让模型可以将低级概念&#65288;如像素&#65289;转换为高级描述符&#65288;如图像类别&#65289;的功能&#12290;最后&#65292;与传统的残差连接一样&#65292;快捷连接也可以提高训练速度和准确性&#12290;要详细了解技术细节&#65292;请参阅论文&#8220;<a href="https://arxiv.org/abs/1801.04381">MobileNet V2:Inverted Residuals and Linear Bottlenecks</a>&#8221;&#12290;<br />
<br />
<b>MobileNetV2 与第一代 MobileNet 相比有何不同&#65311;</b><br />
总体而言&#65292;MobileNetV2 模型在整体延迟时间范围内可以更快实现相同的准确性&#12290;特别是在 Google Pixel 手机上&#65292;与 MobileNetV1 模型相比&#65292;新模型的运算数减少 2 倍&#65292;参数减少 30%&#65292;而速度提升 30-40%&#65292;同时准确性也得到提高&#12290;<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-E7CT0RHBWq4/WsKlTgEeX2I/AAAAAAAACh0/dp1B4yh6O2k4H1LuC7BA-EKzrL7W0L8iACLcBGAs/s1600/image2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="668" data-original-width="1228" height="348" src="https://2.bp.blogspot.com/-E7CT0RHBWq4/WsKlTgEeX2I/AAAAAAAACh0/dp1B4yh6O2k4H1LuC7BA-EKzrL7W0L8iACLcBGAs/s640/image2.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">MobileNetV2 提高了速度&#65288;缩短了延迟时间&#65289;并提高了 ImageNet Top 1 的准确度</td></tr>
</tbody></table>
对于对象检测和分割而言&#65292;MobileNetV2 是非常有效的特征提取器&#12290;例如&#65292;在检测方面&#65292;与新引入的 SSDLite [2] 搭配使用时&#65292;在实现相同准确性的情况下&#65292;新模型的速度要比 MobileNetV1 快大约 35%&#12290;我们已在 <a href="https://github.com/tensorflow/models/tree/master/research/object_detection">Tensorflow Object Detection API</a>[4] 下开源该模型&#12290;<br />
<br />
<div>
<table border="1" cellpadding="1" cellspacing="0" style="width: 100%;"><tbody>
<tr> <td><div style="text-align: center;">
<b>模型</b></div>
</td> <td><div style="text-align: center;">
<b>参数</b></div>
</td> <td><div style="text-align: center;">
<b>乘加运算</b></div>
</td> <td><div style="text-align: center;">
<b>mAP</b></div>
</td> <td><div style="text-align: center;">
<b>移动 CPU</b></div>
</td> </tr>
<tr> <td><div style="text-align: center;">
MobileNetV1 + SSDLite</div>
</td> <td><div style="text-align: center;">
5.1M</div>
</td> <td><div style="text-align: center;">
1.3B</div>
</td> <td><div style="text-align: center;">
22.2%</div>
</td> <td><div style="text-align: center;">
270ms</div>
</td> </tr>
<tr> <td><div style="text-align: center;">
<a href="http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v2_coco_2018_03_29.tar.gz">MobileNetV2 + SSDLite</a></div>
</td> <td><div style="text-align: center;">
4.3M</div>
</td> <td><div style="text-align: center;">
0.8B</div>
</td> <td><div style="text-align: center;">
22.1%</div>
</td> <td><div style="text-align: center;">
200ms</div>
</td> </tr>
</tbody></table>
</div>
<br />
为了实现设备上语义分割&#65292;我们在<a href="https://research.googleblog.com/2018/03/semantic-image-segmentation-with.html">近期宣布</a>的 DeepLabv3 [3] 的简化版中采用 MobileNetV2 作为特征提取器&#12290;在采用语义分割基准 <a href="http://host.robots.ox.ac.uk/pascal/VOC/voc2012/">PASCAL VOC 2012</a> 的条件下&#65292;新模型的性能与使用 MobileNetV1 作为特征提取器的性能相似&#65292;但前者的参数数量减少 5.3 倍&#65292;乘加运算数量减少 5.2 倍&#12290;<br />
<br />
<div>
<table border="1" cellpadding="1" cellspacing="0" style="width: 100%;"><tbody>
<tr> <td><div style="text-align: center;">
<b>模型</b></div>
</td> <td><div style="text-align: center;">
<b>参数</b></div>
</td> <td><div style="text-align: center;">
<b>乘加运算</b></div>
</td> <td><div style="text-align: center;">
<b>mIOU</b></div>
</td> </tr>
<tr> <td><div style="text-align: center;">
MobileNetV1 + DeepLabV3</div>
</td> <td><div style="text-align: center;">
11.15M</div>
</td> <td><div style="text-align: center;">
14.25B</div>
</td> <td><div style="text-align: center;">
75.29%</div>
</td> </tr>
<tr> <td><div style="text-align: center;">
<a href="http://download.tensorflow.org/models/deeplabv3_mnv2_pascal_train_aug_2018_01_29.tar.gz">MobileNetV2 + DeepLabV3</a></div>
</td> <td><div style="text-align: center;">
2.11M</div>
</td> <td><div style="text-align: center;">
2.75B</div>
</td> <td><div style="text-align: center;">
75.32%</div>
</td> </tr>
</tbody></table>
</div>
<br />
综上&#65292;MobileNetV2 提供了一个非常高效的面向移动设备的模型&#65292;可以用作许多视觉识别任务的基础&#12290;我们现将此模型与广大学术和开源社区分享&#65292;希望借此进一步推动研究和应用开发&#12290;<br />
<br />
<b>致谢&#65306;</b><br />
<i>感谢我们的核心贡献者 Menglong Zhu&#12289;Andrey Zhmoginov 和 Liang-Chieh Chen&#12290;我们还要特别感谢 Bo Chen&#12289;Dmitry Kalenichenko&#12289;Skirmantas Kligys&#12289;Mathew Tang&#12289;Weijun Wang&#12289;Benoit Jacob&#12289;George Papandreou&#12289;Zhichao Lu&#12289;Vivek Rathod&#12289;Jonathan Huang&#12289;Yukun Zhu 和 Hartwig Adam&#12290;</i><br />
<br />
<b>参考文献</b><br />
<ol>
<li><a href="https://arxiv.org/abs/1704.04861">MobileNets:Efficient Convolutional Neural Networks for Mobile Vision Applications</a>, <i>Howard AG, Zhu M, Chen B, Kalenichenko D, Wang W, Weyand T, Andreetto M, Adam H, arXiv:1704.04861, 2017.</i></li>
<li><a href="https://arxiv.org/abs/1801.04381">MobileNetV2:Inverted Residuals and Linear Bottlenecks</a>, <i>Sandler M, Howard A, Zhu M, Zhmoginov A, Chen LC. arXiv preprint. arXiv:1801.04381, 2018.</i></li>
<li><a href="https://arxiv.org/abs/1706.05587">Rethinking Atrous Convolution for Semantic Image Segmentation</a>, <i>Chen LC, Papandreou G, Schroff F, Adam H. arXiv:1706.05587, 2017.</i></li>
<li><a href="http://openaccess.thecvf.com/content_cvpr_2017/papers/Huang_SpeedAccuracy_Trade-Offs_for_CVPR_2017_paper.pdf">Speed/accuracy trade-offs for modern convolutional object detectors</a>, <i>Huang J, Rathod V, Sun C, Zhu M, Korattikara A, Fathi A, Fischer I, Wojna Z, Song Y, Guadarrama S, Murphy K, CVPR 2017.</i></li>
<li><a href="https://arxiv.org/abs/1512.03385">Deep Residual Learning for Image Recognition</a>, <i>He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. arXiv:1512.03385,2015</i></li>
</ol>
<hr width="100%" />
<span class="Apple-style-span" style="font-size: small;"><br />
<a href="https://www.blogger.com/null" name="1"><b>1 </b></a>快捷&#65288;也称为跳跃&#65289;连接通常用于连接非瓶颈层&#65292;在 ResNets [5] 之后得以广泛使用&#12290;MobilenNetV2 摒弃了这一概念&#65292;直接连接瓶颈&#12290;<a href="https://www.blogger.com/blogger.g?blogID=2676409160252236148#top1"><sup>&#8617;</sup></a><br />
</span><span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person">
  
</span>
                        <!--<meta name="original_url" content="https://research.googleblog.com/2018/04/mobilenetv2-next-generation-of-on.html"><meta name="original_title" content="Research Blog: MobileNetV2: The Next Generation of On-Device Computer Vision Networks"><meta name="original_blog" content="Google Research Blog">-->
                        </script>
</div>
</div>
</div>
<div class='post' data-id='1724559659235808784' itemscope='' itemtype='http://schema.org/BlogPosting'>
<h2 class='title' itemprop='name'>
<a href='https://googledeveloperschina.blogspot.com/2018/07/seeing-more-with-in-silico-labeling-of12.html' itemprop='url' title='利用显微图像的硅片标记查看更多信息'>
利用显微图像的硅片标记查看更多信息
</a>
</h2>
<div class='post-header'>
<div class='published'>
<span class='publishdate' itemprop='datePublished'>
2018年7月18日星期三
</span>
</div>
</div>
<div class='post-body'>
<div class='post-content' itemprop='articleBody'>
<script type='text/template'>
                          &#65279;<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><style>code { background-color: transparent }</style>
                          <span class="byline-author">发布人&#65306;Google Research 高级软件工程师 Eric Christiansen</span><br>
<br>
在生物学和医学领域&#65292;研究人员通常利用<a href="https://en.wikipedia.org/wiki/Microscopy">显微技术</a>观察肉眼无法看到的细胞和分子的细节&#12290;<i>透射光</i>显微技术的原理是对生物样本单侧照射并生成图像&#65292;操作相对简单且活体培养样本耐受度高&#65292;但通过这种方式生成的图像难以正确评估&#12290;而<i>荧光显微技术</i>可以使用荧光分子将需要观察的生物目标&#65288;如细胞核&#65289;标上颜色&#65292;这种做法简化了分析&#65292;但需要繁琐的样本制备&#12290;随着机器学习&#65288;包括用于<a href="https://research.googleblog.com/2018/03/using-deep-learning-to-facilitate.html">自动评估图像质量</a>和<a href="https://research.googleblog.com/2017/03/assisting-pathologists-in-detecting.html">协助病理学家诊断癌组织</a>的算法&#65289;在显微技术领域的应用日益增多&#65292;我们想知道是否可以开发一种能够结合两种显微技术的优点&#65292;同时最大限度减少缺点的深度学习系统&#12290;  <br>
<br>
在&#8220;<a href="http://www.cell.com/cell/fulltext/S0092-8674(18)30364-7"><i>In Silico</i> Labeling:Predicting Fluorescent Labels in Unlabeled Images</a>&#8221;一文&#65288;今日刊登于<i>&#12298;Cell&#12299;</i>杂志&#65289;中&#65292;我们展示了一个新的深度神经网络&#65292;这个网络能够通过透射光图像预测荧光图像&#65292;无需修改细胞就可以生成带标记的有用图像&#65292;从而允许对未修改的细胞作纵向研究&#12289;在细胞治疗中实现微创细胞筛查&#65292;以及同时运用大量标记进行调查&#12290;我们也<a href="https://github.com/google/in-silico-labeling">开源了网络</a>&#65292;并提供了完整的训练与测试数据&#12289;训练模型检查点和示例代码&#12290;<br>
<br>
<b>背景</b><br>
透射光显微技术操作简单&#65292;但生成的图像难以分辨&#12290;以下图为例&#65292;这是通过<a href="https://en.wikipedia.org/wiki/Phase-contrast_microscopy">相衬</a>显微镜获得的一个图像&#65292;其中的像素强度表示光线穿过样本时<a href="https://en.wikipedia.org/wiki/Phase_(waves)">相位</a>变化的程度&#12290;<br>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-cdI586G26wE/Ws6L7Qsf4UI/AAAAAAAACjA/aTTOMDI7iKol4GPWz_TkUx8AghcRX4hDACLcBGAs/s1600/image3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1391" data-original-width="1600" height="556" src="https://2.bp.blogspot.com/-cdI586G26wE/Ws6L7Qsf4UI/AAAAAAAACjA/aTTOMDI7iKol4GPWz_TkUx8AghcRX4hDACLcBGAs/s640/image3.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">利用<a href="https://en.wikipedia.org/wiki/Induced_pluripotent_stem_cell">诱导性多能干细胞</a>培养的人体<a href="https://en.wikipedia.org/wiki/Motor_neuron">运动神经元</a>的透射光&#65288;相衬显微镜&#65289;图像&#12290;图样 1 显示的是疑似神经元的一组细胞&#12290;图样 2 显示图像有缺损&#65292;底层细胞模糊不清&#12290;图样 3 显示的是<a href="https://en.wikipedia.org/wiki/Neurite">神经突</a>&#12290;图样 4 显示的内容疑似死细胞&#12290;比例尺&#65306;40 微米&#12290;这一组图像和以下图片均来自 Gladstone 研究所的 <a href="https://labs.gladstone.org/finkbeiner/">Finkbeiner 实验室</a>&#12290;</td></tr>
</tbody></table>
在上图中&#65292;很难判断图样 1 的神经元簇中的细胞数量&#65292;也无法看出图样 4 中细胞的位置和状态&#65288;提示&#65306;在中上方位置有一个非常不明显的扁平细胞&#65289;&#12290;同时也很难始终让精细结构保持在对焦范围内&#65292;如图样 3 中的神经突&#12290;<br>
<br>
我们可以通过在 z 堆栈中获取图像&#65292;利用透射光显微技术获得更多信息&#65306;在 (<i>x, y</i>) 中配准图像&#65292;而 <i>z</i>&#65288;与相机的距离&#65289;会系统地发生变化&#12290;这会使细胞的不同部分对焦或脱焦&#65292;从而提供样本的 3D 结构信息&#12290;遗憾的是&#65292;通常只有有经验的分析人员才能看懂 z 堆栈&#65292;而此类 z 堆栈的分析目前在很大程度上还无法实现自动化&#12290;下面是一个 z 堆栈示例&#12290;<br>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-SoRKoAJbdJg/Ws6uTPjO-tI/AAAAAAAACjs/KJ7b-vwLQmUyWFfn9NcMotJZrxZCG2mPQCLcBGAs/s1600/transmitted_light_ezgif.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1390" data-original-width="1600" height="556" src="https://4.bp.blogspot.com/-SoRKoAJbdJg/Ws6uTPjO-tI/AAAAAAAACjs/KJ7b-vwLQmUyWFfn9NcMotJZrxZCG2mPQCLcBGAs/s640/transmitted_light_ezgif.gif" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">相同细胞的相衬显微镜 z 堆栈&#12290;注意焦点移动时表象的相应变化&#12290;现在我们可以看出&#65292;图样 1 右下方的模糊形状是单个椭圆形细胞&#65292;图样 4 中最右边的细胞比最上面的细胞还要长&#65292;这表明它可能经历了<a href="https://en.wikipedia.org/wiki/Programmed_cell_death">细胞程序性死亡</a>&#12290;</td></tr>
</tbody></table>
在用荧光显微技术观察到的图像中&#65292;研究人员用荧光对要观察的内容进行了精心标记&#65292;因而&#65292;相比之下分析起来更加容易&#12290;例如&#65292;大多数人类细胞只有一个细胞核&#65292;因此可以进行细胞核标记&#65288;如下图的蓝色标记&#65289;&#65292;这就使得利用简单工具查找图像中的细胞和统计细胞数量成为可能&#12290;<br>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-ouXMKq-bQcQ/Ws6OWxpO73I/AAAAAAAACjU/-l0ssSscghA7tho1OIKR3L05hIjUCwkmACLcBGAs/s1600/image5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1391" data-original-width="1600" height="556" src="https://2.bp.blogspot.com/-ouXMKq-bQcQ/Ws6OWxpO73I/AAAAAAAACjU/-l0ssSscghA7tho1OIKR3L05hIjUCwkmACLcBGAs/s640/image5.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">相同细胞的荧光显微图像&#12290;蓝色荧光标记集中于 DNA&#65292;突出了细胞核&#12290;绿色荧光标记集中于仅存在于<a href="https://en.wikipedia.org/wiki/Dendrite">树突</a>&#65288;一种神经子结构&#65289;中的蛋白质&#12290;红色荧光标记集中于仅存在于<a href="https://en.wikipedia.org/wiki/Axon">轴突</a>&#65288;另一种神经子结构&#65289;中的蛋白质&#12290;通过这些标记&#65292;可以更轻松地了解样本中发生的情况&#12290;例如&#65292;图样 1 中的绿色和红色标记确认这是神经元簇&#12290;图样 3 中的红色标记显示<a href="https://en.wikipedia.org/wiki/Neurite">神经突</a>是轴突而不是树突&#12290;图样 4 中左上方的蓝点显示出之前难以辨认的细胞核&#65292;而左侧细胞缺失蓝点&#65292;表明它是无 DNA 的细胞碎片&#12290;</td></tr>
</tbody></table>
不过&#65292;荧光显微技术存在严重的缺陷&#12290;首先&#65292;样本制备和荧光标记本身增加了复杂程度和变数&#12290;其次&#65292;如果样本中存在许多不同的荧光标记&#65292;光谱重叠会使人很难分辨出哪一种颜色属于哪个标记&#65292;因此&#65292;研究人员通常只能在一个样本中同时使用 3 到 4 个标记&#12290;再次&#65292;荧光标记可能对细胞有害&#65292;有时还可能直接杀死细胞&#65292;这样一来&#65292;在需要随着时间推移跟踪细胞的纵向研究中很难使用标记&#12290;<br>
<br>
<b>利用深度学习发现更多信息</b><br>
在论文中&#65292;我们展示深度神经网络可以根据透射光 z 堆栈预测荧光图像&#12290;为此&#65292;我们创建了一个与荧光图像匹配的透射光 z 堆栈数据集&#65292;并训练了一个神经网络来根据 z 堆栈预测荧光图像&#12290;具体过程如下图所示&#12290;<br>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-xQ8CmOho2YE/Ws6PUK008ZI/AAAAAAAACjc/0xaoQLW7iE8Mkwrh8__kMtqt1jFcTGZQwCEwYBhgL/s1600/image1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1333" data-original-width="1600" height="532" src="https://4.bp.blogspot.com/-xQ8CmOho2YE/Ws6PUK008ZI/AAAAAAAACjc/0xaoQLW7iE8Mkwrh8__kMtqt1jFcTGZQwCEwYBhgL/s640/image1.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">我们系统的概览&#12290;(A) 训练示例的数据集&#65306;z 堆栈的透射光图像对与同一场景下像素配准的荧光图像集&#12290;使用几种不同的荧光标记生成荧光图像&#65292;并且不同训练示例中所用的标记也各不相同&#65307;棋盘格图像表示没有为给定示例获取的荧光标记&#12290;(B) 未训练的深度网络使用数据 A 训练 (C)&#12290;(D) 新场景下图像的 z 堆栈&#12290;(E) 训练的网络 C 用于为新图像 D 中的每个像素预测从 A 中学习的荧光标记&#12290;</td></tr>
</tbody></table>
在研究过程中&#65292;受到 <a href="https://arxiv.org/abs/1409.4842?spm=5176.100239.blogcont78726.30.A1YKhD&amp;file=1409.4842">Inception</a> 模块化设计的启发&#65292;我们开发了一种新型神经网络&#65292;此网络由以下三种基本构建块组成&#65306;<span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">in-scale</span> 配置&#65288;不改变特征的空间缩放&#65289;&#12289;<span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">down-scale</span> 配置&#65288;将空间缩放加倍&#65289;以及 <span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">up-scale</span> 配置&#65288;将空间缩放减半&#65289;&#12290;这样一来&#65292;网络架构设计的难题分解为两个简单的问题&#65306;构建块&#65288;宏架构&#65289;的安排以及构建块本身&#65288;微架构&#65289;的设计&#12290;我们使用论文中讨论的设计原则解决了第一个问题&#65292;第二个问题则通过由 <a href="https://cloud.google.com/ml-engine/docs/tensorflow/using-hyperparameter-tuning">Google Hypertune</a> 提供支持的自动搜索加以解决&#12290;<br>
<br>
为了确保方法的合理性&#65292;我们使用来自 Alphabet 实验室以及两个外部合作伙伴的数据对模型进行了验证&#65306;<a href="https://gladstone.org/about-us/news/deep-learning-superhuman-way-look-cells">Gladstone 研究所的 Steve Finkbeiner 实验室</a>和<a href="https://hscrb.harvard.edu/res-fl-rubin">哈佛大学 Rubin 实验室</a>&#12290;这些数据包含了三种透射光成像模式&#65288;<a href="https://en.wikipedia.org/wiki/Bright-field_microscopy">亮视野</a>&#12289;<a href="https://en.wikipedia.org/wiki/Phase-contrast_microscopy">相衬</a>和<a href="https://en.wikipedia.org/wiki/Differential_interference_contrast_microscopy">微分干涉对比</a>&#65289;和三种培养类型&#65288;来自<a href="https://en.wikipedia.org/wiki/Induced_pluripotent_stem_cell">诱导性多能干细胞</a>的人体<a href="https://en.wikipedia.org/wiki/Motor_neuron">运动神经元</a>&#12289;老鼠<a href="https://en.wikipedia.org/wiki/Cultured_neuronal_network">大脑皮层培养</a>和人类乳腺癌细胞&#65289;&#12290;结果发现&#65292;我们的方法可以准确预测细胞核&#12289;细胞类型&#65288;例如神经细胞&#65289;和细胞状态&#65288;例如细胞死亡&#65289;等的多个标记&#12290;下图显示了模型对透射光输入的预测以及我们运动神经元示例的荧光实况&#12290;<br>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-zua4ytgpnyo/Ws6MTXZwhaI/AAAAAAAACjE/RQ8ZRur181s7eIXFVxbA_Yv9yQc6ed0awCLcBGAs/s1600/prediction.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1479" data-original-width="1600" height="590" src="https://2.bp.blogspot.com/-zua4ytgpnyo/Ws6MTXZwhaI/AAAAAAAACjE/RQ8ZRur181s7eIXFVxbA_Yv9yQc6ed0awCLcBGAs/s640/prediction.gif" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">动画显示了相同细胞的透射光和荧光成像以及我们的模型预测的荧光标记&#12290;根据图样 2 所示&#65292;尽管输入图像中存在伪像&#65292;模型依然正确预测了标记&#12290;在图样 3 中&#65292;模型可能基于过程与最近的细胞之间的距离推断出这些过程是轴突&#12290;在图样 4 中&#65292;模型在顶部显示出之前难以辨认的细胞&#65292;并将左侧的物体正确识别为无 DNA 的细胞碎片&#12290;</td></tr>
</tbody></table>
<b>自己动手尝试一下吧&#65281;</b><br>
我们已经<a href="https://github.com/google/in-silico-labeling">开源模型</a>&#65292;并提供了完整数据集&#12289;训练与推理代码以及示例&#12290;我们很高兴地宣布&#65292;只需借助最少的额外数据训练就能生成新标记&#65306;在论文和示例代码中&#65292;我们展示了可以通过<i>单个图像</i>学习新标记&#12290;这是一种称为<a href="https://en.wikipedia.org/wiki/Transfer_learning">迁移学习</a>的现象&#65292;即&#65292;如果一个模型已掌握某些任务&#65292;那么它在学习类似的新任务时&#65292;速度将更快&#65292;使用的训练数据也将更少&#12290;<br>
<br>
此方法能够在不修改细胞的情况下生成带标记的有用图像&#65292;我们希望这种技术能够在生物学和医学领域开创全新的实验类型&#12290;如果您有意在工作中使用这项技术&#65292;请阅读论文或<a href="https://github.com/google/in-silico-labeling">查看代码</a>&#65281;<br>
<br>
<b>致谢</b><br>
<i>本项目由 <a href="https://research.google.com/teams/gas/">Google Accelerated Science 团队</a>发起&#12289;开发及发布&#65292;在此表示感谢&#65292;同时感谢 Kevin P. Murphy 对项目发布提供的支持&#12290;Mike Ando&#12289;Youness Bennani&#12289;Amy Chung-Yu Chou&#12289;Jason Freidenfelds&#12289;Jason Miller&#12289;Kevin P. Murphy&#12289;Philip Nelson&#12289;Patrick Riley 和 Samuel Yang 参与了本文的构思和编辑&#65292;在此一并感谢&#12290;本研究由 NINDS&#65288;NS091046&#12289;NS083390&#12289;NS101995&#65289;&#12289;NIH 国家衰老研究所&#65288;AG065151&#12289;AG058476&#65289;&#12289;NIH 国家人类基因组研究所&#65288;HG008105&#65289;&#12289;Google&#12289;ALS 协会和 Michael J. Fox 基金会提供支持&#12290;<br>
</i> <span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person">
  <meta content="https://plus.google.com/116899029375914044550" itemprop="url">
</span>
                        <!--<meta name="original_url" content="https://research.googleblog.com/2018/04/seeing-more-with-in-silico-labeling-of_12.html"><meta name="original_title" content="Research Blog: Seeing More with In Silico Labeling of Microscopy Images"><meta name="original_blog" content="Google Research Blog">-->
                        </script>
</div>
</div>
</div>
<div class='post' data-id='5346557732197312409' itemscope='' itemtype='http://schema.org/BlogPosting'>
<h2 class='title' itemprop='name'>
<a href='https://googledeveloperschina.blogspot.com/2018/07/protecting-webview-with-safe-browsing.html' itemprop='url' title='通过安全浏览保护 WebView'>
通过安全浏览保护 WebView
</a>
</h2>
<div class='post-header'>
<div class='published'>
<span class='publishdate' itemprop='datePublished'>
2018年7月18日星期三
</span>
</div>
</div>
<div class='post-body'>
<div class='post-content' itemprop='articleBody'>
<script type='text/template'>
                          &#65279;自 2007 年以来&#65292;Google 安全浏览一直为网络用户提供保护&#65292;让他们免遭网络钓鱼和恶意软件的攻击&#12290;此功能<a href="https://www.blog.google/topics/safety-security/safe-browsing-protecting-more-3-billion-devices-worldwide-automatically/">为 30 多亿台设备提供保护</a>&#65292;帮助这些设备抵御日益增多的威胁&#65292;现在还支持跨桌面和移动平台检测不需要的软件&#12290;今天&#65292;我们宣布&#65292;自 2018 年 4 月起随着 WebView 66 的发布&#65292;Google Play 保护机制将在 WebView 中默认启用安全浏览&#12290;<br />
<br />
使用 WebView 的 Android 应用开发者无需再进行任何更改&#65292;即可享受此项保护服务&#12290;自 Android 8.0&#65288;API 级别 26&#65289;开始&#65292;WebView 中即已集成安全浏览功能&#65292;并与 <a href="https://security.googleblog.com/2015/12/protecting-hundreds-of-millions-more.html">Android 版 Chrome</a> 采用相同的底层技术&#12290;安全浏览触发后&#65292;应用将显示警告并收到网络错误&#12290;为 API 级别 27 及以上版本构建的应用可以使用<a href="https://developer.android.com/reference/android/webkit/WebView.html">面向安全浏览的新 API</a> 自定义此行为&#12290;<br />
<br />
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-oBeTlkaflac/WsaE7Exk4KI/AAAAAAAAA5Q/rmuPz7MMP10fkOoRA2XDN58wj5dbIllnQCLcBGAs/s1600/2018-03-15_18-13-07_droidshot_iYaiS.png" imageanchor="1" style="margin: 0 1em;"><img border="0" data-original-height="1600" data-original-width="900" src="https://3.bp.blogspot.com/-oBeTlkaflac/WsaE7Exk4KI/AAAAAAAAA5Q/rmuPz7MMP10fkOoRA2XDN58wj5dbIllnQCLcBGAs/s1600/2018-03-15_18-13-07_droidshot_iYaiS.png" style="max-width: 300px;" /></a></div>
</div>
<i><span style="font-size: small; font-style: italic; line-height: 14px;">上图为安全浏览检测到危险网站时显示的警告示例&#12290;警告的样式和内容取决于 WebView 的大小&#12290;</span></i><br />
<br />
您可以通过 <a href="https://developer.android.com/reference/android/webkit/WebView.html">Android API 文档</a>详细了解如何自定义和控制安全浏览&#65292;即日起&#65292;还可以访问安全浏览测试网址 (chrome://safe-browsing/match?type=malware) 并<a href="https://www.chromium.org/developers/androidwebview/android-webview-beta">使用最新的 WebView 测试版</a>&#65292;对您的应用进行测试&#12290;<br />
<br />
发布人&#65306;软件工程师 Nate Fischer<br />
<div>
<br /></div>
<span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person">
    
</span>
                        <!--<meta name="original_url" content="https://blog.chromium.org/2018/04/protecting-webview-with-safe-browsing.html"><meta name="original_title" content="Chromium Blog: Protecting WebView with Safe Browsing"><meta name="original_blog" content="Chromium Blog">-->
                        </script>
</div>
</div>
</div>
<div class='post' data-id='7941872500826396878' itemscope='' itemtype='http://schema.org/BlogPosting'>
<h2 class='title' itemprop='name'>
<a href='https://googledeveloperschina.blogspot.com/2018/07/Kubernetes-best-practices-mapping-external-services.html' itemprop='url' title='Kubernetes 最佳实践：映射外部服务'>
Kubernetes 最佳实践&#65306;映射外部服务
</a>
</h2>
<div class='post-header'>
<div class='published'>
<span class='publishdate' itemprop='datePublished'>
2018年7月18日星期三
</span>
</div>
</div>
<div class='post-body'>
<div class='post-content' itemprop='articleBody'>
<script type='text/template'>
                          &#65279;<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><style>code { background-color: transparent }</style>
                          <span class="byline-author">发布人&#65306;开发技术推广工程师 Sandeep Dinesh</span><br>
<br>
<i><b>编者注</b>&#65306;本期将推出由 Google 开发技术推广工程师 <a href="https://twitter.com/sandeepdinesh?lang=en" target="_blank">Sandeep Dinesh</a> 主讲的关于如何充分利用 Kubernetes 环境的<a href="https://www.youtube.com/playlist?list=PLIivdWyY5sqL3xfXz5xJvwzFW_tlQB_GB" target="_blank">视频</a>和<a href="https://www.google.com/search?q=site%3Acloudplatform.googleblog.com%20%22kubernetes%20best%20practices%22" target="_blank">博客系列</a>的第六部分&#65288;共七部分&#65289;&#12290;</i><br>
<br>
大多数 Kubernetes 用户都有可能用到集群外部的服务&#12290;例如&#65292;您可能使用 <a href="https://www.twilio.com/docs/api" target="_blank">Twillio API</a> 发送短信&#65292;或使用 <a href="https://cloud.google.com/vision/" target="_blank">Google Cloud Vision API</a> 进行图像分析&#12290;<br>
<br>
如果位于不同环境中的应用连接相同的外部端点&#65292;并且您不打算将外部服务引入 Kubernetes 集群&#65292;那么在代码中直接使用外部服务端点是完全可以的&#12290;然而&#65292;很多时候情况并非如此&#12290;<br>
<br>
数据库就是一个很好的例子&#12290;虽然一些云原生数据库&#65288;如 <a href="https://cloud.google.com/firestore/" target="_blank">Cloud Firestore</a> 或 <a href="https://cloud.google.com/spanner/" target="_blank">Cloud Spanner</a>&#65289;对所有访问均使用一个端点&#65292;但大多数数据库对不同实例都有单独的端点&#12290;<br>
<br>
说到这里&#65292;您可能会认为&#65292;就查找端点而言&#65292;ConfigMap 是个不错的解决方案&#12290;只需将端点地址存储在 <a href="https://medium.com/google-cloud/kubernetes-configmaps-and-secrets-68d061f7ab5b" target="_blank">ConfigMap</a> 中&#65292;并将其作为环境变量用于代码中&#12290;此解决方案的确有效&#65292;但也存在一些缺点&#12290;您需要修改部署以包含 ConfigMap 并编写额外的代码以从环境变量中读取&#12290;但最重要的是&#65292;如果端点地址发生变化&#65292;您可能需要重启所有正在运行的容器以获取更新后的端点地址&#12290;<br>
<br>
在本集的&#8220;Kubernetes 最佳实践&#8221;中&#65292;我们会学习如何将 Kubernetes 内置服务发现机制运用于集群外部运行的服务&#65292;像使用集群内的服务一样使用外部服务&#65281;通过这种方式&#65292;您可以在开发环境和生产环境中实现相同的功能&#65292;如果您最终将服务移入集群内&#65292;则不需要更改任何代码&#12290;<br>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/fvpq4jqtuZ8/0.jpg" frameborder="0" height="360" src="https://www.youtube.com/embed/fvpq4jqtuZ8?feature=player_embedded" width="640"></iframe></div>
<br>
<h3>
场景 1&#65306;具有 IP 地址的集群外数据库</h3>
其中一个常见场景是在集群外部托管自己的数据库&#65292;例如在 <a href="https://cloud.google.com/compute/" target="_blank">Google 计算引擎</a>实例中&#12290;如果您在 Kubernetes 内部和外部分别运行一些服务&#65292;或者需要在 Kubernetes 允许的基础上获得更多定制或控制&#65292;通常可采用上述这种方式&#12290;<br>
<br>
希望未来某个时候您可以将所有服务都移入集群内&#65292;但在此之前将是&#8220;内外混用&#8221;的状态&#12290;幸运的是&#65292;您可以使用静态 Kubernetes 服务来缓解上述痛点&#12290;<br>
<br>
在本例中&#65292;我使用 <a href="http://console.cloud.google.com/launcher/details/click-to-deploy-images/mongodb" target="_blank">Cloud Launcher</a> 创建了一个 MongoDB 服务器&#12290;由于此服务器在与 Kubernetes 集群相同的网络&#65288;或 VPC&#65289;中创建&#65292;因此可以使用<a href="https://medium.com/@duhroach/internal-ip-vs-external-ip-performance-76f15a650356" target="_blank">高性能的内部 IP 地址</a>访问&#12290;在 Google Cloud 中&#65292;这是默认设置&#65292;因此无需进行任何特殊配置&#12290;<br>
<div class="separator" style="clear: both; text-align: center;">
<img border="0" data-original-height="56" data-original-width="881" src="https://4.bp.blogspot.com/-r5AWmuJhv5g/WwYC6NJQu_I/AAAAAAAAFu0/_b5utAQQ13kiQlHL7fzUy0ZgG4V34wJqACLcBGAs/s1600/gcp-kubernetes-internal-ip-address.png"></div>
<br>
现在我们有了 IP 地址&#65292;那么第一步就是创建服务&#65306;
<br>
<pre><code>kind: Service
apiVersion: v1
metadata:
 name: mongo
Spec:
 type: ClusterIP
 ports:
 - port: 27017
   targetPort: 27017</code></pre>
您可能会注意到此服务没有 Pod 选择器&#12290;此操作将创建一个服务&#65292;但它不知道往哪里发送流量&#12290;这样一来&#65292;您可以手动创建一个将从此服务接收流量的 Endpoints 对象&#12290;<br>
<br>
<pre><code>kind: Endpoints
apiVersion: v1
metadata:
 name: mongo
subsets:
 - addresses:
     - ip: 10.240.0.4
   ports:
     - port: 27017</code></pre>
您可以看到 Endpoints 手动定义了数据库的 IP 地址&#65292;并且使用的名称与服务名称相同&#12290;Kubernetes 将 Endpoints 中定义的所有 IP 地址视为与常规 Kubernetes Pod 一样&#12290;现在您可以用一个简单的连接字符串访问数据库&#65306;
<br>
<pre><code>mongodb://mongo</code></pre>
&gt; 根本不需要在代码中使用 IP 地址&#65281;如果以后 IP 地址发生变化&#65292;您可以为端点更新 IP 地址&#65292;而应用无需进行任何更改&#12290;<br>
<br>
<h3>
场景 2&#65306;具有 URI 的远程托管数据库</h3>
如果您使用的是来自第三方的托管数据库服务&#65292;它们可能会为您提供可用于连接的统一资源标识符 (URI)&#12290;如果它们为您提供 IP 地址&#65292;则可以使用场景 1 中的方法&#12290; <br>
<br>
在本例中&#65292;我在 <a href="https://mlab.com/google" target="_blank">mLab</a> 上托管了两个 MongoDB 数据库&#12290;一个是我的开发数据库&#65292;另一个是生产数据库&#12290;<br>
<div class="separator" style="clear: both; text-align: center;">
<img border="0" data-original-height="311" data-original-width="1127" src="https://3.bp.blogspot.com/-_RRGLSWY1Tg/WwYC6KDU0iI/AAAAAAAAFu8/QhN6S0PuL28nTFrXqitzfdyGnixLXtj3QCEwYBhgL/s1600/gcp-kubernetes-mongodb-deployments.png"></div>
<br>
这些数据库的连接字符串如下所示&#65306;
<br>
<pre><code>mongodb://&lt;dbuser&gt;:&lt;dbpassword&gt;@ds149763.mlab.com:49763/dev</code></pre>
<pre><code>mongodb://&lt;dbuser&gt;:&lt;dbpassword&gt;@ds145868.mlab.com:45868/prod</code></pre>
mLab 为您提供了动态 URI 和动态端口&#65292;您可以看到两者都不同&#12290;我们来使用 Kubernetes 基于这些差异创建一个抽象层&#12290;在本例中&#65292;我们将连接开发数据库&#12290;<br>
<br>
您可以创建一个&#8220;ExternalName&#8221;Kubernetes 服务&#65292;此服务为您提供将流量重定向到外部服务的静态 Kubernetes 服务&#12290;此服务在内核级别执行简单的 CNAME 重定向&#65292;因此对性能的影响非常小&#12290;<br>
<br>
服务的 YAML 如下所示&#65306;
<br>
<pre><code>kind: Service
apiVersion: v1
metadata:
 name: mongo
spec:
 type: ExternalName
 externalName: ds149763.mlab.com</code></pre>
现在&#65292;您可以使用更简化的连接字符串&#65306;
<br>
<pre><code>mongodb://&lt;dbuser&gt;:&lt;dbpassword&gt;@mongo:&lt;port&gt;/dev</code></pre>
由于&#8220;ExternalName&#8221;使用 CNAME 重定向&#65292;因此无法执行端口重映射&#12290;对于使用静态端口的服务来说&#65292;这可能不成问题&#65292;然而本例中使用的是动态端口&#12290;mLab 免费版为您提供了动态端口号&#65292;并且不允许更改&#12290;这意味着您需要对开发和生产数据库使用其他连接字符串&#12290;<br>
<br>
但如果您可以获取 IP 地址&#65292;就可以执行端口重映射&#65292;关于此内容&#65292;我将在下一部分进行介绍&#12290;<br>
<h3>
场景 3&#65306;具有 URI 和端口重映射功能的远程托管数据库</h3>
CNAME 重定向对于每个环境均使用相同端口的服务非常有效&#65292;但如果每个环境的不同端点使用不同的端口&#65292;CNAME 重定向就略显不足&#12290;幸运的是我们可以使用一些基本工具来解决这个问题&#12290;<br>
<br>
第一步是从 URI 获取 IP 地址&#12290; <br>
<br>
对 URI 运行 nslookup&#12289;hostname 或 ping 命令即可获取数据库的 IP 地址&#12290;<br>
<div class="separator" style="clear: both; text-align: center;">
<img border="0" data-original-height="241" data-original-width="746" src="https://2.bp.blogspot.com/-LAq32CiKAYc/WwYC6LlreYI/AAAAAAAAFvE/9_-BMf0k21Qt9PLsz_9vwLOogZ4JNBgeQCEwYBhgL/s1600/gcp-kubernetes-nslookup.png"></div>
<br>
您现在可以创建一个重新映射 mLab 端口的服务&#65292;并为此 IP 地址创建端点&#12290;
<br>
<pre><code>kind: Service
apiVersion: v1
metadata:
 name: mongo
spec:
 ports:
 - port: 27017
   targetPort: 49763
---
kind: Endpoints
apiVersion: v1
metadata:
 name: mongo
subsets:
 - addresses:
     - ip: 35.188.8.12
   ports:
     - port: 49763</code></pre>
<i>注&#65306;URI 可以使用 DNS 在多个 IP 地址之间进行负载平衡&#65292;因此&#65292;如果 IP 地址发生变化&#65292;这个方法可能会有风险&#65281;如果您通过上述命令获取多个 IP 地址&#65292;则可以将所有这些地址都包含在 Endpoints YAML 中&#65292;并且 Kubernetes 会在所有 IP 地址之间进行流量的负载平衡&#12290;</i><br>
<br>
通过这种方式&#65292;您无需指定端口即可连接到远程数据库&#12290;Kubernetes 服务重映射端口的过程完全透明&#65281;
<br>
<pre><code>mongodb://&lt;dbuser&gt;:&lt;dbpassword&gt;@mongo/dev</code></pre>
<h3>
结论</h3>
将外部服务映射到内部服务可让您未来灵活地将这些服务纳入集群&#65292;同时最大限度地减少重构工作&#12290;即使您今天不打算将服务加入集群&#65292;以后可能也会这样做&#65281;而且&#65292;这样一来&#65292;您可以更轻松地管理和了解组织所使用的外部服务&#12290;<br>
<br>
如果外部服务具有有效域名&#65292;并且您不需要重新映射端口&#65292;那么使用&#8220;ExternalName&#8221;服务类型将外部服务映射到内部服务十分简便&#12289;快捷&#12290;如果您没有域名或需要执行端口重映射&#65292;只需将 IP 地址添加到端点并使用即可&#12290;<br>
<br>
想要参加 <a href="https://cloud.withgoogle.com/next18/" target="_blank">Google Cloud Next18</a>&#65311;欢迎莅临&#8220;Meet the Experts&#8221;专区&#65292;与我和 Kubernetes 团队其他成员交流&#65281;希望能在那里见到您&#65281;<span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person">
  <meta content="https://plus.google.com/116899029375914044550" itemprop="url">
</span>
                        <!--<meta name="original_url" content="https://cloudplatform.googleblog.com/2018/05/Kubernetes-best-practices-mapping-external-services.html"><meta name="original_title" content="Google Cloud Platform Blog: Kubernetes best practices: mapping external services"><meta name="original_blog" content="Google Cloud Platform Blog">-->
                        </script>
</div>
</div>
</div>
<div class='post' data-id='2226402633970878752' itemscope='' itemtype='http://schema.org/BlogPosting'>
<h2 class='title' itemprop='name'>
<a href='https://googledeveloperschina.blogspot.com/2018/07/the-shadow-reader-improved.html' itemprop='url' title='Shadow Reader 得到改进'>
Shadow Reader 得到改进
</a>
</h2>
<div class='post-header'>
<div class='published'>
<span class='publishdate' itemprop='datePublished'>
2018年7月18日星期三
</span>
</div>
</div>
<div class='post-body'>
<div class='post-content' itemprop='articleBody'>
<script type='text/template'>
                          &#65279;<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><style>code { background-color: transparent }</style>
 <header class="entry-header">
  <h1 class="entry-title">Shadow Reader 得到改进</h1>
  <div class="entry-meta">
   <span class="posted-on"><a href="https://amphtml.wordpress.com/2018/06/19/the-shadow-reader-improved/" rel="bookmark"><time class="entry-date published updated" datetime="2018-06-19T11:22:01+00:00">2018 年 6 月 19 日</time></a></span><span class="byline"><span class="author vcard"><a class="url fn n" href="https://amphtml.wordpress.com/author/amphtml/">amphtml</a></span></span>  </div><!-- .entry-meta -->

 </header><!-- .entry-header -->

 <div class="entry-content">
  <br/>
<span style="font-weight:400;">我们提升了 <a href="https://amp.cards">Shadow Reader</a> 的运行速度以及对搜索引擎的友好度&#65281;</span><br/>

<br/>
<span style="font-weight:400;">我们创建了 </span><a href="https://amp.cards"><span style="font-weight:400;">Shadow Reader</span></a><span style="font-weight:400;"> 来演示如何在渐进式网页应用 (PWA) 中使用 AMP 页面&#65288;请阅读我们的</span><a href="https://www.ampproject.org/latest/blog/putting-the-amp-in-progressive-web-amps-meet-the-shadowreader/"><span style="font-weight:400;">公告博文</span></a><span style="font-weight:400;">来了解更多信息&#65289;&#12290;该网站将 </span><a href="https://www.theguardian.com"><span style="font-weight:400;">The Guardian</span></a><span style="font-weight:400;"> 中的现有文章转变为沉浸式新闻阅读器体验&#12290;这不仅仅是一个演示&#65292;而是要成为一个功能齐全的网站&#12290;它包含有效组合 AMP 和 PWA 所需的端到端代码并已准备好用于生产&#65281;</span><br/>

<br/>
&nbsp;<br/>

<h2><span style="font-weight:400;">针对 JS 生成内容的 SEO</span></h2>
<br/>
<span style="font-weight:400;">与在任何普通的单页应用中一样&#65292;Shadow Reader 的初始 HTML 负载很小&#12290;这是一个可以快速加载的瘦应用 shell&#65292;在 JavaScript 加载主要内容时向用户显示一些信息&#12290;这种方式提供了良好的用户体验&#65281;</span><br/>

<br/>
<span style="font-weight:400;">然而&#65292;它也可能为搜索引擎带来挑战&#12290;Google 会尝试执行 JavaScript&#65292;以便为向用户最终展示的内容编制索引&#65292;而不仅仅是最初的 HTML&#12290;但</span><a href="https://moz.com/blog/search-engines-ready-for-javascript-crawling"><span style="font-weight:400;">许多搜索引擎并不会这么做&#65292;或者虽然做但并不可靠</span></a><span style="font-weight:400;">&#12290;换句话说&#65292;依靠搜索引擎成功执行 JavaScript 并不稳妥&#12290;并且如果搜索引擎仅看到应用 shell&#65292;而缺少大部分或全部内容&#65292;则无法为页面正确编制索引&#12290;</span><br/>

<br/>
<span style="font-weight:400;">如果通过 HTML 中包含的文本将 Shadow Reader 的文章页面提供给搜索引擎&#65292;这样不是很好吗&#65311;如果该过程不会降低渲染速度&#65292;反而让我们有办法在不到一秒的时间内为新用户提供这些页面&#65292;这会不会是个超棒的功能&#65311;</span><br/>

<br/>
<span style="font-weight:400;">原来&#65292;我们可以通过向新用户提供 AMP 版本的文章来同时实现这两点&#65281;毕竟&#65292;网络抓取工具对于服务器而言也是一个新用户&#12290;所以&#8230;&#8230;我们是如何实现的呢&#65311;</span><br/>

<br/>
&nbsp;<br/>

<h2><span style="font-weight:400;">AMP&#8658;PWA</span></h2>
<br/>
<span style="font-weight:400;">我们通过实现 AMP&#8658;PWA 模式做到这一点&#12290;工作原理如下&#65281;</span><br/>

<br/>
<i><span style="font-weight:400;">对于新用户</span></i><span style="font-weight:400;">&#65306;</span><br/>

<ul>
<li style="font-weight:400;"><span style="font-weight:400;">当新用户访问文章页面时&#65292;我们会提供该文章的 AMP 版本&#12290;</span></li>
<li style="font-weight:400;"><span style="font-weight:400;">AMP 使用 </span><a href="https://www.ampproject.org/docs/reference/components/amp-install-serviceworker"><span style="font-weight:400;">&lt;amp-install-serviceworker&gt;</span></a><span style="font-weight:400;"> 加载并安装 Service Worker&#12290;</span></li>
<li style="font-weight:400;"><span style="font-weight:400;">Service Worker 加载并缓存应用 shell&#12290;</span></li>
<li style="font-weight:400;"><span style="font-weight:400;">在下一页导航中&#65292;Service Worker 处于控制之中&#65292;因此可以平稳地将用户带入 PWA 中的下一页&#12290;</span></li>
</ul>
<br/>
<i><span style="font-weight:400;">对于现有用户</span></i><span style="font-weight:400;">&#65292;我们则直接提供 PWA&#12290;</span><br/>

<br/>
<span style="font-weight:400;">以上介绍了我们的网站如何在同一网址上以不同方式对待新用户和现有用户&#12290;对于现有用户&#65292;安装 Service Worker&#12290;而且&#65292;当 Service Worker 看到某篇文章的网址时&#65292;它会提供所缓存的 PWA 版本&#12290;</span><br/>

<br/>
<span style="font-weight:400;">此功能在 Shadow Reader 中是怎样的情形呢&#65311;假设某用户首次访问此文章页面&#65306;</span><br/>

<pre><span style="font-weight:400;">https://amp.cards/theguardian/us/amazing_article</span></pre>
<br/>
<span style="font-weight:400;">看到文章网址时&#65292;服务器将返回文章的 AMP 版本&#65292;但在加载文章后返回安装 Service Worker 的版本&#12290;使用 </span><a href="https://developers.google.com/web/tools/workbox/"><span style="font-weight:400;">Workbox 库</span></a><span style="font-weight:400;">的 Service Worker 包含以下行&#65306;</span><br/>

<pre><span style="font-weight:400;">workboxSW.router.registerNavigationRoute('index.html')</span></pre>
<br/>
<span style="font-weight:400;">这意味着&#65292;只要用户导航到此域上的新网址&#65292;Service Worker 就会看到该请求&#65292;并且不会将其传递给服务器&#65292;而是直接为其提供缓存的 </span><span style="font-weight:400;">index.html</span><span style="font-weight:400;"> 版本&#12290;这就是我们的 PWA&#12290;</span><br/>

<br/>
<span style="font-weight:400;">因此&#65292;如果用户接下来点击指向以下网址的链接&#65306;</span><br/>

<pre><span style="font-weight:400;">https://amp.cards/theguardian/us/another_article</span></pre>
<br/>
<span style="font-weight:400;">Service Worker 将提供缓存的 PWA HTML&#12290;但网址保持不变&#65281;因此&#65292;当 PWA 查看网址以解析出所请求的文章时&#65292;它会看到用户请求的链接&#65292;并且可以将相应的文章加载到 PWA 中&#12290;</span><br/>

<br/>
<span style="font-weight:400;">此后&#65292;无论用户何时请求 Shadow Reader 链接&#65292;Service Worker 都已安装并会提供缓存的 PWA&#12290;</span><br/>

<br/>
<span style="font-weight:400;">由于网络抓取工具不允许我们安装 Service Worker&#65292;因此始终为网络抓取工具提供 AMP 文章&#12290;</span><br/>

<br/>
&nbsp;<br/>

<br/>
<span style="font-weight:400;">该流程的简化示意图如下所示&#65306;</span><br/>

<br/>
<img alt="" class="alignnone wp-image-2068" data-attachment-id="2068" data-comments-opened="0" data-image-description="" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="AMP-Shadow-Reader-diagram-v5" data-large-file="https://amphtml.files.wordpress.com/2018/06/amp-shadow-reader-diagram-v5.png?w=660" data-medium-file="https://amphtml.files.wordpress.com/2018/06/amp-shadow-reader-diagram-v5.png?w=710&amp;h=425" data-orig-file="https://amphtml.files.wordpress.com/2018/06/amp-shadow-reader-diagram-v5.png" data-orig-size="1419,850" data-permalink="https://amphtml.wordpress.com/2018/06/19/the-shadow-reader-improved/amp-shadow-reader-diagram-v5/" height="425" sizes="(max-width: 710px) 100vw, 710px" src="https://amphtml.files.wordpress.com/2018/06/amp-shadow-reader-diagram-v5.png?w=710&amp;h=425" srcset="https://amphtml.files.wordpress.com/2018/06/amp-shadow-reader-diagram-v5.png?w=710&amp;h=425 710w, https://amphtml.files.wordpress.com/2018/06/amp-shadow-reader-diagram-v5.png?w=150&amp;h=90 150w, https://amphtml.files.wordpress.com/2018/06/amp-shadow-reader-diagram-v5.png?w=300&amp;h=180 300w, https://amphtml.files.wordpress.com/2018/06/amp-shadow-reader-diagram-v5.png?w=768&amp;h=460 768w, https://amphtml.files.wordpress.com/2018/06/amp-shadow-reader-diagram-v5.png?w=1024&amp;h=613 1024w, https://amphtml.files.wordpress.com/2018/06/amp-shadow-reader-diagram-v5.png 1419w" width="710"><br/>

<br/>
<span style="font-weight:400;">对于</span><b>新用户</b><span style="font-weight:400;">&#65306;</span><br/>

<ol>
<li style="font-weight:400;"><span style="font-weight:400;">浏览器从服务器请求文章网址&#12290;服务器返回包含 </span><span style="font-weight:400;">&lt;amp-install-serviceworker&gt;</span> 的文章的 AMP 版本&#12290;</li>
<li style="font-weight:400;"><span style="font-weight:400;">AMP 的 Service Worker JS 使浏览器请求 Service Worker&#12290;服务器将 Service Worker JS 发送给浏览器&#12290;浏览器安装并启动 Service Worker&#12290;</span></li>
<li style="font-weight:400;"><span style="font-weight:400;">Service Worker 向服务器发送 PWA 应用 shell 请求&#12290;服务器将这些资源发送给 Service Worker&#65292;后者将这些资源缓存&#12290;</span></li>
</ol>
<br/>
<span style="font-weight:400;">对于</span><b>现有用户</b><span style="font-weight:400;">&#65306;</span><br/>

<ol>
<li style="font-weight:400;"><span style="font-weight:400;">浏览器发送文章网址请求&#12290;此请求被 Service Worker 拦截&#12290;Service Worker 将缓存的 PWA 返回给浏览器&#12290;</span></li>
<li style="font-weight:400;"><span style="font-weight:400;">PWA 请求 AMP 文章&#12290;此请求到达服务器&#65292;服务器将 AMP 文章返回给 PWA&#12290;PWA 处理并显示该文章&#12290;</span></li>
</ol>
<br/>
<span style="font-weight:400;">请注意&#65292;网络抓取工具始终视为新用户&#65281;</span><br/>

<br/>
&nbsp;<br/>

<h2><span style="font-weight:400;">未来计划</span></h2>
<br/>
<span style="font-weight:400;">既然 Shadow Reader 已经有了自己的服务器&#65292;我们将有一些新的任务需要完成&#65306;</span><br/>

<ul>
<li style="font-weight:400;"><span style="font-weight:400;">将来&#65292;我们可以完全放弃 YQL&#65292;直接使用 The Guardian 的 RSS Feed&#12290;</span></li>
<li style="font-weight:400;"><span style="font-weight:400;">我们还应该用 Shadow Reader 链接替换 The Guardian 的顶级导航链接&#12290;</span></li>
<li style="font-weight:400;"><span style="font-weight:400;">我们要求 AMP Cache 在 iframe 中下载并运行整个 Shadow Reader&#65306;</span><span style="font-weight:400;">&lt;amp-install-serviceworker data-iframe-src=&#8221;</span><a href="https://amp.cards/index.html"><span style="font-weight:400;">https://amp.cards/index.html</span></a><span style="font-weight:400;">&#8220;&gt;</span><span style="font-weight:400;">&#12290;对于临时用户而言&#65292;指定一个较小的页面可能会更好&#12290;</span></li>
<li style="font-weight:400;"><span style="font-weight:400;">Backend.js</span><span style="font-weight:400;"> 现在已经用于服务器以及前端&#65292;而且我们的实现方式有点怪异&#12290;或许我们应该重构代码以使用 </span><a href="https://jakearchibald.com/2017/es-modules-in-browsers/"><span style="font-weight:400;">ECMAScript modules</span></a><span style="font-weight:400;">&#65311;</span></li>
</ul>
<br/>
<span style="font-weight:400;">您可以尝试一下&#65292;</span><a href="https://github.com/ampproject/amp-publisher-sample"><span style="font-weight:400;">在 github 上查看代码</span></a><span style="font-weight:400;">&#65292;并跟我们分享您的想法&#65281;我们对您如何在自己的网站上使用 AMP/PWA 模式感到好奇&#65292;并且很乐意倾听您关于 Shadow Reader 改进的想法&#12290;</span><br/>

<br/>
&nbsp;<br/>

<br/>
发布人&#65306;Google 开发技术推广工程师 Ben Morss<br/>

</div><!-- .entry-content -->

 <div class="entry-format">
  <a href="https://amphtml.wordpress.com/2018/06/19/the-shadow-reader-improved/"><span class="screen-reader-text">Shadow Reader 得到改进</span></a> </div>
<!--<meta name="original_url" content="https://amphtml.wordpress.com/2018/06/19/the-shadow-reader-improved/"><meta name="original_title" content="The Shadow Reader, Improved &#8211; Accelerated Mobile Pages Project"><meta name="original_blog" content="Accelerated Mobile Pages Project">-->
                        </script>
</div>
</div>
</div>
<div class='post' data-id='7965758780154124144' itemscope='' itemtype='http://schema.org/BlogPosting'>
<h2 class='title' itemprop='name'>
<a href='https://googledeveloperschina.blogspot.com/2018/07/google-at-cvpr-2018.html' itemprop='url' title='Google 参加 CVPR 2018 大会'>
Google 参加 CVPR 2018 大会
</a>
</h2>
<div class='post-header'>
<div class='published'>
<span class='publishdate' itemprop='datePublished'>
2018年7月18日星期三
</span>
</div>
</div>
<div class='post-body'>
<div class='post-content' itemprop='articleBody'>
<script type='text/template'>
                          &#65279;<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><style>code { background-color: transparent }</style>
                          发布人&#65306;Google AI Communications 主编 Christian Howard<br>
<br>
本周&#65292;盐湖城将举办 <a href="http://cvpr2018.thecvf.com/">2018 年计算机视觉与模式识别大会</a> (CVPR 2018)&#65292;这是计算机视觉领域最重要的年度会议&#65292;由主要会议和同场举行的若干<a href="http://cvpr2018.thecvf.com/program/workshops">研讨会</a>及<a href="http://cvpr2018.thecvf.com/program/tutorials">教程</a>组成&#12290;作为计算机视觉研究领域的领导者和钻石赞助商&#65292;Google 将在 CVPR 2018 大会上强势亮相 - 超过 200 名 Google 员工将在大会上展示论文或应邀发表演讲&#65292;同时还将组织和参与多场研讨会&#12290;<br>
<br>
如果您将参加本年度的 CVPR 大会&#65292;欢迎来我们的展台与研究员进行交流&#65292;他们正在积极探索下一代智能系统&#65292;这些智能系统利用应用于各种<a href="https://ai.google/research/pubs?area=MachinePerception">机器感知</a>领域的最新机器学习技术&#12290;我们的研究员还将谈论并演示近期的一些成果&#65292;包括 <a href="https://ai.googleblog.com/2017/10/portrait-mode-on-pixel-2-and-pixel-2-xl.html">Pixel 2 和 Pixel 2 XL 智能手机人像模式</a>背后的技术&#12289;<a href="https://ai.googleblog.com/2018/04/announcing-open-images-v4-and-eccv-2018.html">Open Images V4 数据集</a>&#65292;等等&#12290;<br>
<br>
您可以查看下面的列表&#65292;详细了解我们在 CVPR 2018 大会上展示的研究成果&#65288;Google 员工姓名以<span style="background-color: white;"><span style="color: #3d85c6;">蓝色</span></span>突出显示&#65289;&#12290;<br>
<br>
<b><u>组织者 </u></b><br>
财务主席&#65306;<span style="color: #3d85c6;"><i>Ramin Zabih</i></span><br>
<br>
领域主席&#65306;<span style="color: #3d85c6;"><i>Sameer Agarwal</i></span><i>&#12289;<span style="color: #3d85c6;">Aseem Agrawala</span>&#12289;<span style="color: #3d85c6;">Jon Barron</span>&#12289;<span style="color: #3d85c6;">Abhinav Shrivastava</span>&#12289;<span style="color: #3d85c6;">Carl Vondrick</span> 和 <span style="color: #3d85c6;">Ming-Hsuan Yang</span></i><br>
<br>
<b><u>口述/精简介绍</u></b><br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Zhang_Unsupervised_Discovery_of_CVPR_2018_paper.pdf">Unsupervised Discovery of Object Landmarks as Structural Representations </a><br>
<i>Yuting Zhang&#12289;Yijie Guo&#12289;Yixin Jin&#12289;Yijun Luo&#12289;Zhiyuan He 和 <span style="color: #3d85c6;">Honglak Lee</span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Yu_DoubleFusion_Real-Time_Capture_CVPR_2018_paper.pdf">DoubleFusion:Real-time Capture of Human Performances with Inner Body Shapes from a Single Depth Sensor </a><br>
<i>Tao Yu&#12289;Zerong Zheng&#12289;<span style="color: #3d85c6;">Kaiwen Guo</span>&#12289;Jianhui Zhao&#12289;Qionghai Dai&#12289;Hao Li&#12289;Gerard Pons-Moll 和 Yebin Liu </i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Villegas_Neural_Kinematic_Networks_CVPR_2018_paper.pdf">Neural Kinematic Networks for Unsupervised Motion Retargetting </a><br>
<i>Ruben Villegas&#12289;Jimei Yang&#12289;Duygu Ceylan 和 <span style="color: #3d85c6;">Honglak Lee </span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Mildenhall_Burst_Denoising_With_CVPR_2018_paper.pdf">Burst Denoising with Kernel Prediction Networks</a><br>
<i>Ben Mildenhall&#12289;<span style="color: #3d85c6;">Jiawen Chen</span>&#12289;<span style="color: #3d85c6;">Jonathan Barron</span>&#12289;<span style="color: #3d85c6;">Robert Carroll</span>&#12289;<span style="color: #3d85c6;">Dillon Sharlet</span> 和 Ren Ng</i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Jacob_Quantization_and_Training_CVPR_2018_paper.pdf">Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference </a><span style="color: #3d85c6;"><i>Benoit Jacob<span style="color: black;">&#12289;</span>Skirmantas Kligys<span style="color: black;">&#12289;</span>Bo Chen<span style="color: black;">&#12289;</span>Matthew Tang<span style="color: black;">&#12289;</span>Menglong Zhu<span style="color: black;">&#12289;</span>Andrew Howard<span style="color: black;">&#12289;</span>Dmitry Kalenichenko<span style="color: black;"> 和 </span>Hartwig Adam</i></span><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Gu_AVA_A_Video_CVPR_2018_paper.pdf">AVA:A Video Dataset of Spatio-temporally Localized Atomic Visual Actions </a><br>
<i><span style="color: #3d85c6;">Chunhui Gu<span style="color: black;">&#12289;</span>Chen Sun<span style="color: black;">&#12289;</span>David Ross<span style="color: black;">&#12289;</span>Carl Vondrick<span style="color: black;">&#12289;</span>Caroline Pantofaru<span style="color: black;">&#12289;</span>Yeqing Li<span style="color: black;">&#12289;</span>Sudheendra Vijayanarasimhan<span style="color: black;">&#12289;</span>George Toderici<span style="color: black;">&#12289;</span>Susanna Ricco<span style="color: black;">&#12289;</span>Rahul Sukthankar<span style="color: black;">&#12289;</span>Cordelia Schmid</span> 和 Jitendra Malik </i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Liang_Focal_Visual-Text_Attention_CVPR_2018_paper.pdf">Focal Visual-Text Attention for Visual Question Answering </a><br>
<i>Junwei Liang&#12289;<span style="color: #3d85c6;">Lu Jiang</span>&#12289;Liangliang Cao&#12289;<span style="color: #3d85c6;">Li-Jia Li</span> 和 Alexander G. Hauptmann</i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Baradad_Inferring_Light_Fields_CVPR_2018_paper.pdf">Inferring Light Fields from Shadows </a><br>
<i>Manel Baradad&#12289;Vickie Ye&#12289;Adam Yedida&#12289;Fredo Durand&#12289;<span style="color: #3d85c6;">William Freeman</span>&#12289;Gregory Wornell 和 Antonio Torralba </i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Tlusty_Modifying_Non-Local_Variations_CVPR_2018_paper.pdf">Modifying Non-Local Variations Across Multiple Views </a><br>
<i>Tal Tlusty&#12289;Tomer Michaeli&#12289;<span style="color: #3d85c6;">Tali Dekel</span> 和 Lihi Zelnik-Manor</i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Chen_Iterative_Visual_Reasoning_CVPR_2018_paper.pdf">Iterative Visual Reasoning Beyond Convolutions </a><br>
<i>Xinlei Chen&#12289;<span style="color: #3d85c6;">Li-jia Li<span style="color: black;">&#12289;</span>Fei-Fei Li<span style="color: black;"> 和 </span>Abhinav Gupta </span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Genova_Unsupervised_Training_for_CVPR_2018_paper.pdf">Unsupervised Training for 3D Morphable Model Regression</a><br>
<i>Kyle Genova&#12289;<span style="color: #3d85c6;">Forrester Cole<span style="color: black;">&#12289;</span>Aaron Maschinot<span style="color: black;">&#12289;</span>Daniel Vlasic<span style="color: black;">&#12289;</span>Aaron Sarna<span style="color: black;"> 和 </span>William Freeman</span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Zoph_Learning_Transferable_Architectures_CVPR_2018_paper.pdf">Learning Transferable Architectures for Scalable Image Recognition</a><br>
<span style="color: #3d85c6;"><i>Barret Zoph<span style="color: black;">&#12289;</span>Vijay Vasudevan<span style="color: black;">&#12289;</span>Jonathon Shlens<span style="color: black;"> 和 </span>Quoc Le </i></span><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Van_Horn_The_INaturalist_Species_CVPR_2018_paper.pdf">The iNaturalist Species Classification and Detection Dataset </a><br>
<i>Grant van Horn&#12289;Oisin Mac Aodha&#12289;<span style="color: #3d85c6;">Yang Song</span>&#12289;Yin Cui&#12289;<span style="color: #3d85c6;">Chen Sun</span>&#12289;Alex Shepard&#12289;<span style="color: #3d85c6;">Hartwig Adam</span>&#12289;Pietro Perona 和 Serge Belongie </i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Li_Learning_Intrinsic_Image_CVPR_2018_paper.pdf">Learning Intrinsic Image Decomposition from Watching the World </a><br>
<i>Zhengqi Li 和 <span style="color: #3d85c6;">Noah Snavely </span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Konyushkova_Learning_Intelligent_Dialogs_CVPR_2018_paper.pdf">Learning Intelligent Dialogs for Bounding Box Annotation </a><br>
<i>Ksenia Konyushkova&#12289;<span style="color: #3d85c6;">Jasper Uijlings</span>&#12289;Christoph Lampert 和 <span style="color: #3d85c6;">Vittorio Ferrari </span></i><br>
<br>
<b><u>海报展示</u></b><br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Uijlings_Revisiting_Knowledge_Transfer_CVPR_2018_paper.pdf">Revisiting Knowledge Transfer for Training Object Class Detectors </a><br>
<i><span style="color: #3d85c6;">Jasper Uijlings</span>&#12289;<span style="color: #3d85c6;">Stefan Popov 和</span> <span style="color: #3d85c6;">Vittorio Ferrari </span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Chao_Rethinking_the_Faster_CVPR_2018_paper.pdf">Rethinking the Faster R-CNN Architecture for Temporal Action Localization </a><br>
<i>Yu-Wei Chao&#12289;<span style="color: #3d85c6;">Sudheendra Vijayanarasimhan<span style="color: black;">&#12289;</span>Bryan Seybold<span style="color: black;">&#12289;</span>David Ross</span>&#12289;Jia Deng 和 <span style="color: #3d85c6;">Rahul Sukthankar </span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Lee_Hierarchical_Novelty_Detection_CVPR_2018_paper.pdf">Hierarchical Novelty Detection for Visual Object Recognition </a><br>
<i>Kibok Lee&#12289;Kimin Lee&#12289;Kyle Min&#12289;Yuting Zhang&#12289;Jinwoo Shin 和 <span style="color: #3d85c6;">Honglak Lee </span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Caesar_COCO-Stuff_Thing_and_CVPR_2018_paper.pdf">COCO-Stuff:Thing and Stuff Classes in Context </a><br>
<i>Holger Caesar&#12289;<span style="color: #3d85c6;">Jasper Uijlings<span style="color: black;"> 和 </span>Vittorio Ferrari </span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Wang_Appearance-and-Relation_Networks_for_CVPR_2018_paper.pdf">Appearance-and-Relation Networks for Video Classification </a><br>
<i>Limin Wang&#12289;<span style="color: #3d85c6;">Wei Li</span>&#12289;Wen Li 和 Luc Van Gool </i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Gordon_MorphNet_Fast__CVPR_2018_paper.pdf">MorphNet:Fast &amp; Simple Resource-Constrained Structure Learning of Deep Networks</a><br>
<i><span style="color: #3d85c6;">Ariel Gordon<span style="color: black;">&#12289;</span>Elad Eban<span style="color: black;">&#12289;</span>Bo Chen<span style="color: black;">&#12289;</span>Ofir Nachum<span style="color: black;">&#12289;</span>Tien-Ju Yang</span> 和 Edward Choi </i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Litany_Deformable_Shape_Completion_CVPR_2018_paper.pdf">Deformable Shape Completion with Graph Convolutional Autoencoders</a><br>
<i>Or Litany&#12289;Alex Bronstein&#12289;Michael Bronstein 和 <span style="color: #3d85c6;">Ameesh Makadia </span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Li_MegaDepth_Learning_Single-View_CVPR_2018_paper.pdf">MegaDepth:Learning Single-View Depth Prediction from Internet Photos </a><br>
<i>Zhengqi Li 和 <span style="color: #3d85c6;">Noah Snavely </span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Zhang_Unsupervised_Discovery_of_CVPR_2018_paper.pdf">Unsupervised Discovery of Object Landmarks as Structural Representations </a><br>
<i>Yuting Zhang&#12289;Yijie Guo&#12289;Yixin Jin&#12289;Yijun Luo&#12289;Zhiyuan He 和 <span style="color: #3d85c6;">Honglak Lee </span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Mildenhall_Burst_Denoising_With_CVPR_2018_paper.pdf">Burst Denoising with Kernel Prediction Networks</a><br>
<i>Ben Mildenhall&#12289;<span style="color: #3d85c6;">Jiawen Chen<span style="color: black;">&#12289;</span>Jonathan Barron<span style="color: black;">&#12289;</span>Robert Carroll<span style="color: black;">&#12289;</span>Dillon Sharlet</span> 和 Ren Ng </i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Jacob_Quantization_and_Training_CVPR_2018_paper.pdf">Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference </a><i>Benoit Jacob&#12289;Skirmantas Kligys&#12289;Bo Chen&#12289;<span style="color: #3d85c6;">Matthew Tang</span>&#12289;<span style="color: #3d85c6;">Menglong Zhu</span>&#12289;<span style="color: #3d85c6;">Andrew Howard</span>&#12289;<span style="color: #3d85c6;">Dmitry Kalenichenko</span> 和 <span style="color: #3d85c6;">Hartwig Adam</span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Sun_Pix3D_Dataset_and_CVPR_2018_paper.pdf">Pix3D:Dataset and Methods for Single-Image 3D Shape Modeling</a><br>
<i>Xingyuan Sun&#12289;Jiajun Wu&#12289;Xiuming Zhang&#12289;Zhoutong Zhang&#12289;<span style="color: #3d85c6;">Tianfan Xue</span>&#12289;Joshua Tenenbaum 和 <span style="color: #3d85c6;">William Freeman</span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Dekel_Sparse_Smart_Contours_CVPR_2018_paper.pdf">Sparse, Smart Contours to Represent and Edit Images </a><br>
<i><span style="color: #3d85c6;">Tali Dekel<span style="color: black;">&#12289;</span>Dilip Krishnan</span>&#12289;Chuang Gan&#12289;<span style="color: #3d85c6;">Ce Liu<span style="color: black;"> 和 </span>William Freeman</span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Chen_MaskLab_Instance_Segmentation_CVPR_2018_paper.pdf">MaskLab:Instance Segmentation by Refining Object Detection with Semantic and Direction Features </a><br>
<i><span style="color: #3d85c6;">Liang-Chieh Chen</span>&#12289;Alexander Hermans&#12289;<span style="color: #3d85c6;">George Papandreou<span style="color: black;">&#12289;</span>Florian Schroff</span>&#12289;Peng Wang 和 <span style="color: #3d85c6;">Hartwig Adam </span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Cui_Large_Scale_Fine-Grained_CVPR_2018_paper.pdf">Large Scale Fine-Grained Categorization and Domain-Specific Transfer Learning </a><br>
<i>Yin Cui&#12289;<span style="color: #3d85c6;">Yang Song<span style="color: black;">&#12289;</span>Chen Sun<span style="color: black;">&#12289;</span>Andrew Howard<span style="color: black;"> 和 </span>Serge Belongie </span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Johnston_Improved_Lossy_Image_CVPR_2018_paper.pdf">Improved Lossy Image Compression with Priming and Spatially Adaptive Bit Rates for Recurrent Networks </a><br>
<span style="color: #3d85c6;"><i>Nick Johnston<span style="color: black;">&#12289;</span>Damien Vincent<span style="color: black;">&#12289;</span>David Minnen<span style="color: black;">&#12289;</span>Michele Covell<span style="color: black;">&#12289;</span>Saurabh Singh<span style="color: black;">&#12289;</span>Sung Jin Hwang&#12289;George Toderici<span style="color: black;">&#12289;</span>Troy Chinen<span style="color: black;"> 和 </span>Joel Shor </i></span><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Sandler_MobileNetV2_Inverted_Residuals_CVPR_2018_paper.pdf">MobileNetV2:Inverted Residuals and Linear Bottlenecks</a><br>
<span style="color: #3d85c6;"><i>Mark Sandler<span style="color: black;">&#12289;</span>Andrew Howard<span style="color: black;">&#12289;</span>Menglong Zhu<span style="color: black;">&#12289;</span>Andrey Zhmoginov<span style="color: black;"> 和 </span>Liang-Chieh Chen </i></span><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Dai_ScanComplete_Large-Scale_Scene_CVPR_2018_paper.pdf">ScanComplete:Large-Scale Scene Completion and Semantic Segmentation for 3D Scans</a><br>
<i>Angela Dai&#12289;Daniel Ritchie&#12289;<span style="color: #3d85c6;">Martin Bokeloh<span style="color: black;">&#12289;</span>Scott Reed<span style="color: black;">&#12289;</span>Juergen Sturm</span> 和 Matthias Nie<span style="font-family: &quot;arial&quot;; font-size: 11pt; white-space: pre-wrap;">ß</span>ner</i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Sadeghi_Sim2Real_Viewpoint_Invariant_CVPR_2018_paper.pdf">Sim2Real View Invariant Visual Servoing by Recurrent Control </a><br>
<i><span style="color: #3d85c6;">Fereshteh Sadeghi</span>&#12289;<span style="color: #3d85c6;">Alexander Toshev</span>&#12289;<span style="color: #3d85c6;">Eric Jang</span> 和 <span style="color: #3d85c6;">Sergey Levine</span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Paul_Alternating-Stereo_VINS_Observability_CVPR_2018_paper.pdf">Alternating-Stereo VINS:Observability Analysis and Performance Evaluation </a><br>
<span style="color: #3d85c6;"><i>Mrinal Kanti Paul<span style="color: black;"> 和 </span>Stergios Roumeliotis </i></span><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Rematas_Soccer_on_Your_CVPR_2018_paper.pdf">Soccer on Your Tabletop </a><br>
<i>Konstantinos Rematas&#12289;Ira Kemelmacher&#12289;Brian Curless 和 <span style="color: #3d85c6;">Steve Seitz </span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Mahjourian_Unsupervised_Learning_of_CVPR_2018_paper.pdf">Unsupervised Learning of Depth and Ego-Motion from Monocular Video Using 3D Geometric Constraints </a><br>
<i><span style="color: #3d85c6;">Reza Mahjourian</span>&#12289;<span style="color: #3d85c6;">Martin Wicke<span style="color: black;"> 和 </span>Anelia Angelova </span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Gu_AVA_A_Video_CVPR_2018_paper.pdf">AVA:A Video Dataset of Spatio-temporally Localized Atomic Visual Actions </a><br>
<i><span style="color: #3d85c6;">Chunhui Gu<span style="color: black;">&#12289;</span>Chen Sun<span style="color: black;">&#12289;</span>David Ross<span style="color: black;">&#12289;</span>Carl Vondrick<span style="color: black;">&#12289;</span>Caroline Pantofaru<span style="color: black;">&#12289;</span>Yeqing Li<span style="color: black;">&#12289;</span>Sudheendra Vijayanarasimhan</span>&#12289;<span style="color: #3d85c6;">George Toderici</span>&#12289;<span style="color: #3d85c6;">Susanna Ricco</span>&#12289;<span style="color: #3d85c6;">Rahul Sukthankar</span>&#12289;<span style="color: #3d85c6;">Cordelia Schmid</span> 和 <span style="color: #3d85c6;">Jitendra Malik</span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Baradad_Inferring_Light_Fields_CVPR_2018_paper.pdf">Inferring Light Fields from Shadows </a><br>
<i>Manel Baradad&#12289;Vickie Ye&#12289;Adam Yedida&#12289;Fredo Durand&#12289;<span style="color: #3d85c6;">William Freeman</span>&#12289;Gregory Wornell 和 Antonio Torralba </i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Tlusty_Modifying_Non-Local_Variations_CVPR_2018_paper.pdf">Modifying Non-Local Variations Across Multiple Views </a><br>
<i>Tal Tlusty&#12289;Tomer Michaeli&#12289;<span style="color: #3d85c6;">Tali Dekel</span> 和 Lihi Zelnik-Manor </i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Srinivasan_Aperture_Supervision_for_CVPR_2018_paper.pdf">Aperture Supervision for Monocular Depth Estimation </a><br>
<i>Pratul Srinivasan&#12289;<span style="color: #3d85c6;">Rahul Garg</span>&#12289;<span style="color: #3d85c6;">Neal Wadhwa</span>&#12289;Ren Ng 和 <span style="color: #3d85c6;">Jonathan Barron</span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Li_Instance_Embedding_Transfer_CVPR_2018_paper.pdf">Instance Embedding Transfer to Unsupervised Video Object Segmentation</a><br>
<i>Siyang Li&#12289;<span style="color: #3d85c6;">Bryan Seybold<span style="color: black;">&#12289;</span>Alexey Vorobyov<span style="color: black;">&#12289;</span>Alireza Fathi</span>&#12289;Qin Huang 和 C.-C. Jay Kuo </i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Sajjadi_Frame-Recurrent_Video_Super-Resolution_CVPR_2018_paper.pdf">Frame-Recurrent Video Super-Resolution </a><br>
<i>Mehdi S. M. Sajjadi&#12289;<span style="color: #3d85c6;">Raviteja Vemulapalli<span style="color: black;"> 和 </span>Matthew Brown</span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Nguyen_Weakly_Supervised_Action_CVPR_2018_paper.pdf">Weakly Supervised Action Localization by Sparse Temporal Pooling Network </a><br>
<i>Phuc Nguyen&#12289;<span style="color: #3d85c6;">Ting Liu<span style="color: black;">&#12289;</span>Gautam Prasad<span style="color: black;"> 和 </span></span>Bohyung Han </i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Chen_Iterative_Visual_Reasoning_CVPR_2018_paper.pdf">Iterative Visual Reasoning Beyond Convolutions </a><br>
<i>Xinlei Chen&#12289;<span style="color: #3d85c6;">Li-jia Li<span style="color: black;">&#12289;</span>Fei-Fei Li</span> 和 Abhinav Gupta </i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Wei_Learning_and_Using_CVPR_2018_paper.pdf">Learning and Using the Arrow of Time </a><br>
<i>Donglai Wei&#12289;Andrew Zisserman&#12289;<span style="color: #3d85c6;">William Freeman</span> 和 Joseph Lim </i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Mullapudi_HydraNets_Specialized_Dynamic_CVPR_2018_paper.pdf">HydraNets:Specialized Dynamic Architectures for Efficient Inference </a><br>
<i>Ravi Teja Mullapudi&#12289;<span style="color: #3d85c6;">Noam Shazeer<span style="color: black;">&#12289;</span>William Mark</span> 和 Kayvon Fatahalian </i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Li_Thoracic_Disease_Identification_CVPR_2018_paper.pdf">Thoracic Disease Identification and Localization with Limited Supervision </a><br>
<i>Zhe Li&#12289;<span style="color: #3d85c6;">Chong Wang<span style="color: black;">&#12289;</span>Mei Han<span style="color: black;">&#12289;</span>Yuan Xue<span style="color: black;">&#12289;</span>Wei Wei<span style="color: black;">&#12289;</span>Li-jia Li<span style="color: black;"> 和 </span>Fei-Fei Li </span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Hong_Inferring_Semantic_Layout_CVPR_2018_paper.pdf">Inferring Semantic Layout for Hierarchical Text-to-Image Synthesis </a><br>
<i>Seunghoon Hong&#12289;Dingdong Yang&#12289;Jongwook Choi 与 <span style="color: #3d85c6;">Honglak Lee</span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Shen_Deep_Semantic_Face_CVPR_2018_paper.pdf">Deep Semantic Face Deblurring </a><br>
<i>Ziyi Shen&#12289;Wei-Sheng Lai&#12289;Tingfa Xu&#12289;Jan Kautz 与 <span style="color: #3d85c6;">Ming-Hsuan Yang</span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Genova_Unsupervised_Training_for_CVPR_2018_paper.pdf">Unsupervised Training for 3D Morphable Model Regression </a><br>
<i>Kyle Genova&#12289;<span style="color: #3d85c6;">Forrester Cole<span style="color: black;">&#12289;</span>Aaron Maschinot<span style="color: black;">&#12289;</span>Daniel Vlasic<span style="color: black;">&#12289;</span>Aaron Sarna<span style="color: black;"> 和 </span>William Freeman</span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Zoph_Learning_Transferable_Architectures_CVPR_2018_paper.pdf">Learning Transferable Architectures for Scalable Image Recognition </a><br>
<span style="color: #3d85c6;"><i>Barret Zoph<span style="color: black;">&#12289;</span>Vijay Vasudevan<span style="color: black;">&#12289;</span>Jonathon Shlens<span style="color: black;"> 和 </span>Quoc Le </i></span><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Li_Learning_Intrinsic_Image_CVPR_2018_paper.pdf">Learning Intrinsic Image Decomposition from Watching the World </a><br>
<i>Zhengqi Li 与 <span style="color: #3d85c6;">Noah Snavely</span></i><br>
<br>
<a href="http://openaccess.thecvf.com/content_cvpr_2018/papers/Liu_PiCANet_Learning_Pixel-Wise_CVPR_2018_paper.pdf">PiCANet:Learning Pixel-wise Contextual Attention for Saliency Detection </a><br>
<i>Nian Liu&#12289;Junwei Han 和 <span style="color: #3d85c6;">Ming-Hsuan Yang</span></i><br>
<br>
<b><u>教程 </u></b><br>
<a href="https://sites.google.com/corp/view/visionroboticsdriving">Computer Vision for Robotics and Driving </a><br>
<i><span style="color: #3d85c6;">Anelia Angelova</span> 和 Sanja Fidler </i><br>
<br>
<a href="https://sites.google.com/corp/view/unsupervisedvisuallearning/home">Unsupervised Visual Learning </a><br>
<span style="color: #3d85c6;"><i>Pierre Sermanet<span style="color: black;"> 和 </span>Anelia Angelova </i></span><br>
<br>
<a href="https://augmentedperception.github.io/cvpr18/">UltraFast 3D Sensing, Reconstruction and Understanding of People, Objects and Environments</a><br>
<span style="color: #3d85c6;"><i>Sean Fanello<span style="color: black;">&#12289;</span>Julien Valentin<span style="color: black;">&#12289;</span>Jonathan Taylor<span style="color: black;">&#12289;</span>Christoph Rhemann<span style="color: black;">&#12289;</span>Adarsh Kowdle<span style="color: black;">&#12289;</span>Jürgen Sturm<span style="color: black;">&#12289;</span>Christine Kaeser-Chen<span style="color: black;">&#12289;</span>Pavel Pidlypenskyi<span style="color: black;">&#12289;</span>Rohit Pandey<span style="color: black;">&#12289;</span>Andrea Tagliasacchi<span style="color: black;">&#12289;</span>Sameh Khamis<span style="color: black;">&#12289;</span>David Kim<span style="color: black;">&#12289;</span>Mingsong Dou<span style="color: black;">&#12289;</span>Kaiwen Guo<span style="color: black;">&#12289;</span>Danhang Tang<span style="color: black;"> 和 </span>Shahram Izadi</i></span><br>
<br>
<a href="https://sites.google.com/corp/view/cvpr2018tutorialongans/">Generative Adversarial Networks</a><br>
<i>Jun-Yan Zhu&#12289;Taesung Park&#12289;Mihaela Rosca&#12289;Phillip Isola 和 <span style="color: #3d85c6;">Ian Goodfellow</span></i> <span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person">
  <meta content="https://plus.google.com/116899029375914044550" itemprop="url">
</span>
                        <!--<meta name="original_url" content="http://ai.googleblog.com/2018/06/google-at-cvpr-2018.html"><meta name="original_title" content="Google AI Blog: Google at CVPR 2018"><meta name="original_blog" content="">-->
                        </script>
</div>
</div>
</div>
<div class='post' data-id='6031660959506661614' itemscope='' itemtype='http://schema.org/BlogPosting'>
<h2 class='title' itemprop='name'>
<a href='https://googledeveloperschina.blogspot.com/2018/07/android-studio-3-2-beta.html' itemprop='url' title='[Draft] Android 开发者博客：Android Studio 3.2 测试版'>
[Draft] Android 开发者博客&#65306;Android Studio 3.2 测试版
</a>
</h2>
<div class='post-header'>
<div class='published'>
<span class='publishdate' itemprop='datePublished'>
2018年7月18日星期三
</span>
</div>
</div>
<div class='post-body'>
<div class='post-content' itemprop='articleBody'>
<script type='text/template'>
                          &#65279;<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><style>code { background-color: transparent }</style>
                          <meta name="twitter:image" content="https://3.bp.blogspot.com/-UXJn2NlJS5M/WywnrxQc5oI/AAAAAAAAFh0/RvpeN3jHvCMOy2SOE3IFGTr_Q_lHiNC0wCLcBGAs/s1600/unnamed%2B%25288%2529image2.png">
<img src="https://3.bp.blogspot.com/-UXJn2NlJS5M/WywnrxQc5oI/AAAAAAAAFh0/RvpeN3jHvCMOy2SOE3IFGTr_Q_lHiNC0wCLcBGAs/s1600/unnamed%2B%25288%2529image2.png" style="display:none">

<em>发布人&#65306;Android 产品经理 <a href="https://www.google.com/+JamalEason">Jamal Eason</a></em>

<br/>

<a href="https://2.bp.blogspot.com/-lieVqC3AvxA/Wywnajrm7_I/AAAAAAAAFhs/xAsnax51askGLk1o0IiHHEpByD1yqYkaQCLcBGAs/s1600/pasted%2Bimage%2B0%2B%25287%2529image1.png" imageanchor="1"><img border="0" data-original-height="225" data-original-width="250" id="floatRight" src="https://2.bp.blogspot.com/-lieVqC3AvxA/Wywnajrm7_I/AAAAAAAAFhs/xAsnax51askGLk1o0IiHHEpByD1yqYkaQCLcBGAs/s1600/pasted%2Bimage%2B0%2B%25287%2529image1.png"></a><br/>

<br/>

即日起&#65292;您将可以<a href="https://developer.android.com/studio/preview/">下载</a> Android Studio 3.2 测试版&#12290;官方 Android IDE 最新版本已在 Google I/O 2018 大会期间预先亮相&#65292;其功能主要是帮助您了解 Google I/O 大会期间发布的所有新功能 - <a href="http://developer.android.com/jetpack">Android JetPack</a>&#12289;<a href="https://developer.android.com/preview/">Android P Developer Preview</a> 以及新增的 <a href="http://d.android.com/appbundle">Android App Bundle</a> 格式&#12290;Android Studio 3.2 中还新增了其他一些令人兴奋的功能来加速应用开发过程&#65292;例如模拟器快照和 Energy Profiler&#12290;
<br/>

<br/>

自版本 1.0 问世以来&#65292;Android Studio 已经走过三年半的时光&#65292;使用量逐步增长&#65292;而我们对质量的重视程度也有增无减&#12290;我们持续加大质量方面的投入&#65292;因为我们知道有数百万应用开发者几乎每天都在使用 Android Studio&#65292;他们需要一套可靠的工具&#12290;完成 Android Studio 3.2 后&#65292;稳定性&#12289;构建时间和其他质量工作将成为我们下个版本的主要关注点&#12290;我们也不想等&#65292;因此我们已经制订了核实步骤来解决<a href="https://twitter.com/androidstudio/status/1004800015481561088">内存泄漏</a>和性能问题&#65292;并修复了超过 450 个错误&#12290;感谢您一直以来的反馈&#65292;并请继续提供&#65292;以便我们在下一版 Android Studio 中可以专注于您最关心的领域&#12290;如果您想试用最新功能并评估质量改进&#65292;可以在测试版发布渠道<a href="https://developer.android.com/studio/preview/">下载</a> Android Studio&#12290; 
<br/>

<br/>

<strong><span style="text-decoration:underline;">Android Studio 3.2 的内部组件</span></strong>
<br/>

<br/>

测试版基于 Android Studio 3.2 <a href="https://android-developers.googleblog.com/2018/05/android-studio-3-2-canary.html">Canary 版本</a>而构建&#65292;包括以下组件&#65306;
<br/>
<ul>

<li><strong>Android App Bundle 支持</strong> - <a href="http://d.android.com/appbundle">Android App Bundle</a> 是一种使用 Google Play 动态交付的新发布格式&#65292;提供了一个只包含特定设备所需资源的更小的优化 APK&#12290;无需更改任何代码&#65292;导航至 <strong>Build </strong>&#8594; <strong>Build Bundle / APK</strong> 或 <strong>Build</strong> &#8594; <strong>Generate Signed Bundle / APK 即可利用 Android App Bundle 的应用大小节省功能&#12290;</strong>  </li></ul>

<br/>

<a href="https://3.bp.blogspot.com/-UXJn2NlJS5M/WywnrxQc5oI/AAAAAAAAFh0/RvpeN3jHvCMOy2SOE3IFGTr_Q_lHiNC0wCLcBGAs/s1600/unnamed%2B%25288%2529image2.png" imageanchor="1"><img border="0" data-original-height="648" data-original-width="854" id="imgFull" src="https://3.bp.blogspot.com/-UXJn2NlJS5M/WywnrxQc5oI/AAAAAAAAFh0/RvpeN3jHvCMOy2SOE3IFGTr_Q_lHiNC0wCLcBGAs/s1600/unnamed%2B%25288%2529image2.png"></a><br/>

<p id="imgCaption">
<em>构建 Android App Bundle</em>
<br/>
<ul>

<li><strong>模拟器快照 - </strong>使用 Android Studio 3.2&#65292;您可以在任何模拟器状态下创建快照&#65292;然后在 2 秒内启动快照&#12290;您可以使用所需的应用&#12289;数据和设置预先配置 Android Virtual Device (AVD) 快照&#65292;然后反复回到相同的快照&#12290;<a href="https://developer.android.com/studio/preview/features/#emulator_improvements">了解详情</a>&#12290; </li></ul>

<br/>

<a href="https://3.bp.blogspot.com/-wAjOv0sDIWg/Wywn7hoqxuI/AAAAAAAAFh4/Y0IcoaE_AhYNeNsO4OPHz9QaKmYhVs3ywCLcBGAs/s1600/unnamedimage3.gif" imageanchor="1"><img border="0" data-original-height="284" data-original-width="512" id="imgFull" src="https://3.bp.blogspot.com/-wAjOv0sDIWg/Wywn7hoqxuI/AAAAAAAAFh4/Y0IcoaE_AhYNeNsO4OPHz9QaKmYhVs3ywCLcBGAs/s1600/unnamedimage3.gif"></a><br/>

<p id="imgCaption">
<em>Android Emulator 快照</em>
<br/>
<ul>

<li><strong>Energy Profiler </strong>- 性能分析器套件中新增的 <a href="https://developer.android.com/studio/profile/energy-profiler.html">Energy Profiler</a> 可帮助您了解应用对 Android 设备的能耗影响&#12290;您现在可以查看系统组件预估能耗情况&#65292;并检查可能消耗电池电量的后台事件&#12290;  </li></ul>

<br/>

<a href="https://2.bp.blogspot.com/-FmzRIqmlRXA/WywoLoih5PI/AAAAAAAAFiA/OUnBYHVWHAgkkOBwTD2qIGYrD8TMbW77ACLcBGAs/s1600/energy_profilerimage4.gif" imageanchor="1"><img border="0" data-original-height="744" data-original-width="1270" id="imgFull" src="https://2.bp.blogspot.com/-FmzRIqmlRXA/WywoLoih5PI/AAAAAAAAFiA/OUnBYHVWHAgkkOBwTD2qIGYrD8TMbW77ACLcBGAs/s1600/energy_profilerimage4.gif"></a><br/>

<p id="imgCaption">
<em>Energy Profiler</em>
<br/>

<br/>

查看下文以及 <a href="https://android-developers.googleblog.com/2018/05/android-studio-3-2-canary.html">Canary 博客</a>中按开发流程列出的所有主要功能的完整展示&#65306;
<br/>

<br/>


<br/>
<table><tbody><tr>    <td rowspan="10"><strong>开发</strong>
<br/>
<br/>
<ul>

<li>导航编辑器
</li><li>AndroidX 重构
</li><li>示例数据
</li><li>Material Design 更新
</li><li>Android Slices
</li><li>CMakeList 编辑
</li><li>新增功能助手  
</li><li>新增的 Lint 检查功能 
</li><li>Intellij 平台更新</li></ul>

<br/>

<strong>构建</strong>
<br/>
<ul>

<li>Android App Bundle
</li><li>D8 脱糖
</li><li>R8 优化器</li></ul>
</td>
<td rowspan="10">

<strong>测试 </strong> <ul>

<li>Android Emulator 快照
</li><li>Android Emulator 中的录屏功能 
</li><li>虚拟场景 Android Emulator 相机
</li><li>ADB 连接助手 </li></ul>

<br/>

<strong>优化</strong>
<br/>
<ul>

<li>Energy Profiler
</li><li>系统跟踪 
</li><li>分析器会话
</li><li>CPU 自动记录
</li><li>JNI 引用跟踪 </li></ul>
</td>   </tr></tbody></table> 
<br/>

<strong><span style="text-decoration:underline;">Google I/O 2018 大会上的专题讲座</span></strong>
<br/>

<br/>

在 Google I/O 2018 大会期间&#65292;Android Studio 团队在发布 Android Studio 3.2 的同时&#65292;还举办了一系列关于 Android Studio 的专题讲座&#12290;观看以下视频了解最新功能的实际使用情况并获取 Android Studio 的使用技巧和诀窍&#65306;
<br/>
<ul>

<li><a href="https://youtu.be/WxAZk7A7OkM">Android 开发工具中的新增功能</a>
<br/>


    概述了 Android Studio 中最近面向 Android 应用开发者新增的所有功能&#12290;在这个专题讲座中&#65292;围绕最新 Android API 上可以加快开发者工作流速度的相关功能进行了演示和精彩的演讲&#12290;
<br/>


</li><li><a href="https://youtu.be/N5xONyp69eU">Android 构建系统的新增功能</a>
<br/>


    带您深入了解 Android 构建系统的新功能&#12290;
<br/>


</li><li><a href="https://youtu.be/ytZteMo4ETk">ConstraintLayout 和 Android Studio 设计工具的新增功能</a>
<br/>


    此专题讲座介绍了 ConstraintLayout 2.0 中的新功能以及 Android Studio 设计工具中最新增加的功能&#65292;重点介绍了如何有效利用这些功能来设计&#12289;制作原型和构建图形界面应用&#12290;
<br/>


</li><li><a href="https://youtu.be/O5V9ZSL0BsM">使用 Android Studio 分析器提高应用性能</a>
<br/>


    本演讲展示了如何使用 Android Studio 分析器诊断和排查与应用有关的性能问题&#12290;结合实例演示了如何使用 CPU&#12289;内存&#12289;网络分析器并重点介绍了新增功能&#12290;
<br/>


</li><li><a href="https://youtu.be/gGOOkk2y_Ss">在 Android Studio 中使用编译器的最佳实践</a>
<br/>


    此专题讲座深入讨论了 Android 中使用的各种编译器的情况&#65306;Java 8 语言功能脱糖&#12289;新增的 dexer (D8) 和 shrinker (R8)&#65292;以及在用于 Android 的 Kotlin 编译器上完成的工作&#12290;
<br/>


</li><li><a href="https://youtu.be/8GCXtCjtg40">Android Jetpack&#65306;使用导航控制器管理界面导航</a>
<br/>


    此专题讲座讨论了如何在 Android Studio&#12289;XML 或 Java API 中使用导航编辑器来定义导航图&#65292;以及此功能如何简化应用导航和深层链接处理&#12290;
<br/>
</li></ul>

<br/>

<strong><span style="text-decoration:underline;">下载和反馈</span></strong>
<br/>

<br/>

从测试版发布渠道<a href="https://developer.android.com/studio/preview/">下载页面</a>下载最新版本的 Android Studio 3.2&#12290;如果您使用的是旧版 Android Studio&#65292;请确保更新至 Android Studio 测试版 1 或更高版本&#12290;如果您还想保留稳定版本的 Android Studio&#65292;则可以同时运行 Android Studio 稳定版和测试版&#12290;<a href="https://developer.android.com/studio/preview/install-preview">了解详情</a>&#12290;
<br/>

<br/>

要使用上述 Android Emulator 功能&#65292;请确保您至少运行通过 Android Studio SDK 管理器下载的 Android Emulator v27.3 及更高版本&#12290;
<br/>

<br/>

请注意&#65292;为确保我们保持产品质量&#65292;您在 Canary 发布渠道中看到的部分功能&#65288;如导航编辑器&#65289;默认并未启用&#12290;要启用 Canary 发布渠道中的功能&#65292;请转到 <strong>File &#8594; Settings &#8594; Experimental &#8594; Editor &#8594; Enable Navigation Editor</strong>&#12290;
<br/>

<br/>

如果您发现错误或问题&#65292;欢迎随时向我们<a href="https://source.android.com/source/report-bugs#developer-tools">提交问题</a>&#12290;在我们的 <a href="https://plus.google.com/103342515830390186255">Google+</a> 信息页或 <a href="http://www.twitter.com/androidstudio">Twitter</a> 上与我们&#65288;Android Studio 开发团队&#65289;联系&#12290;
<br/>

                        <!--<meta name="original_url" content="https://android-developers.googleblog.com/2018/06/android-studio-3-2-beta.html"><meta name="original_title" content="Android Developers Blog:  Android Studio 3.2 Beta"><meta name="original_blog" content="Android Developers Blog">-->
                        </script>
</div>
</div>
</div>
<div class='post' data-id='5976587371021820124' itemscope='' itemtype='http://schema.org/BlogPosting'>
<h2 class='title' itemprop='name'>
<a href='https://googledeveloperschina.blogspot.com/2018/07/how-can-neural-network-similarity-help.html' itemprop='url' title='神经网络相似性如何帮助我们理解训练和泛化？'>
神经网络相似性如何帮助我们理解训练和泛化&#65311;
</a>
</h2>
<div class='post-header'>
<div class='published'>
<span class='publishdate' itemprop='datePublished'>
2018年7月18日星期三
</span>
</div>
</div>
<div class='post-body'>
<div class='post-content' itemprop='articleBody'>
<script type='text/template'>
                          <style>code { background-color: transparent }</style>
                          <span class="byline-author">发布人&#65306;Google Brain 团队 Maithra Raghu 和 DeepMind 团队 Ari S. Morcos<br />
</span> <br />
为了完成任务&#65292;深度神经网络 (DNN) 将输入数据逐步转换为复杂表征序列&#65288;即&#65292;各个神经元之间的激活模式&#65289;&#12290;理解这些表征不仅对可解释性至关重要&#65292;而且还有助于我们更智能地设计机器学习系统&#12290;不过&#65292;目前已证明理解这些表征相当困难&#65292;特别是在跨网络比较表征时&#12290;在<a href="https://ai.googleblog.com/2017/11/interpreting-deep-neural-networks-with.html">上一篇博文</a>中&#65292;我们概述了利用<a href="https://arxiv.org/abs/1706.05806">典型相关分析</a> (CCA) 理解和比较<a href="https://en.wikipedia.org/wiki/Convolutional_neural_network">卷积神经网络</a> (CNN) 表征的优势&#65292;表明它们按自下而上的模式收敛&#65292;在训练过程中&#65292;早期层先于后期层收敛到最终表征&#12290;<br />
<br />
在&#8220;<a href="https://arxiv.org/abs/1806.05759">Insights on Representational Similarity in Neural Networks with Canonical Correlation</a>&#8221;一文中&#65292;我们进一步推进此项研究&#65292;对 CNN 的表征相似性形成新的认识&#65292;包括记忆网络&#65288;例如&#65292;只能对之前看过的图像进行分类的网络&#65289;与泛化网络&#65288;例如&#65292;能够将之前未看过的图像正确分类的网络&#65289;之间的差异&#12290;重要的是&#65292;我们还对这一方法进行了扩展&#65292;以深入了解<a href="https://en.wikipedia.org/wiki/Recurrent_neural_network">递归神经网络</a> (RNN) 的动态&#65292;这类模型对序列数据&#65288;如语言&#65289;特别有用&#12290;比较 RNN 在许多方面与 CNN 一样困难&#65292;但是 RNN 带来了额外的挑战&#65292;即它们的表征在序列化过程中会发生变化&#12290;这样一来&#65292;CCA 凭借其不变性这一优势&#65292;成了研究 RNN 和 CNN 的理想工具&#12290;因此&#65292;我们额外开源了<a href="https://github.com/google/svcca/">用于在神经网络上应用 CCA 的代码</a>&#65292;希望帮助研究社区更好地理解网络动态&#12290;<br />
<br />
<b>记忆与泛化 CNN 的表征相似性</b><br />
最后&#65292;只有当机器学习系统能够泛化到之前未看到过的新情景时&#65292;它才是有用的&#12290;因此&#65292;了解泛化网络和非泛化网络的区分因素非常重要&#65292;并可能引出提高泛化性能的新方法&#12290;为了考察表征相似性是否可以预测泛化&#65292;我们研究了两种类型的 CNN&#65306;<br />
<ul>
<li><i>泛化网络</i>&#65306;此类 CNN 使用含有未修改的准确标签的数据进行训练&#65292;并学习泛化到新数据的解&#12290;</li>
<li><i>记忆网络</i>&#65306;此类 CNN 使用具有随机标签的数据集进行训练&#65292;因此&#65292;它们必须记住训练数据&#65292;而不能根据定义进行泛化&#65288;如 <a href="https://arxiv.org/abs/1611.03530">Zhang et al., 2017</a> 中所述&#65289;&#12290;</li>
</ul>
我们为每个网络训练了多个实例&#65288;只是网络权重的初始随机值和训练数据的顺序不同&#65289;&#65292;并使用新的加权方法来计算 CCA 距离度量&#65288;详见<a href="https://arxiv.org/abs/1806.05759">我们的论文</a>&#65289;&#65292;以比较每组网络内的表征以及记忆和泛化网络之间的表征&#12290; <br />
<br />
我们发现&#65292;与记忆网络组相比&#65292;<i>不同的</i>泛化网络组均一致地收敛到更相似的表征&#65288;尤其是在后期层中&#65289;&#65288;见下图&#65289;&#12290;在表示网络最终预测的 <a href="https://en.wikipedia.org/wiki/Softmax_function#Neural_networks">softmax</a> 中&#65292;由于每个单独组中的网络做出的预测类似&#65292;因此每组泛化和记忆网络的 CCA 距离显著减小&#12290;<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-dMYVRkOgKNI/WysDeLiTxgI/AAAAAAAAC8s/XHJT8cmZlH0UAGpxcAwviGhAjqU2zMGVgCLcBGAs/s1600/image1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="631" data-original-width="1070" height="377" src="https://4.bp.blogspot.com/-dMYVRkOgKNI/WysDeLiTxgI/AAAAAAAAC8s/XHJT8cmZlH0UAGpxcAwviGhAjqU2zMGVgCLcBGAs/s640/image1.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">与记忆网络组&#65288;红色&#65289;相比&#65292;泛化网络组&#65288;蓝色&#65289;能够收敛到更相似的解&#12290;计算在真实 CIFAR-10 标签&#65288;&#8220;泛化&#8221;&#65289;或随机 CIFAR-10 标签&#65288;&#8220;记忆&#8221;&#65289;上训练的网络组之间的 CCA 距离以及记忆和泛化网络对之间&#65288;&#8220;组间&#8221;&#65289;的 CCA 距离&#12290; </td></tr>
</tbody></table>
也许最令人惊讶的是&#65292;在后期隐藏层中&#65292;任一给定记忆网络对之间的表征距离与记忆和泛化网络之间的表征距离大致相同&#65288;上图中的&#8220;组间&#8221;&#65289;&#65292;尽管这些网络是使用标签完全不同的数据训练的&#12290;直观地说&#65292;这一结果表明&#65292;<i>记忆训练数据的方法有很多&#65288;导致 CCA 距离更大&#65289;&#65292;但是学习可泛化解的方法却很少</i>&#12290;在未来的工作中&#65292;我们将探索是否可以利用这一发现来规范网络&#65292;以学习泛化能力更强的解&#12290;<br />
<br />
<b>理解递归神经网络的训练动态</b><br />
到目前为止&#65292;我们只在使用图像数据训练的 CNN 上应用了 CCA&#12290;不过&#65292;CCA 也可以用于计算 RNN 中的表征相似性&#65292;无论是在训练过程中还是在序列化过程中&#12290;在将 CCA 应用于 RNN 前&#65292;我们首先考虑 RNN 是否同样显示出在关于 CNN 的<a href="https://ai.googleblog.com/2017/11/interpreting-deep-neural-networks-with.html">先前研究</a>中所观察到的<i>自下而上</i>收敛模式&#12290;为了检验这一点&#65292;我们测量了训练过程中 RNN 各层的表征与训练结束时的最终表征之间的 CCA 距离&#12290;我们发现&#65292;在训练中&#65292;更接近输入的层的 CCA 距离比更深的层下降得更早&#65292;这表明&#65292;与 CNN 一样&#65292;RNN 也按自下而上的模式收敛&#65288;见下图&#65289;&#12290;<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-6jRjnU8jAH0/WysDSsEVcmI/AAAAAAAAC8o/LvUd5A96nD4ggRM_-3bTiW4k-g4dBIPzgCLcBGAs/s1600/image2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="502" data-original-width="1600" height="201" src="https://3.bp.blogspot.com/-6jRjnU8jAH0/WysDSsEVcmI/AAAAAAAAC8o/LvUd5A96nD4ggRM_-3bTiW4k-g4dBIPzgCLcBGAs/s640/image2.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">RNN 在训练过程中的收敛动态表现为自下而上的收敛&#65292;因为在训练中&#65292;相对于后期层&#65292;更接近输入的层更早地收敛到它们的最终表征&#12290;例如&#65292;在训练中&#65292;第 1 层收敛到最终表征的时间比第 2 层更早&#65292;第 2 层比第 3 层早&#65292;以此类推&#12290;周期表示模型看到整个训练集的次数&#65292;而不同的颜色表示不同层的收敛动态&#12290;</td></tr>
</tbody></table>
我们论文中的其他发现显示&#65292;与窄网络相比&#65292;较宽的网络&#65288;例如&#65292;每层具有更多神经元的网络&#65289;能够收敛到更相似的解&#12290;我们还发现&#65292;具有相同结构但学习率不同的训练后网络收敛到具有相似性能但表征差异非常大的不同集群&#12290;我们还在单个序列化过程中将 CCA 应用于 RNN 动态&#65292;而不仅仅是在训练过程中&#65292;对随时间推移影响 RNN 表征的各种因素形成了一些初步认识&#12290;<br />
<br />
<b>结论</b><br />
这些发现强化了分析和比较 DNN 表征的效用&#65292;以便深入了解网络功能&#12289;泛化和收敛&#12290;不过&#65292;仍有许多未解决的问题&#65306;在未来的工作中&#65292;我们希望揭示对于 CNN 和 RNN&#65292;网络中保留了表征的哪些方面&#65292;以及这些分析结果是否可以用来提升网络性能&#12290;我们鼓励其他人尝试这篇论文中使用的<a href="https://github.com/google/svcca/">代码</a>&#65292;以便研究 CCA 在其他神经网络中的应用&#65281;<br />
<br />
<b>致谢</b><br />
<i>特别感谢这篇论文的联合作者 Samy Bengio&#12290;Martin Wattenberg&#12289;Jascha Sohl-Dickstein 和 Jon Kleinberg 提供了十分有帮助的意见&#65292;在此一并感谢&#12290;</i><br />
<br />
<span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person">
  
</span>
                        <!--<meta name="original_url" content="http://ai.googleblog.com/2018/06/how-can-neural-network-similarity-help.html"><meta name="original_title" content="Google AI Blog: How Can Neural Network Similarity Help Us Understand Training and Generalization?"><meta name="original_blog" content="">-->


                        </script>
</div>
</div>
</div>
<div class='post' data-id='8872293492333319835' itemscope='' itemtype='http://schema.org/BlogPosting'>
<h2 class='title' itemprop='name'>
<a href='https://googledeveloperschina.blogspot.com/2018/07/standardizing-lessons-learned-from-amp.html' itemprop='url' title='从 AMP 中学到的标准化经验'>
从 AMP 中学到的标准化经验
</a>
</h2>
<div class='post-header'>
<div class='published'>
<span class='publishdate' itemprop='datePublished'>
2018年7月18日星期三
</span>
</div>
</div>
<div class='post-body'>
<div class='post-content' itemprop='articleBody'>
<script type='text/template'>
                          &#65279;<br />
<span style="font-weight: 400;">过去两年多来&#65292;AMP 一直是用于构建一贯出色的网络用户体验的主要格式&#65292;Google 也会将它作为实现构建用户至上的网络这个目标的良好途径&#65292;在这个领域继续大力投资&#12290;我们一直认为可以通过多种方式实现构建用户至上的网络这个目标&#65292;但是直到我们启动 AMP 项目&#65292;才确切知道这个目标的含义&#65292;以及实现目标仍面临着种种挑战&#12290;根据我们从 AMP 中获得的经验&#65292;</span><b>我们现在认为可以开展下一步工作&#65292;在专门设计的 Google 搜索区域&#65288;例如&#8220;焦点新闻&#8221;轮播&#65289;中支持更多并非基于 AMP 技术的即时加载内容&#12290;</b><span style="font-weight: 400;"> 要想符合资格&#65292;此内容需要遵循一套未来的网络标准&#65292;并满足多个客观的性能和用户体验条件&#12290;</span><br />
<div class="entry-content">
<br />
<br />
<h2>
<b>AMP 的起源和发展</b></h2>
<br />
<span style="font-weight: 400;">我们之所以启动 AMP&#65292;是因为我们发现移动网络让人感觉迟钝而缓慢&#65292;落后于&#8220;围墙花园&#8221;平台可以提供的紧密集成&#12289;高度优化的用户体验&#12290;我们还知道其中不存在基本的技术问题&#65306;您可以利用恰当的知识&#12289;资源和管理支持构建出色的网络体验&#12290;因此&#65292;我们决定创建一个可以为构建出色的网络体验提供良好途径的框架&#65306;AMP 具有资料完备&#12289;易于部署和可验证等特性&#65292;并且对用户至上的原则有独特见解&#12290;</span><br />
<br />
<span style="font-weight: 400;">AMP 作为一个</span><a href="https://github.com/ampproject/amphtml"><span style="font-weight: 400;">开放源代码项目</span></a><span style="font-weight: 400;">取得了快速发展&#65292;每周都会发布新功能并根据</span><a href="https://github.com/ampproject/amphtml/issues?q=is%3Aopen+is%3Aissue+label%3A%22INTENT+TO+IMPLEMENT%22"><span style="font-weight: 400;">发布商和用户的反馈</span></a><span style="font-weight: 400;">进行持续调整&#12290;我们希望 Google 从过去 2 年多围绕</span><a href="https://github.com/extensibleweb/manifesto"><span style="font-weight: 400;">可扩展网络</span></a><span style="font-weight: 400;">进行的反复尝试工作中学到的经验可以为网络标准制定过程提供一些有用的信息&#12290;感谢 </span><a href="https://twitter.com/tkadlec"><span style="font-weight: 400;">Tim Kadlec</span></a><span style="font-weight: 400;"> 在 2016 年提出</span><a href="https://timkadlec.com/2016/02/a-standardized-alternative-to-amp/"><span style="font-weight: 400;">&#8220;内容性能策略&#8221;理念</span></a><span style="font-weight: 400;">并说服我们应当沿着这条路继续走下去&#12290;现在&#65292;这个理念已演变成</span><a href="https://wicg.github.io/feature-policy/"><span style="font-weight: 400;">功能策略</span></a><span style="font-weight: 400;">&#65292;并且在今后不依赖 AMP 的情况下&#65292;切实有助于提供类 AMP 性能保证&#12290;</span><br />
<br />
<span style="font-weight: 400;">我们感到 AMP 背后的使命比以往更加重要&#65292;Google 将在开发 AMP 上继续大力投资&#12290;投资的当前关注领域包括&#65306;</span><a href="https://www.ampproject.org/stories"><span style="font-weight: 400;">通过 AMP 故事构建极具吸引力的故事叙述体验</span></a><span style="font-weight: 400;">&#12289;</span><a href="https://www.blog.google/products/g-suite/bringing-power-amp-gmail/"><span style="font-weight: 400;">动态电子邮件</span></a><span style="font-weight: 400;">&#12289;</span><a href="https://github.com/ampproject/amphtml/issues/13471"><span style="font-weight: 400;">AMP 中的 JS</span></a><span style="font-weight: 400;">&#12289;</span><a href="https://www.ampproject.org/latest/blog/amps-new-horizons/"><span style="font-weight: 400;">推动网络电子商务创新</span></a><span style="font-weight: 400;">&#65292;以及开发平台和内容与 Google 搜索的其他深入集成&#12290;</span><br />
<br />
<br />
<h2>
<b>学到的标准化经验</b></h2>
<br />
<span style="font-weight: 400;">AMP 驱动的标准化工作正通过各个 </span><a href="https://www.w3.org/blog/2015/07/wicg/"><span style="font-weight: 400;">WICG</span></a><span style="font-weight: 400;"> 项目按部就班地开展&#12290;Google 的目标是将对</span><a href="https://developers.google.com/search/docs/guides/about-amp"><span style="font-weight: 400;">&#8220;焦点新闻&#8221;轮播</span></a><span style="font-weight: 400;">等功能的支持扩展到符合以下条件的类 AMP 内容&#65306;(1) 满足多个性能和用户体验条件&#65307;(2) 实现一套新的网络标准&#12290;关键途径中的一些建议标准包括</span><a href="https://wicg.github.io/feature-policy/"><span style="font-weight: 400;">功能策略</span></a><span style="font-weight: 400;">&#12289;</span><a href="https://github.com/WICG/webpackage"><span style="font-weight: 400;">网络封装</span></a><span style="font-weight: 400;">&#12289;</span><a href="https://discourse.wicg.io/t/proposal-for-promotable-iframe/2375"><span style="font-weight: 400;">iframe 置顶</span></a><span style="font-weight: 400;">&#12289;</span><a href="https://w3c.github.io/performance-timeline/"><span style="font-weight: 400;">性能时间线</span></a><span style="font-weight: 400;">和</span><a href="https://w3c.github.io/paint-timing/"><span style="font-weight: 400;">绘制计时</span></a><span style="font-weight: 400;">&#12290;同样重要的是&#65292;Chrome 团队去年发布了 </span><a href="https://developers.google.com/web/tools/chrome-user-experience-report/"><span style="font-weight: 400;">Chrome 用户体验报告</span></a><span style="font-weight: 400;">&#12290;报告的底层数据首次为性能和用户体验提供了网络范围的真实测量值&#12290;</span><br />
<br />
<span style="font-weight: 400;">今年 1 月&#65292;</span><a href="https://amphtml.wordpress.com/2018/01/09/improving-urls-for-amp-pages/"><span style="font-weight: 400;">我们宣布</span></a><span style="font-weight: 400;"> Google 计划按照 </span><a href="https://www.w3.org/2001/tag/doc/distributed-content/"><span style="font-weight: 400;">W3C TAG 发现</span></a><span style="font-weight: 400;">的建议使用</span><a href="https://github.com/WICG/webpackage/blob/master/explainer.md">网络封装</a><span style="font-weight: 400;">提供</span><a href="https://medium.com/@pbakaus/why-amp-caches-exist-cd7938da2456#36e9"><span style="font-weight: 400;">保护隐私的预加载功能</span></a><span style="font-weight: 400;">&#65292;以及能够在发布商网址下投放 AMP 内容&#12290;我们对网络封装感到非常兴奋&#65292;因为它不是一种特定于 AMP 的技术&#65292;<strong>这样一来&#65292;我们可以将它用于即时加载封装的所有网络内容&#65281;</strong></span><br />
<br />
<span style="font-weight: 400;">Google 搜索中的&#8220;焦点新闻&#8221;轮播等功能依赖 AMP 的可嵌入性特性&#12290;例如&#65292;它使用</span><a href="https://medium.com/@pbakaus/why-amp-caches-exist-cd7938da2456#36e9"><span style="font-weight: 400;">保护隐私的预渲染</span></a><span style="font-weight: 400;">&#65307;基于 AMP 的 CPU&#12289;内存和带宽使用限制&#65307;以及</span><a href="https://github.com/ampproject/amphtml/blob/master/extensions/amp-viewer-integration/integrating-viewer-with-amp-doc-guide.md"><span style="font-weight: 400;">内置的容器-嵌入-通信机制</span></a><span style="font-weight: 400;">&#12290;现在我们相信&#65292;借助通过</span><a href="https://www.chromium.org/Home/chromium-security/site-isolation"><span style="font-weight: 400;">网站隔离</span></a><span style="font-weight: 400;">或</span><a href="https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAFK_eqQOzc7cU0QuRMbiJ_Ywcgn2TYaQNdOv6szWAbMFeMAFow%40mail.gmail.com?utm_medium=email&amp;utm_source=footer"><span style="font-weight: 400;">协同多任务</span></a><span style="font-weight: 400;">实现的 iframe 性能隔离&#12289;</span><a href="https://github.com/WICG/webpackage/blob/master/explainer.md"><span style="font-weight: 400;">网络封装</span></a><span style="font-weight: 400;">&#12289;</span><a href="https://docs.google.com/document/d/1k0Ua-ZWlM_PsFCFdLMa8kaVTo32PeNZ4G7FFHqpFx4E/edit"><span style="font-weight: 400;">功能策略</span></a><span style="font-weight: 400;">&#12289;</span><a href="https://discourse.wicg.io/t/proposal-for-promotable-iframe/2375"><span style="font-weight: 400;">iframe 置顶</span></a><span style="font-weight: 400;">和文档选择接受&#65292;可以让实现这些标准的非 AMP 网络内容使用此类功能&#12290;</span><br />
<br />
<span style="font-weight: 400;">这需要跟踪许多功能&#65292;因此&#65292;我们计划定期更新</span><a href="https://github.com/ampproject/amphtml/blob/master/contributing/web-standards-related-to-amp.md"><span style="font-weight: 400;">此页面</span></a><span style="font-weight: 400;">来跟踪进度&#12290;尽管我们完全计划在 Google 搜索中进行这些变更&#65292;但是与任何 Google 搜索功能一样&#65292;这些变更也将进行试验和用户测试&#65292;并且仅在结果对用户有利时实施&#12290;很难估计我们何时逐步实施这些变更&#65292;因为这取决于标准化和浏览器实现的未来进度&#12290;在社区与实现者之间达成共识是标准化过程的重要部分&#65292;可能需要对此计划进行变更&#12290;</span><br />
<br />
<span style="font-weight: 400;">总结&#65306;我们正在利用从 AMP 中学到的经验&#65292;并紧锣密鼓地制定允许即时加载非 AMP 网络内容的网络标准&#12290;我们希望这项工作也会解锁类 AMP 可嵌入性&#65292;&#8220;焦点新闻&#8221;轮播等 Google 搜索功能正是依托于这种可嵌入性&#12290;同时&#65292;AMP 也将作为 Google 构建出色的网络用户体验的良好途径&#12290;尽管 AMP 只是众多选择之一&#65292;但我们由衷地推荐这种技术&#12290;我们将在 AMP 领域继续大力投资&#12290;我们继续致力于网络用户体验创新的一个主要示例是 </span><a href="https://www.ampproject.org/stories"><span style="font-weight: 400;">AMP 故事</span></a><span style="font-weight: 400;">&#65292;我们希望在这个过程中为未来的网络标准提供深入的数据分析&#12290;</span><br />
<br />
<span style="font-weight: 400;">我和 AMP 团队的各位同仁对开放网络的未来感到非常兴奋&#65292;并且迫不及待地想要看到大家的构建成果&#65281;#teamweb</span><br />
<br />
<i><span style="font-weight: 400;">发布人&#65306;Google AMP 项目技术负责人 Malte Ubl&#12290;</span></i></div>
<!-- .entry-content -->

 <br />
<div class="entry-format">
<a href="https://amphtml.wordpress.com/2018/03/08/standardizing-lessons-learned-from-amp/"><span class="screen-reader-text">从 AMP 中学到的标准化经验</span></a> </div>
<!--<meta name="original_url" content="https://amphtml.wordpress.com/2018/03/08/standardizing-lessons-learned-from-amp/"><meta name="original_title" content="Standardizing lessons learned from AMP &#8211; Accelerated Mobile Pages Project"><meta name="original_blog" content="Accelerated Mobile Pages Project">-->
                        </script>
</div>
</div>
</div>
<div class='post' data-id='1575012703720194520' itemscope='' itemtype='http://schema.org/BlogPosting'>
<h2 class='title' itemprop='name'>
<a href='https://googledeveloperschina.blogspot.com/2018/07/google-at-icml-2018.html' itemprop='url' title='Google 参加 ICML 2018 大会'>
Google 参加 ICML 2018 大会
</a>
</h2>
<div class='post-header'>
<div class='published'>
<span class='publishdate' itemprop='datePublished'>
2018年7月18日星期三
</span>
</div>
</div>
<div class='post-body'>
<div class='post-content' itemprop='articleBody'>
<script type='text/template'>
                          <span class="byline-author">发布人&#65306;Google AI Communications 主编 Christian Howard</span> <br>
<br>
机器学习是 Google 的一项战略重点&#65292;内部众多高度活跃的小组正在从事该领域几乎所有方面的研究&#65292;包括深度学习和更多经典算法&#65292;以及探索理论与应用&#12290;我们利用可扩展的工具和架构构建机器学习系统&#65292;从而解决语言&#12289;语音&#12289;翻译&#12289;音乐和视觉处理等领域的深层次科学和工程难题&#12290;<br>
<br>
作为机器学习研究的领导者&#65292;Google 对成为第三十五届<a href="https://icml.cc/Conferences/2018">国际机器学习大会</a> (ICML 2018) 的白金级赞助商感到自豪&#65292;国际机器学习大会是由<a href="http://www.machinelearning.org/">国际机器学习协会</a>提供支持的最重要年度会议&#65292;今年的会议将于本周在瑞典的斯德哥尔摩举行&#12290;超过 130 名 Google 员工将在大会上展示论文和主持研讨会&#65292;我们期待与更广大的机器学习研究社区继续合作&#12290;<br>
<br>
如果您将参加 ICML 2018&#65292;我们希望您来到 Google 展台并与研究员交流&#65292;详细了解我们在解决该领域最有趣的一些难题时开展的令人兴奋的工作&#12289;展现的创造力和收获的乐趣&#12290;我们的研究员也会讨论 <a href="https://www.tensorflow.org/hub/">TensorFlow Hub</a> 以及 <a href="https://magenta.tensorflow.org/">Magenta 项目</a>的最新成果&#65292;并参加一个有关 <a href="https://ai.google/research/join-us/ai-residency/">Google AI Residency</a> 计划的问答讲座&#65292;等等&#12290;您也可以查看下面的列表&#65292;详细了解我们在 ICML 2018 大会上展示的研究成果&#65288;Google 员工姓名以蓝色突出显示&#65289;&#12290;<br>
<br>
<b><u>ICML 2018 委员会</u></b><br>
委员会成员&#65306;<i><span style="color: #3d85c6;">Andrew McCallum</span>&#12289;<span style="color: #3d85c6;">Corinna Cortes</span>&#12289;<span style="color: #3d85c6;">Hugo Larochelle</span> 和 <span style="color: #3d85c6;">William Cohen</span></i><br>
赞助联合主席&#65306;<span style="color: #3d85c6;"><i>Ryan Adams</i></span><br>
<br>
<b><u>入选的论文</u></b><br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2527">Predict and Constrain:Modeling Cardinality in Deep Structured Prediction</a><br>
<i>Nataly Brukhim&#12289;<span style="color: #3d85c6;">Amir Globerson</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2538">Quickshift++:Provably Good Initializations for Sample-Based Mean Shift</a><br>
<i><span style="color: #3d85c6;">Heinrich Jiang</span>&#12289;Jennifer Jang 和 Samory Kpotufe</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2636">Learning a Mixture of Two Multinomial Logits</a><br>
<i>Flavio Chierichetti&#12289;<span style="color: #3d85c6;">Ravi Kumar</span> 和 <span style="color: #3d85c6;">Andrew Tomkins</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2605">Structured Evolution with Compact Architectures for Scalable Policy Optimization</a><br>
<i><span style="color: #3d85c6;">Krzysztof Choromanski</span>&#12289;Mark Rowland&#12289;<span style="color: #3d85c6;">Vikas Sindhwani</span>&#12289;Richard E Turner 和 Adrian Weller</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2631">Fixing a Broken ELBO</a><br>
<i><span style="color: #3d85c6;">Alexander Alemi</span>&#12289;Ben Poole&#12289;<span style="color: #3d85c6;">Ian Fischer</span>&#12289;<span style="color: #3d85c6;">Joshua Dillon</span>&#12289;<span style="color: #3d85c6;">Rif Saurous</span> 和 <span style="color: #3d85c6;">Kevin Murphy</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2673">Hierarchical Long-term Video Prediction without Supervision</a><br>
<i><span style="color: #3d85c6;">Nevan Wichers</span>&#12289;Ruben Villegas&#12289;<span style="color: #3d85c6;">Dumitru Erhan</span> 和 <span style="color: #3d85c6;">Honglak Lee</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2659">Self-Consistent Trajectory Autoencoder:Hierarchical Reinforcement Learning with Trajectory Embeddings</a><br>
<i>John Co-Reyes&#12289;Yu Xuan Liu&#12289;Abhishek Gupta&#12289;<span style="color: #3d85c6;">Benjamin Eysenbach</span>&#12289;Pieter Abbeel&#12289;Sergey Levine</i><br><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2643">Well Tempered Lasso</a><br>
<i>Yuanzhi Li&#12289;<span style="color: #3d85c6;">Yoram Singer</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2709">Programmatically Interpretable Reinforcement Learning</a><br>
<i>Abhinav Verma&#12289;Vijayaraghavan Murali&#12289;<span style="color: #3d85c6;">Rishabh Singh</span>&#12289;Pushmeet Kohli 和 Swarat Chaudhuri</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2730">Dynamical Isometry and a Mean Field Theory of CNNs:How to Train 10,000-Layer Vanilla Convolutional Neural Networks</a><br>
<i><span style="color: #3d85c6;">Lechao Xiao</span>&#12289;<span style="color: #3d85c6;">Yasaman Bahri</span>&#12289;<span style="color: #3d85c6;">Jascha Sohl-Dickstein</span>&#12289;<span style="color: #3d85c6;">Samuel Schoenholz</span> 和 <span style="color: #3d85c6;">Jeffrey Pennington</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2732">On the Optimization of Deep Networks:Implicit Acceleration by Overparameterization</a><br>
<i>Sanjeev Arora&#12289;Nadav Cohen 和 <span style="color: #3d85c6;">Elad Hazan</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2701">Scalable Deletion-Robust Submodular Maximization:Data Summarization with Privacy and Fairness Constraints</a><br>
<i>Ehsan Kazemi&#12289;<span style="color: #3d85c6;">Morteza Zadimoghaddam</span> 和 Amin Karbasi</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2702">Data Summarization at Scale:A Two-Stage Submodular Approach</a><br>
<i>Marko Mitrovic&#12289;Ehsan Kazemi&#12289;<span style="color: #3d85c6;">Morteza Zadimoghaddam</span> 和 Amin Karbasi</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2764">Machine Theory of Mind</a><br>
<i>Neil Rabinowitz&#12289;Frank Perbet&#12289;Francis Song&#12289;<span style="color: #3d85c6;">Chiyuan Zhang</span>&#12289;S. M. Ali Eslami 和 Matthew Botvinick</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2750">Learning to Optimize Combinatorial Functions</a><br>
<i>Nir Rosenfeld&#12289;Eric Balkanski&#12289;<span style="color: #3d85c6;">Amir Globerson</span> 和 Yaron Singer</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2751">Proportional Allocation:Simple, Distributed, and Diverse Matching with High Entropy</a><br>
<i>Shipra Agarwal&#12289;<span style="color: #3d85c6;">Morteza Zadimoghaddam</span> 和 <span style="color: #3d85c6;">Vahab Mirrokni</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2761">Path Consistency Learning in Tsallis Entropy Regularized MDPs</a><br>
<i>Yinlam Chow&#12289;<span style="color: #3d85c6;">Ofir Nachum</span> 和 <span style="color: #3d85c6;">Mohammad Ghavamzadeh</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2776">Efficient Neural Architecture Search via Parameters Sharing</a><br>
<i>Hieu Pham&#12289;Melody Guan&#12289;<span style="color: #3d85c6;">Barret Zoph</span>&#12289;<span style="color: #3d85c6;">Quoc Le</span> 和 <span style="color: #3d85c6;">Jeff Dean</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2724">Adafactor:Adaptive Learning Rates with Sublinear Memory Cost</a><br>
<i><span style="color: #3d85c6;">Noam Shazeer</span>&#12289;Mitchell Stern</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2836">Learning Memory Access Patterns</a><br>
<i><span style="color: #3d85c6;">Milad Hashemi</span>&#12289;<span style="color: #3d85c6;">Kevin Swersky</span>&#12289;<span style="color: #3d85c6;">Jamie Smith</span>&#12289;Grant Ayers&#12289;Heiner Litz&#12289;<span style="color: #3d85c6;">Jichuan Chang</span>&#12289;Christos Kozyrakis 和 <span style="color: #3d85c6;">Parthasarathy Ranganathan</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2816">SBEED:Convergent Reinforcement Learning with Nonlinear Function Approximation</a><br>
<i>Bo Dai&#12289;Albert Shaw&#12289;<span style="color: #3d85c6;">Lihong Li</span>&#12289;Lin Xiao&#12289;Niao He&#12289;Zhen Liu&#12289;Jianshu Chen 和 Le Song</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2817">Scalable Bilinear Pi Learning Using State and Action Features</a><br>
<i>Yichen Chen&#12289;<span style="color: #3d85c6;">Lihong Li</span> 和 Mengdi Wang</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2829">Distributed Asynchronous Optimization with Unbounded Delays:How Slow Can You Go?</a><br>
<i>Zhengyuan Zhou&#12289;Panayotis Mertikopoulos&#12289;Nicholas Bambos&#12289;Peter Glynn&#12289;Yinyu Ye&#12289;<span style="color: #3d85c6;">Li-Jia Li</span> 和 Li Fei-Fei</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2881">Shampoo:Preconditioned Stochastic Tensor Optimization</a><br>
<i><span style="color: #3d85c6;">Vineet Gupta</span>&#12289;<span style="color: #3d85c6;">Tomer Koren 和 Yoram Singer</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2860">Parallel and Streaming Algorithms for K-Core Decomposition</a><br>
<i>Hossein Esfandiari&#12289;<span style="color: #3d85c6;">Silvio Lattanzi</span> 和 <span style="color: #3d85c6;">Vahab Mirrokni</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2871">Can Deep Reinforcement Learning Solve Erdos-Selfridge-Spencer Games?</a><br>
<i><span style="color: #3d85c6;">Maithra Raghu</span>&#12289;<span style="color: #3d85c6;">Alexander Irpan</span>&#12289;Jacob Andreas&#12289;Bobby Kleinberg&#12289;<span style="color: #3d85c6;">Quoc Le</span> 和 Jon Kleinberg</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2868">Is Generator Conditioning Causally Related to GAN Performance?</a><br>
<i><span style="color: #3d85c6;">Augustus Odena</span>&#12289;<span style="color: #3d85c6;">Jacob Buckman</span>&#12289;<span style="color: #3d85c6;">Catherine Olsson</span>&#12289;<span style="color: #3d85c6;">Tom Brown</span>&#12289;<span style="color: #3d85c6;">Christopher Olah</span>&#12289;<span style="color: #3d85c6;">Colin Raffel</span> 和 <span style="color: #3d85c6;">Ian Goodfellow</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2925">The Mirage of Action-Dependent Baselines in Reinforcement Learning</a><br>
<i><span style="color: #3d85c6;">George Tucker</span>&#12289;<span style="color: #3d85c6;">Surya Bhupatiraju</span>&#12289;Shixiang Gu&#12289;Richard E Turner&#12289;Zoubin Ghahramani 和 <span style="color: #3d85c6;">Sergey Levine</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2909">MentorNet:Learning Data-Driven Curriculum for Very Deep Neural Networks on Corrupted Labels</a><br>
<i><span style="color: #3d85c6;">Lu Jiang</span>&#12289;Zhengyuan Zhou&#12289;Thomas Leung&#12289;<span style="color: #3d85c6;">Li-Jia Li</span> 和 <span style="color: #3d85c6;">Li Fei-Fei</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2915">Loss Decomposition for Fast Learning in Large Output Spaces</a><br>
<i>En-Hsu Yen&#12289;<span style="color: #3d85c6;">Satyen Kale</span>&#12289;<span style="color: #3d85c6;">Felix Xinnan Yu</span>&#12289;<span style="color: #3d85c6;">Daniel Holtmann-Rice</span>&#12289;<span style="color: #3d85c6;">Sanjiv Kumar</span> 和 Pradeep Ravikumar</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2941">A Hierarchical Latent Vector Model for Learning Long-Term Structure in Music</a><br>
<i><span style="color: #3d85c6;">Adam Roberts</span>&#12289;<span style="color: #3d85c6;">Jesse Engel</span>&#12289;<span style="color: #3d85c6;">Colin Raffel</span>&#12289;<span style="color: #3d85c6;">Curtis Hawthorne</span> 和 <span style="color: #3d85c6;">Douglas Eck</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2926">Smoothed Action Value Functions for Learning Gaussian Policies</a><br>
<i><span style="color: #3d85c6;">Ofir Nachum</span>&#12289;<span style="color: #3d85c6;">Mohammad Norouzi</span>&#12289;<span style="color: #3d85c6;">George Tucker</span> 和 <span style="color: #3d85c6;">Dale Schuurmans</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2942">Fast Decoding in Sequence Models Using Discrete Latent Variables</a><br>
<i><span style="color: #3d85c6;">Lukasz Kaiser</span>&#12289;<span style="color: #3d85c6;">Samy Bengio</span>&#12289;<span style="color: #3d85c6;">Aurko Roy</span>&#12289;<span style="color: #3d85c6;">Ashish Vaswani</span>&#12289;<span style="color: #3d85c6;">Niki Parmar</span>&#12289;<span style="color: #3d85c6;">Jakob Uszkoreit</span> 和 <span style="color: #3d85c6;">Noam Shazeer</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2937">Accelerating Greedy Coordinate Descent Methods</a><br>
<i>Haihao Lu&#12289;Robert Freund 和 <span style="color: #3d85c6;">Vahab Mirrokni</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2917">Approximate Leave-One-Out for Fast Parameter Tuning in High Dimensions</a><br>
<i>Shuaiwen Wang&#12289;Wenda Zhou&#12289;Haihao Lu&#12289;Arian Maleki 和 <span style="color: #3d85c6;">Vahab Mirrokni</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2944">Image Transformer</a><br>
<i><span style="color: #3d85c6;">Niki Parmar</span>&#12289;<span style="color: #3d85c6;">Ashish Vaswani</span>&#12289;<span style="color: #3d85c6;">Jakob Uszkoreit</span>&#12289;<span style="color: #3d85c6;">Lukasz Kaiser</span>&#12289;<span style="color: #3d85c6;">Noam Shazeer</span>&#12289;Alexander Ku 和 <span style="color: #3d85c6;">Dustin Tran</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2984">Towards End-to-End Prosody Transfer for Expressive Speech Synthesis with Tacotron</a><br>
<i><span style="color: #3d85c6;">RJ Skerry-Ryan</span>&#12289;<span style="color: #3d85c6;">Eric Battenberg</span>&#12289;<span style="color: #3d85c6;">Ying Xiao</span>&#12289;<span style="color: #3d85c6;">Yuxuan Wang</span>&#12289;<span style="color: #3d85c6;">Daisy Stanton</span>&#12289;<span style="color: #3d85c6;">Joel Shor</span>&#12289;<span style="color: #3d85c6;">Ron Weiss</span>&#12289;<span style="color: #3d85c6;">Robert Clark</span> 和 <span style="color: #3d85c6;">Rif Saurous</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=3001">Dynamical Isometry and a Mean Field Theory of RNNs:Gating Enables Signal Propagation in Recurrent Neural Networks</a><br>
<i><span style="color: #3d85c6;">Minmin Chen</span>&#12289;<span style="color: #3d85c6;">Jeffrey Pennington</span> 和 <span style="color: #3d85c6;">Samuel Schoenholz</span></i><br><br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2985">Style Tokens:Unsupervised Style Modeling, Control and Transfer in End-to-End Speech Synthesis</a><br>
<i><span style="color: #3d85c6;">Yuxuan Wang</span>&#12289;<span style="color: #3d85c6;">Daisy Stanton</span>&#12289;<span style="color: #3d85c6;">Yu Zhang</span>&#12289;<span style="color: #3d85c6;">RJ Skerry-Ryan</span>&#12289;<span style="color: #3d85c6;">Eric Battenberg</span>&#12289;<span style="color: #3d85c6;">Joel Shor</span>&#12289;<span style="color: #3d85c6;">Ying Xiao</span>&#12289;<span style="color: #3d85c6;">Ye Jia</span>&#12289;<span style="color: #3d85c6;">Fei Ren</span>&#12289;<span style="color: #3d85c6;">Rif Saurous</span></i><br><br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=2970">Constrained Interacting Submodular Groupings</a><br>
<i><span style="color: #3d85c6;">Andrew Cotter</span>&#12289;<span style="color: #3d85c6;">Mahdi Milani Fard</span>&#12289;<span style="color: #3d85c6;">Seungil You</span>&#12289;<span style="color: #3d85c6;">Maya Gupta</span> 和 Jeff Bilmes</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=3033">Reinforcing Adversarial Robustness using Model Confidence Induced by Adversarial Training</a><br>
<i><span style="color: #3d85c6;">Xi Wu</span>&#12289;Uyeong Jang&#12289;Jiefeng Chen&#12289;Lingjiao Chen 和 Somesh Jha</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=3106">Interpretability Beyond Feature Attribution:Quantitative Testing with Concept Activation Vectors (TCAV)</a><br>
<i><span style="color: #3d85c6;">Been Kim</span>&#12289;<span style="color: #3d85c6;">Martin Wattenberg</span>&#12289;<span style="color: #3d85c6;">Justin Gilmer</span>&#12289;<span style="color: #3d85c6;">Carrie Cai</span>&#12289;<span style="color: #3d85c6;">James Wexler</span>&#12289;<span style="color: #3d85c6;">Fernanda Vie&#769;gas</span> 和 <span style="color: #3d85c6;">Rory Sayres</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=3070">Online Learning with Abstention</a><br>
<i><span style="color: #3d85c6;">Corinna Cortes</span>&#12289;<span style="color: #3d85c6;">Giulia DeSalvo</span>&#12289;<span style="color: #3d85c6;">Claudio Gentile</span>&#12289;<span style="color: #3d85c6;">Mehryar Mohri</span> 和 Scott Yang</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=3122">Online Linear Quadratic Control</a><br>
<i><span style="color: #3d85c6;">Alon Cohen</span>&#12289;<span style="color: #3d85c6;">Avinatan Hasidim</span>&#12289;<span style="color: #3d85c6;">Tomer Koren</span>&#12289;<span style="color: #3d85c6;">Nevena Lazic</span>&#12289;<span style="color: #3d85c6;">Yishay Mansour</span> 和 <span style="color: #3d85c6;">Kunal Talwar</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=3133">Competitive Caching with Machine Learned Advice</a><br>
<i>Thodoris Lykouris&#12289;<span style="color: #3d85c6;">Sergei Vassilvitskii</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=3160">Efficient Neural Audio Synthesis</a><br>
<i>Nal Kalchbrenner&#12289;<span style="color: #3d85c6;">Erich Elsen</span>&#12289;Karen Simonyan&#12289;Seb Noury&#12289;Norman Casagrande&#12289;Edward Lockhart&#12289;Florian Stimberg&#12289;Aa&#776;ron van den Oord&#12289;Sander Dieleman 和 Koray Kavukcuoglu</i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=3166">Gradient Descent with Identity Initialization Efficiently Learns Positive Definite Linear Transformations by Deep Residual Networks</a><br>
<i>Peter Bartlett&#12289;Dave Helmbold 和 <span style="color: #3d85c6;">Phil Long</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=3161">Understanding and Simplifying One-Shot Architecture Search</a><br>
<i><span style="color: #3d85c6;">Gabriel Bender</span>&#12289;<span style="color: #3d85c6;">Pieter-Jan Kindermans</span>&#12289;<span style="color: #3d85c6;">Barret Zoph</span>&#12289;<span style="color: #3d85c6;">Vijay Vasudevan</span> 和 <span style="color: #3d85c6;">Quoc Le</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=3137">Approximation Algorithms for Cascading Prediction Models</a><br>
<span style="color: #3d85c6;"><i>Matthew Streeter</i></span><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=3163">Learning Longer-term Dependencies in RNNs with Auxiliary Losses</a><br>
<i><span style="color: #3d85c6;">Trieu Trinh</span>&#12289;<span style="color: #3d85c6;">Andrew Dai</span>&#12289;<span style="color: #3d85c6;">Thang Luong</span> 和 <span style="color: #3d85c6;">Quoc Le</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=3201">Self-Imitation Learning</a><br>
<i>Junhyuk Oh&#12289;Yijie Guo&#12289;Satinder Singh 和 <span style="color: #3d85c6;">Honglak Lee</span></i><br>
<br>
<a href="https://icml.cc/Conferences/2018/Schedule?showEvent=3205">Adaptive Sampled Softmax with Kernel Based Sampling</a><br>
<i>Guy Blanc&#12289;<span style="color: #3d85c6;">Steffen Rendle</span></i><br>
<br>
<b><u>专题讲座</u></b><br>
<a href="https://sites.google.com/corp/view/whi2018/home">2018 Workshop on Human Interpretability in Machine Learning (WHI)</a><br>
组织者&#65306;<i><span style="color: #3d85c6;">Been Kim</span>&#12289;Kush Varshney 和 Adrian Weller</i><br>
受邀演讲嘉宾&#65306;<i><span style="color: #3d85c6;">Fernanda Viégas</span> 和 <span style="color: #3d85c6;">Martin Wattenberg</span></i><br>
<br>
<a href="https://sites.google.com/corp/view/erl-2018/">Exploration in Reinforcement Learning</a><br>
组织者&#65306;<i><span style="color: #3d85c6;">Ben Eysenbach</span>&#12289;<span style="color: #3d85c6;">Surya Bhupatiraju</span>&#12289;<span style="color: #3d85c6;">Shane Gu</span>&#12289;Junhyuk Oh&#12289;<span style="color: #3d85c6;">Vincent Vanhoucke</span>&#12289;Oriol Vinyals 和 Doina Precup</i><br>
<br>
<a href="https://sites.google.com/corp/view/tadgm/home">Theoretical Foundations and Applications of Deep Generative Models</a><br>
受邀演讲嘉宾&#65306;<span style="color: #3d85c6;"><i>Honglak Lee</i></span> <span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person"><meta content='https://plus.google.com/116899029375914044550' itemprop='url'/></span>
 <!--<meta name="original_url" content="http://ai.googleblog.com/2018/07/google-at-icml-2018.html"><meta name="original_title" content="Google AI Blog: Google at ICML 2018"><meta name="original_blog" content="">-->
                        </script>
</div>
</div>
</div>
<div class='blog-pager' id='blog-pager'>
<a class='home-link' href='https://googledeveloperschina.blogspot.com/'>
<i class='material-icons'>
                      &#59530;
                    </i>
</a>
<i class='material-icons disabled'>
                      &#58820;
                    </i>
<span id='blog-pager-older-link'>
<a class='blog-pager-older-link' href='https://googledeveloperschina.blogspot.com/search?updated-max=2018-07-18T16:09:00%2B08:00&amp;max-results=15' id='Blog1_blog-pager-older-link' title='較舊的文章'>
<i class='material-icons'>
                          &#58824;
                        </i>
</a>
</span>
</div>
<div class='clear'></div>
</div></div>
</div>
</div>
<div class='col-right'>
<div class='no-items section' id='sidebar-top'></div>
<div id='aside'>
<div class='section' id='sidebar'><div class='widget Label' data-version='1' id='Label1'>
<div class='tab'>
<img class='sidebar-icon' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYpJREFUeNrs2aFuwzAQBmAvKRkMKRjZA4QMDJaWFgyMjuzFRg37DIUlA3uFkoGQSaWzJU+tpri5O9+l/zSfdFJlpe59yTmyVedq1PjfcZMZ70NuQnaF8w8htyE/rABtpviXkLcK88c5HhLkMBfgVan43zfFBNGMjHVGT/s55KP2pAvidbGHd+nzKt1RKSLG3rKF1iPFv6UWiPke8i7kEqGdGsI1O+LYVdqJAjgirwkKYD0ytkJBUNbAMvX8V3q9PhUsYvU1sWD8SO/sQvx2ahxOiNoJCSBCoAHYCEQAC4EKICOQASQEOmAS8RcAFxFN5hiIiugpgC3wk9hQAHH/70EBHXUN7IER5EWMiBgo2+nzOKQv9SCAeEM/OQAkhE/ncccFICB87qzQMia5FsJfOui0zMnmRvipU1ormHQuxGTxUsAcCFLxJQBLBLn4UoAFglW8BkATwS5eC6CBEBWvCShBiIvXBkgQRcVbADiI4uKtABSESvGWgB9EzHt3+tNwyO0qa9SoIYtvAQYAqDJhaWWeMecAAAAASUVORK5CYII='/>
<h2>
Labels
</h2>
<i class='material-icons arrow'>
                      &#58821;
                    </i>
</div>
<div class='widget-content list-label-widget-content'>
<ul>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD'>
人工智能
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E5%BC%80%E5%8F%91%E8%80%85%E6%95%85%E4%BA%8B'>
开发者故事
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E5%BC%80%E6%BA%90'>
开源
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E5%AD%97%E4%BD%93'>
字体
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E5%AE%89%E5%85%A8'>
安全
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0'>
机器学习
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E7%BD%91%E7%AB%99'>
网站
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E8%AE%BE%E8%AE%A1'>
设计
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E8%B0%B7%E6%AD%8C%E4%B8%AD%E5%9B%BD'>
谷歌中国
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E5%AE%98%E6%96%B9%E5%8F%91%E5%B8%83'>
官方发布
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E7%89%A9%E8%81%94%E7%BD%91'>
物联网
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E7%A0%94%E7%A9%B6'>
研究
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C'>
神经网络
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E7%AB%9E%E8%B5%9B'>
竞赛
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E5%9F%B9%E8%AE%AD'>
培训
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5'>
最佳实践
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E7%A1%AC%E4%BB%B6'>
硬件
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E6%95%B0%E6%8D%AE'>
数据
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/%E7%AE%97%E6%B3%95'>
算法
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/AdWords'>
AdWords
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/AI'>
AI
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/AIY'>
AIY
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/AMP'>
AMP
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Android'>
Android
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Android%20%E5%BC%80%E5%8F%91'>
Android 开发
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Android%20P'>
Android P
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Android%20Studio'>
Android Studio
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Android%20Things'>
Android Things
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/android%20things%201.0'>
android things 1.0
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Android%20Wear'>
Android Wear
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Angular'>
Angular
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/API'>
API
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Authentication'>
Authentication
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/bootcamp'>
bootcamp
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Chrome'>
Chrome
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Cloud'>
Cloud
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/coding'>
coding
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Computer%20Vision'>
Computer Vision
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/constraintlayout'>
constraintlayout
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Containers%20%26%20Kubernetes'>
Containers &amp; Kubernetes
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Dart'>
Dart
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Deep%20Learning'>
Deep Learning
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/encryption'>
encryption
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/fcm'>
fcm
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Firebase'>
Firebase
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Flutter'>
Flutter
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/GCM'>
GCM
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Google'>
Google
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Google%20Brain'>
Google Brain
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Google%20Maps'>
Google Maps
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Google%20Play'>
Google Play
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Hardware'>
Hardware
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Health'>
Health
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/I%2FO%202018'>
I/O 2018
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/io18'>
io18
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/IoT'>
IoT
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Kotlin'>
Kotlin
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Machine%20Learning'>
Machine Learning
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Machine%20Perception'>
Machine Perception
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Material%20Design'>
Material Design
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Natural%20Language%20Processing'>
Natural Language Processing
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Natural%20Language%20Understanding'>
Natural Language Understanding
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/push%20messaging'>
push messaging
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Python'>
Python
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Release%20Preview'>
Release Preview
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Robotics'>
Robotics
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Security'>
Security
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Semantic%20Models'>
Semantic Models
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Speech'>
Speech
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/StudyJams'>
StudyJams
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/TensorFlow'>
TensorFlow
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/TensorFlow%20Lite'>
TensorFlow Lite
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Udacity'>
Udacity
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/UI'>
UI
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/User%20Experience'>
User Experience
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/UX'>
UX
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/video'>
video
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/VR'>
VR
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/Web%20Audio'>
Web Audio
</a>
</li>
<li>
<a dir='ltr' href='https://googledeveloperschina.blogspot.com/search/label/WebGL'>
WebGL
</a>
</li>
</ul>
</div>
</div><div class='widget BlogArchive' data-version='1' id='BlogArchive1'>
<div class='tab'>
<i class='material-icons icon'>
                      &#58055;
                    </i>
<h2>
Archive
</h2>
<i class='material-icons arrow'>
                      &#58821;
                    </i>
</div>
<div class='widget-content'>
<div id='ArchiveList'>
<div id='BlogArchive1_ArchiveList'>
<ul class='hierarchy'>
<li class='archivedate expanded'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy toggle-open'>
<i class='material-icons'>
                        &#58823;
                      </i>
                      &#160;
                      
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2018/'>
2018
</a>
</div>
<div class='items'>
<ul class='hierarchy'>
<li class='archivedate expanded'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy toggle-open'>
<i class='material-icons'>
                        &#58823;
                      </i>
                      &#160;
                      
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2018/07/'>
七月
</a>
</div>
<div class='items'>
<ul class='posts'>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/making-healthcare-data-work-better-with.html'>
通过机器学习让医疗数据更好用
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/expressive-speech-synthesis-with.html'>
通过 Tacotron 进行富有表现力的语音合成
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/mobilenetv2-next-generation-of-on.html'>
MobileNetV2&#65306;下一代设备上计算机视觉网络
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/seeing-more-with-in-silico-labeling-of12.html'>
利用显微图像的硅片标记查看更多信息
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/protecting-webview-with-safe-browsing.html'>
通过安全浏览保护 WebView
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/Kubernetes-best-practices-mapping-external-services.html'>
Kubernetes 最佳实践&#65306;映射外部服务
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/the-shadow-reader-improved.html'>
Shadow Reader 得到改进
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/google-at-cvpr-2018.html'>
Google 参加 CVPR 2018 大会
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/android-studio-3-2-beta.html'>
[Draft] Android 开发者博客&#65306;Android Studio 3.2 测试版
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/how-can-neural-network-similarity-help.html'>
神经网络相似性如何帮助我们理解训练和泛化&#65311;
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/standardizing-lessons-learned-from-amp.html'>
从 AMP 中学到的标准化经验
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/google-at-icml-2018.html'>
Google 参加 ICML 2018 大会
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/teaching-uncalibrated-robots-to22.html'>
教未校准的机器人实现视觉自适应
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/self-supervised-tracking-via-video.html'>
通过视频着色进行自监督跟踪
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/scalable-deep-reinforcement-learning.html'>
用于机器人操作的可扩展深度强化学习
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/Kubernetes-best-practices-terminating-with-grace.html'>
Kubernetes 最佳实践&#65306;正常终止
</a>
</li>
<li>
<a href='https://googledeveloperschina.blogspot.com/2018/07/contributing-to-the-amp-project.html'>
为 AMP 项目做贡献
</a>
</li>
</ul>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2018/06/'>
六月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2018/05/'>
五月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2018/04/'>
四月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2018/03/'>
三月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2018/02/'>
二月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2018/01/'>
一月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2017/'>
2017
</a>
</div>
<div class='items'>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2017/12/'>
十二月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2017/11/'>
十一月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2017/10/'>
十月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2017/09/'>
九月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2017/08/'>
八月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2017/07/'>
七月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2017/06/'>
六月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2017/05/'>
五月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2017/04/'>
四月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2017/03/'>
三月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2017/02/'>
二月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2017/01/'>
一月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2016/'>
2016
</a>
</div>
<div class='items'>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2016/12/'>
十二月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2016/11/'>
十一月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2014/'>
2014
</a>
</div>
<div class='items'>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2014/10/'>
十月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2012/'>
2012
</a>
</div>
<div class='items'>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2012/06/'>
六月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2012/03/'>
三月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2011/'>
2011
</a>
</div>
<div class='items'>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2011/06/'>
六月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2011/05/'>
五月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2011/02/'>
二月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2011/01/'>
一月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2010/'>
2010
</a>
</div>
<div class='items'>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2010/11/'>
十一月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2010/10/'>
十月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2010/06/'>
六月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2010/04/'>
四月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2010/02/'>
二月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2009/'>
2009
</a>
</div>
<div class='items'>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2009/11/'>
十一月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2009/10/'>
十月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2009/08/'>
八月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2009/07/'>
七月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2009/04/'>
四月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2009/03/'>
三月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2009/02/'>
二月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2009/01/'>
一月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2008/'>
2008
</a>
</div>
<div class='items'>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2008/12/'>
十二月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2008/11/'>
十一月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2008/10/'>
十月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
<ul class='hierarchy'>
<li class='archivedate collapsed'>
<div class='intervalToggle'>
<span class='new-toggle' href='javascript:void(0)'>
<i class='material-icons arrow'>
                    &#58821;
                  </i>
</span>
<a class='toggle' href='javascript:void(0)' style='display: none'>
<span class='zippy'>
<i class='material-icons'>
                        &#58821;
                      </i>
                      &#160;
                    
</span>
</a>
<a class='post-count-link' href='https://googledeveloperschina.blogspot.com/2008/09/'>
九月
</a>
</div>
<div class='items'>
</div>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
</div>
</div><div class='widget HTML' data-version='1' id='HTML6'>
<div class='widget-content'>
<div class="widget-content">
<a href="https://feeds.feedburner.com/GoogleDevelopersChineseLanguageBlog">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAihJREFUeNrsWa9Pw0AU7viRMDFRBAkzJDMIBIhJJhCzk7NILIqMv4AEhdz+BCY3OYssAlGBoAJREpZwAlHEBO8lr8nSvNeVbu1dyX3JlzTrXfa+u/e9d7c5joWFhYVO1Fa8PwH2gK6m+BRwAvSlAdsrgr8E1jUuMH73GTAEzrkBWymTewZlihhLmgDXIAFuHgGVQOUF7OSYM1p6PgTuA1vAZlUEvAnPdapcMY0VICECekQ0XRfYrqoHsAGNgXfAoMomRiFDEhOZkkL3S88hMaB2LwXp0bj+ps2edpToZpjfoIDQtBeU+xjoDzP2G/gCPKZ5f8WsCAFJoJgOCcFdWSTeL9YQMSvTA1h9BkI5jaiXhLpSCL/8mVZY0UpyJ9ZdOkniu1dmJ96BpzQu9w6s28gcOq9j6pwLdR8/36NK5CQKwJSMrb2MhhSglBpt4UjsrdsnNu0B3J0HCozbCc4TjyY2srEgos/4RQljCzNxl4ireQD8FOq+T+W0mTB2g7njhlR+Sy2jsXFvU658U8YTbeaGpdIu7mWkEAq5ZtIjIhFZdtfX7QHckSvB2B6zC3VdAkZk0kAQwaXTk/CzTXK3wjIExCs6ZJpTnE4uY1KV+KzFzA3KTiFPENHJkOPcsfpLhwe4btoSuvUqAR+6TOxlCE6ZfKUsJLgsqGW8OpqAGx2X+sLxrwUog+JUeQRMDBIwyXOcnlPtPnL0/UsT/8LnOxYWFhZG4leAAQAAQHEaYuzHbAAAAABJRU5ErkJggg==" class="sidebar-icon" />
<h2>Feed</h2>
</a>
</div>
</div>
</div></div>
<div class='no-items section' id='sidebar-bottom'></div>
</div>
</div>
<div style='clear:both;'></div>
</div>
<!-- Footer -->
<div class='footer-outer loading'>
<div class='footer-inner'>
<div class='footer-inner-2'>
<div style='width:33%;float:left;'>
<div class='section' id='footer-1'><div class='widget HTML' data-version='1' id='HTML3'>
<h2 class='title'>
全球开发技术资源
</h2>
<div class='widget-content'>
<ul>
<li>
<a href="https://developers.googleblog.com/" title="Google">Google 开发者博客</a>
</li>
<li>
<a href="https://android-developers.googleblog.com/" title="Android">Android 开发者博客</a>
</li>
<li>
<a href="https://firebase.googleblog.com/" title="Firebase">Firebase 博客</a>
</li>
<li>
<a href="https://research.googleblog.com/" title="research">Google Research Blog</a>
</li>

</ul>
</div>
</div></div>
</div>
<div style='width:33%;float:left;'>
<div class='section' id='footer-2'><div class='widget HTML' data-version='1' id='HTML2'>
<h2 class='title'>
中国开发者资源
</h2>
<div class='widget-content'>
<ul>
<li>
<a href="https://developers.google.cn/" title="Google">Google 开发者文档</a>
</li>
<li>
<a href="https://developer.android.google.cn/" title="Android">Android 开发技术文档</a>
</li>
<li>
<a href="https://firebase.google.cn/" title="Firebase">Firebase 开发技术文档</a>
</li>
<li>
<a href="https://tensorflow.google.cn/" title="Google">TensorFlow 技术文档</a>
</li>

</ul>
</div>
</div></div>
</div>
<div style='width:33%;float:left;'>
<div class='no-items section' id='footer-3'></div>
</div>
<div style='clear:both;'></div>
</div>
</div>
</div>
<div class='google-footer-outer loading'>
<div id='google-footer'>
<a href='//www.google.cn/'>
<img class='google-logo-dark' height='36' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAABICAYAAABFoT/eAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAACLVJREFUeNrsXd+L20YQ3vOprdLqiMXFXE2qB7dcwEcTSB7ykIc+9A/PQx/yEMq1TWhNuYIpJriNr7XpmZ5IxFEvmW2EKs3Ornb1w50PxIFP0kiz387OzM6uhGAwGAxGP3Ho+f7x7ri1O7LdccPqZjSNA4dEHsLfaHcEFedJom93x9Xu2OyOFTcBo6sED3fHZHeMEELrkAHJF0B8Rr+gDFsZ5n0luLTQ95AXs4W06D/tjpR50xtM4CjD0y48YGB4rnyZxNOzyA7zBHr+nLnDaJLg0mo/ALekCasg3Z4XbM0ZdTEgnDPeHY8bIne+Qz2GvwyGNwsuyT218KWvIIBMcwGpLiipcolecjMxfBDchNyS1EvxLiOSIecp31q6IJ/C3yrIrMqMm4jhg+AxkdwbIO3aUO4KjqqMjCT3uaazMBhWBJfuxH3CtRfiXf66DhSRZWbmlMnNaILgZxrXJQO/eO3wORZwvwm4JUxuhheCjzVBYAbW1ces45YDSoZrFNOEE835M8FT6oyeEnws8Fz3QnBxFKPHBMem4GU+m6fPGb0leCTwWcM5B36MPgeZI01gudyDdw3hPeXfo8L/rmCUWnuMMdqUL2WqWeRbhf+twfVsO7YagZGNC79fw7OthEVtkiJ4jJzTd3KPwf3CRqhhiTu23AP5sl0/0xiwISQXpNwLIJK87mHF+U8ddzzdmgKlGzlPYjyxGJQouIhNT4k9AqWEFkqfguIvagTWbcq3KW1WE3xS3m8NtA9WS451xofwjKT5kkDoK/b6mDk5FfXr1lWDL4BofZEv2/SRsK/EHGlGdBdu8QNRb8HMCFwt7Yy3DDI/QP7fx5z3VLhdlJEIs4rKNuXXJXdxZPdB7kfCzWqwCO4V1LHgLjInX3tQ1KzCR52Cz+vDj1dydeRuS74rcvs2Pi6fT5H8OaaUQPQPYcWwRSGXyhhscn5dpAnEFMkuEZetbfkTAnlSuH4DxisE+aMGeJAQ3lFl7C4LJE6QWCaCd583ORQ1jYAwjFctal7nOs2ZZvicwvlZx+RHGrcoAwKUVX8uwcc/9TT65INeDOr5shL9LDRB6QTeIy3zwfdh3WOi6axLCEhSjXU7F3h6LqggUtvyJxpynwu8tDkD98fXApOxRj8zoZ9MnGveYVIVZKaGrkBXCY65BCYNN9NkjpKOyQ81Q79JgdxS+Jn3SDTEXRI7SWzaiSTB32oI3nU3BvMfM0urhOVYgwKhuiAfc4tM07wXwm1ZRoQYSl2NUwiu01fEAHVcpixd745FvVz4dzUUc0o8rwoLy8ZSwU6CyFx1RP5II9+1bFPEFs9HWbNLiimDXE+vCm7u1CS47cofzD3aEhVY57mxRo5zlqdt+RFC1JUH2S7bcVXg4liTMakaBZZVxiTICRoivcn1sEUBlk24JmaC6kxUbYmWoqvyfck2xZGGnDFYa9MMzkYQ1ijkCX6qidybrgePiQ0QIQqoi6qRLeqQfIoRsEHaQJLBdHOnLGetSdm/IPcymJuS1PAnbQPH0MOw/39C1vL11DiLOqIsbDI8QcHvGiLnySi2qUXBicaqUSxN5LEB0g7Jt3ENXJLPJ5S1tnaZBoWbpRqrmjRE7qHmpSmNHdQcYrEUadoh+TbBnc9ri7iycI1kzPeNcLDIvbiqXpez9Tmdq6zGREPuzECBoxrPMiI2WtvyNwhJba2wy3JZ6ky5dD1lSvmZS3e4SPA1wcf1VTFHKX+cGwZzdUYcqpvUtvwrD/InDttVlyZeAKlNN5MKbAiurHhKIPlUuJvlTCCiDjSKSCsUmCFWbGLZwCESfK07JB8LvMYWVtw0D00JEHV8Mq2HkqPbE0oHLvvK2g0o8ETg+4cfwTlZDT9JDoWygu4uQQE/ivIvtcnfPkaCqhiupz7jWOAzqL/vjtcdkv9G4MVMt+EaylfuImiPAXEUjRF3pjjaHiPPZ6If9TGGAO4ZY0am6jOCb+DQ+ZCqLkIpOIPrdNfIjnFPY6nyFut7TS/fanrziOBOKMupKw94WaLMtuVnSFt9CPrWWdJE6PeltCX432DEBoh+5Dv8RRhdis8YAv9uyq4/JAwtlEApgBe9Cw9xDD3tdk4Jn0MDfiHwPHcRPxBePCMER3GuIx7kGlv9fkZ4V9lolx2Uv4X7hEj7qJ3LDoAMGbTRMRibu4L2xQ8bgt8AyU+Q+x7nYrvDnH4iuO5LxKsYwPVbkPMvKF9Zky9wXzRfVWizi62r9X5VHf55h+WHhDjGBZ4WRhyTr6z5SlCoLMxLSpBZFsQ9F80uQFbF/6aFWi+Ev51vzzsuX+msyzuQXXjUz8zEBy+zpq9yweXAoxJW4JbYrDS6gYDqGHxPl+TKeiBfxj9/EBIElPYeOA4y8/qRQfknjvSzgRgtq0Pw/M1eQeMdOSb2Bnrhr6Led+1vcp2x7oTFHMnedFW+Ivlty062BUt74oHgSj+vHepnhunn0JJAMtBZgDI/qmGtMujRv8DDpo47zBJ8UtPOuAR/7rKn8t9AJ0tBdmBAmJ/Fu71yxp4I3qh+DhyRqbi5Y1ShVPlSb8X7bRNcfgZFl+WRGYo7uecrWq1r8X5bhmzP5OdlDwsGRm1suSxkg5rYm7ConyGQ3Zl+DgSD8V/kPwrWBMG9YcBtyShBnTLdTiHgttw7qAW7cqh/ZnmPKr/6ignOaKsdyxbsToT5UkPsW00bJjijDXficcX/JsLs6w2BwGtherdckH3w/kNXRPVI0OqJQoHX42/66IMfMj/2huRjxIidgKV/W0JS+bsstDoTeAHcrI8E5zTh/sDkqxL5rZup55/3USlswfcHf4IrQplVDgW9XFlOqnwr6pVPMMEZTuC60EttvdzbLbaZ4PsFVa3nohhO+vW+yn/ZB2fUhpysmQrzBcTSai9EszuZMcEZ1lCFVrp9zGXhm69iLyY4oxFIa178lPe12I/P2DAYDAaDwWAwGAwGg8FgMBgMBoPBYDD2Cf8IMADDRGoQTe+E9AAAAABJRU5ErkJggg==' style='margin-top: -16px;' width='92'/>
</a>
<ul>
<li>
<a href='//www.google.cn/'>
              Google
            </a>
</li>
<li>
<a href='//www.google.cn/policies/privacy/'>
              Privacy
            </a>
</li>
<li>
<a href='//www.google.cn/policies/terms/'>
              Terms
            </a>
</li>
</ul>
</div>
</div>
<script type='text/javascript'>
      //<![CDATA[
      var BreakpointHandler = function() {
        this.initted = false;
        this.isHomePage = false;
        this.isMobile = false;
      };
      BreakpointHandler.prototype.finalizeSummary = function(summaryHtml, lastNode) {
        // Use $.trim for IE8 compatibility
        summaryHtml = $.trim(summaryHtml).replace(/(<br>|\s)+$/,'');
        if (lastNode.nodeType == 3) {
          var lastChar = summaryHtml.slice(-1);
          if (!lastChar.match(/[.”"?]/)) {
            if (!lastChar.match(/[A-Za-z]/)) {
              summaryHtml = summaryHtml.slice(0, -1);
            }
            summaryHtml += ' ...';
          }
        } else if (lastNode.nodeType == 1 && (lastNode.nodeName == 'I' || lastNode.nodeName == 'A')) {
          summaryHtml += ' ...';
        }
        return summaryHtml;
      };
      BreakpointHandler.prototype.generateSummaryFromContent = function(content, numWords) {
        var seenWords = 0;
        var summaryHtml = '';
        for (var i=0; i < content.childNodes.length; i++) {
          var node = content.childNodes[i];
          var nodeText;
          if (node.nodeType == 1) {
            if (node.hasAttribute('data-about-pullquote')) {
              continue;
            }
            nodeText = node.textContent;
            if (nodeText === undefined) {
              // innerText for IE8
              nodeText = node.innerText;
            }
            if (node.nodeName == 'DIV' || node.nodeName == 'B') {
              // Don't end early if we haven't seen enough words.
              if (seenWords < 10) {
                continue;
              }
              if (i > 0) {
                summaryHtml = this.finalizeSummary(summaryHtml, content.childNodes[i-1]);
              }
              break;
            }
            summaryHtml += node.outerHTML;
          } else if (node.nodeType == 3) {
            nodeText = node.nodeValue;
            summaryHtml += nodeText + ' ';
          }
          var words = nodeText.match(/\S+\s*/g);
          if (!words) {
            continue;
          }
          var remain = numWords - seenWords;
          if (words.length >= remain) {
            summaryHtml = this.finalizeSummary(summaryHtml, node);
            break;
          }
          seenWords += words.length;
        }
        return summaryHtml;
      };
      BreakpointHandler.prototype.detect = function() {
        var match,
            pl     = /\+/g,
            search = /([^&=]+)=?([^&]*)/g,
            decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
            query  = window.location.search.substring(1);
        var urlParams = {};
        while (match = search.exec(query))
          urlParams[decode(match[1])] = decode(match[2]);
        this.isListPage = $('html').hasClass('list-page');
        this.isMobile = urlParams['m'] === '1';
        this.isHomePage = window.location.pathname == '/';
      };
      BreakpointHandler.prototype.initContent = function() {
        var self = this;
        $('.post').each(function(index) {
          var body = $(this).children('.post-body')[0];
          var content = $(body).children('.post-content')[0];
          $(content).addClass('post-original');
          var data = $(content).children('script').html();
          data = self.rewriteForSSL(data);
          // If exists, extract specified editor's preview.
          var match = data.match(/([\s\S]+?)<div data-is-preview.+?>([\s\S]+)<\/div>/m);
          if (match) {
            data = match[1];
          }
          // Prevent big images from loading when they aren't needed.
          // This must be done as a pre-injection step, since image loading can't be
          // canceled once embedded into the DOM.
          if (self.isListPage && self.isMobile) {
            data = data.replace(/<(img|iframe) .+?>/g, '');
          }
          // Insert template to be rendered as nodes.
          content.innerHTML = data;
          if (self.isListPage) {
            var summary = document.createElement('div');
            $(summary).addClass('post-content');
            $(summary).addClass('post-summary');
            body.insertBefore(summary, content);
            if (match) {
              // Use provided summary.
              summary.innerHTML = match[2];
            } else {
              // Generate a summary.
              // Summary generation relies on DOM, so it must occur after content is
              // inserted into the page.
              summary.innerHTML = self.generateSummaryFromContent(content, 30);
            }
            // Add read more link to summary.
            var titleAnchor = $(this).find('.title a')[0];
            var link = titleAnchor.cloneNode(true);
            link.innerHTML = 'Read More';
            $(link).addClass('read-more');
            summary.appendChild(link);
          }
        });
        // Firefox does not allow for proper styling of BR.
        if (navigator.userAgent.indexOf('Firefox') > -1) {
          $('.post-content br').replaceWith('<span class="space"></span>');
        }
        $('.loading').removeClass('loading');
      };
      BreakpointHandler.prototype.process = function() {
        if (!this.initted) {
          var makeInsecureImageRegex = function(hosts) {
            var whitelist = hosts.join('|').replace(/\./g,'\\.');
            // Normal image tags, plus input images (yes, this is possible!)
            return new RegExp('(<(img|input)[^>]+?src=("|\'))http:\/\/(' + whitelist +')', 'g');
          };
          this.sslImageRegex = makeInsecureImageRegex(BreakpointHandler.KNOWN_HTTPS_HOSTS);
          this.sslImageCurrentDomainRegex = makeInsecureImageRegex([window.location.hostname]);
          this.detect();
          this.initContent();
          this.initted = true;
        }
      };
      BreakpointHandler.KNOWN_HTTPS_HOSTS = [
         "www.google.com"
      ];
        BreakpointHandler.prototype.rewriteForSSL = function(html) {
        // Handle HTTP -> HTTPS source replacement of images, movies, and other embedded content.
        return html.replace(this.sslImageRegex, '$1https://$4')
        .replace(this.sslImageCurrentDomainRegex, '$1//$4')
        .replace(/(<(embed|iframe)[^>]+?src=("|'))http:\/\/([^"']*?(youtube|picasaweb\.google)\.com)/g, '$1https://$4')
        // Slideshow SWF takes a image host, so we need to rewrite that parameter.
        .replace(/(<embed[^>]+?feed=http(?=[^s]))/g, '$1s');
        };
        $(document).ready(function() {
        var handler = new BreakpointHandler();
        handler.process();

function DeviceMotionSender(){if(!this.isIOS_()){return}window.addEventListener("devicemotion",this.onDeviceMotion_.bind(this),false);this.iframes=document.querySelectorAll("iframe.vrview")}DeviceMotionSender.prototype.onDeviceMotion_=function(e){var message={type:"DeviceMotion",deviceMotionEvent:this.cloneDeviceMotionEvent_(e)};for(var i=0;i<this.iframes.length;i++){var iframe=this.iframes[i];var iframeWindow=iframe.contentWindow;if(this.isCrossDomainIframe_(iframe)){iframeWindow.postMessage(message,"*")}}};DeviceMotionSender.prototype.cloneDeviceMotionEvent_=function(e){return{acceleration:{x:e.acceleration.x,y:e.acceleration.y,z:e.acceleration.z},accelerationIncludingGravity:{x:e.accelerationIncludingGravity.x,y:e.accelerationIncludingGravity.y,z:e.accelerationIncludingGravity.z},rotationRate:{alpha:e.rotationRate.alpha,beta:e.rotationRate.beta,gamma:e.rotationRate.gamma},interval:e.interval}};DeviceMotionSender.prototype.isIOS_=function(){return/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream};DeviceMotionSender.prototype.isCrossDomainIframe_=function(iframe){var html=null;try{var doc=iframe.contentDocument||iframe.contentWindow.document;html=doc.body.innerHTML}catch(err){}return html===null};var dms=new DeviceMotionSender;


        // Top-level navigation.
        $(".BlogArchive .tab").click(function(ev) {
        ev.preventDefault();
        $(this).parent().toggleClass('active');
        $(this).siblings().slideToggle(300);
        });
        $(".Label .tab").click(function(ev) {
        ev.preventDefault();
        $(this).parent().toggleClass('active');
        $(this).siblings().slideToggle(300);
        });
        // Blog archive year expansion.
        $('.BlogArchive .intervalToggle').click(function(ev) {
        ev.preventDefault();
        if ($(this).parent().hasClass('collapsed')) {
        $(this).parent().removeClass('collapsed');
        $(this).parent().addClass('expanded');
        } else {
        $(this).parent().removeClass('expanded');
        $(this).parent().addClass('collapsed');
        }
        });
        // Reverse order of months.
        $('.BlogArchive .intervalToggle + div').each(function(_, items) {
        var year = $(this);
        year.children().each(function(_, month) {
        year.prepend(month);
        });
        });
        // Set anchors to open in new tab.
        $('.post-content img').parent().each(function(_, node) {
        if (node.nodeName == 'A') {
        $(this).attr('target', '_blank');
        }
        });
        // Process search requests.
        $('.searchBox input').on("keypress", function(ev) {
        if (ev.which == 13) {
        window.location.href = 'https://www.google.com/search?q=site%3A' + window.location.hostname + '%20' + encodeURIComponent ($(this).val());
        }
        });
        });
        //]]>
    </script>

<script type="text/javascript" src="https://www.blogger.com/static/v1/widgets/2230271354-widgets.js"></script>
<script type='text/javascript'>
window['__wavt'] = 'AOuZoY5jyT2MAeMEUHfs0HUREw_3md6z9w:1542538222566';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d2676409160252236148','//googledeveloperschina.blogspot.com/','2676409160252236148');
_WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '2676409160252236148', 'title': '谷歌开发者中文博客', 'url': 'https://googledeveloperschina.blogspot.com/', 'canonicalUrl': 'https://googledeveloperschina.blogspot.com/', 'homepageUrl': 'https://googledeveloperschina.blogspot.com/', 'searchUrl': 'https://googledeveloperschina.blogspot.com/search', 'canonicalHomepageUrl': 'https://googledeveloperschina.blogspot.com/', 'blogspotFaviconUrl': 'https://googledeveloperschina.blogspot.com/favicon.ico', 'bloggerUrl': 'https://www.blogger.com', 'hasCustomDomain': false, 'httpsEnabled': true, 'enabledCommentProfileImages': true, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': 'UA-89524466-1', 'encoding': 'UTF-8', 'locale': 'zh-HK', 'localeUnderscoreDelimited': 'zh_hk', 'languageDirection': 'ltr', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22谷歌开发者中文博客 - Atom\x22 href\x3d\x22https://googledeveloperschina.blogspot.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22谷歌开发者中文博客 - RSS\x22 href\x3d\x22https://googledeveloperschina.blogspot.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22谷歌开发者中文博客 - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/2676409160252236148/posts/default\x22 /\x3e\n', 'meTag': '', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'adsenseHasAds': false, 'ieCssRetrofitLinks': '\x3c!--[if IE]\x3e\x3cscript type\x3d\x22text/javascript\x22 src\x3d\x22https://www.blogger.com/static/v1/jsbin/864213505-ieretrofit.js\x22\x3e\x3c/script\x3e\n\x3c![endif]--\x3e', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/7029a33aa64c9f7c', 'plusOneApiSrc': 'https://apis.google.com/js/plusone.js', 'sharing': {'platforms': [{'name': '取得連結', 'key': 'link', 'shareMessage': '取得連結', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': '分享到 Facebook', 'target': 'facebook'}, {'name': 'BlogThis&#65281;', 'key': 'blogThis', 'shareMessage': 'BlogThis&#65281;', 'target': 'blog'}, {'name': 'Twitter', 'key': 'twitter', 'shareMessage': '分享到 Twitter', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': '分享到 Pinterest', 'target': 'pinterest'}, {'name': 'Google+', 'key': 'googlePlus', 'shareMessage': '分享到 Google+', 'target': 'googleplus'}, {'name': '電子郵件', 'key': 'email', 'shareMessage': '電子郵件', 'target': 'email'}], 'googlePlusShareButtonWidth': 300, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27zh_HK\x27};\x3c/script\x3e'}, 'hasCustomJumpLinkMessage': true, 'jumpLinkMessage': '阅读更多', 'pageType': 'index', 'pageName': '', 'pageTitle': '谷歌开发者中文博客'}}, {'name': 'features', 'data': {'sharing_get_link_dialog': 'true', 'sharing_native': 'false'}}, {'name': 'messages', 'data': {'edit': '編輯', 'linkCopiedToClipboard': '連結已複製到剪貼簿&#65281;', 'ok': '確定', 'postLink': '文章連結'}}, {'name': 'template', 'data': {'name': 'custom', 'localizedName': '自訂', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': true}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': '谷歌开发者中文博客', 'description': '', 'url': 'https://googledeveloperschina.blogspot.com/', 'type': 'feed', 'isSingleItem': false, 'isMultipleItems': true, 'isError': false, 'isPage': false, 'isPost': false, 'isHomepage': true, 'isArchive': false, 'isLabelSearch': false}}]);
_WidgetManager._RegisterWidget('_HeaderView', new _WidgetInfo('Header1', 'header', document.getElementById('Header1'), {}, 'displayModeFull'));
_WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', document.getElementById('Blog1'), {'cmtInteractionsEnabled': false, 'useNgc': false, 'lightboxEnabled': true, 'lightboxModuleUrl': 'https://www.blogger.com/static/v1/jsbin/4107244033-lbx__zh_hk.js', 'lightboxCssUrl': 'https://www.blogger.com/static/v1/v-css/368954415-lightbox_bundle.css'}, 'displayModeFull'));
_WidgetManager._RegisterWidget('_LabelView', new _WidgetInfo('Label1', 'sidebar', document.getElementById('Label1'), {}, 'displayModeFull'));
_WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar', document.getElementById('BlogArchive1'), {'languageDirection': 'ltr', 'loadingMessage': '正在載入&#8230;'}, 'displayModeFull'));
_WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML6', 'sidebar', document.getElementById('HTML6'), {}, 'displayModeFull'));
_WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML3', 'footer-1', document.getElementById('HTML3'), {}, 'displayModeFull'));
_WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML2', 'footer-2', document.getElementById('HTML2'), {}, 'displayModeFull'));
</script>
</body>
</html>