<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AI</title>
	<atom:link href="https://ascend-beyond.com/tag/ai/feed/" rel="self" type="application/rss+xml" />
	<link>https://ascend-beyond.com</link>
	<description></description>
	<lastBuildDate>Sat, 04 May 2024 04:33:40 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://ascend-beyond.com/wp-content/uploads/2024/03/cropped-9376b452e9b0c7a8bdf82cd2e63920ee-32x32.jpg</url>
	<title>AI</title>
	<link>https://ascend-beyond.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href=""/>	<item>
		<title>【新感覚Study】JDBCをマスターしよう！【Java初心者】</title>
		<link>https://ascend-beyond.com/study/2676/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Fri, 03 May 2024 08:59:02 +0000</pubDate>
				<category><![CDATA[Study]]></category>
		<category><![CDATA[応用情報技術者]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[独学]]></category>
		<category><![CDATA[資格]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=2676</guid>

					<description><![CDATA[目次 はじめにQ.JDBCってなに？A. JDBCとは、JavaのAPIQ. APIってなに？A. APIとはインタフェースのことQ.ドライバってなに？A.ドライバとはコンパイラの様なものQ. JDBCにおけるDAOって [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a><ol><li><a href="#toc2" tabindex="0">Q.JDBCってなに？</a><ol><li><a href="#toc3" tabindex="0">A. JDBCとは、JavaのAPI</a></li><li><a href="#toc4" tabindex="0">Q. APIってなに？</a></li><li><a href="#toc5" tabindex="0">A. APIとはインタフェースのこと</a></li><li><a href="#toc6" tabindex="0">Q.ドライバってなに？</a></li><li><a href="#toc7" tabindex="0">A.ドライバとはコンパイラの様なもの</a></li><li><a href="#toc8" tabindex="0">Q. JDBCにおけるDAOってなに？</a></li><li><a href="#toc9" tabindex="0">A. DAOっていうのはアクセサメソッドの様なもの</a></li><li><a href="#toc10" tabindex="0">Q. JDBCにおけるDTOってなに？</a></li><li><a href="#toc11" tabindex="0">A.DTOとはデータに一貫性を持たせるもの</a></li><li><a href="#toc12" tabindex="0">Q.DAOとDTOの違いって何？</a></li><li><a href="#toc13" tabindex="0">A.DAOとDTOは、カプセル化する対象が違う！</a></li></ol></li><li><a href="#toc14" tabindex="0">JDBCのまとめ</a></li></ol></li><li><a href="#toc15" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">はじめに</span></h2>



<p>今回はJavaの入門編としてJDBCについてマスターしていきます！JDBCを聞いたことが無い人や、聴いたことあるけど、なんか面倒くさそうだから飛ばちゃった。そんな人のためにこのページは書かれています。</p>



<p>ぜひ、JDBCを簡単にマスターしてプログラマーとして一歩先に行きましょう！</p>



<p><strong><span class="fz-22px"><span class="marker-red">【ここで取り扱う・解決するSMTPへの疑問点】</span></span></strong></p>



<ol class="wp-block-list">
<li><a href="https://ascend-beyond.com/study/2676/#toc2">Q.JDBCってなに？</a></li>



<li><a href="https://ascend-beyond.com/study/2676/#toc4">Q. APIってなに？</a></li>



<li><a href="https://ascend-beyond.com/study/2676/#toc6">Q.ドライバってなに？</a></li>



<li><a href="https://ascend-beyond.com/study/2676/#toc8">Q. JDBCにおけるDAOってなに？</a></li>



<li><a href="https://ascend-beyond.com/study/2676/#toc10">Q. JDBCにおけるDTOってなに？</a></li>



<li><a href="https://ascend-beyond.com/study/2676/#toc12">Q.DAOとDTOの違いって何？</a></li>
</ol>



<h3 class="wp-block-heading"><span id="toc2">Q.JDBCってなに？</span></h3>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-1024x576.jpg" alt="クエスチョン" class="wp-image-2562" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>では、そもそも<strong><mark style="background-color:#fff7cc" class="has-inline-color">JDBC</mark></strong>って何なの？というところから紐解いていきましょう！</p>



<h4 class="wp-block-heading"><span id="toc3">A. JDBCとは、JavaのAPI</span></h4>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-1024x576.jpg" alt="Answer" class="wp-image-2563" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong><mark style="background-color:#fff7cc" class="has-inline-color"><strong><mark style="background-color:#fff7cc" class="has-inline-color">JDBC</mark></strong></mark></strong>（Java Database Connectivity）は、Javaプログラミング言語用の<span class="red">API</span>（Application Programming Interface）です。このAPIを使用すると、Javaアプリケーションからデータベースにアクセスできます。<strong><mark style="background-color:#fff7cc" class="has-inline-color"><strong><mark style="background-color:#fff7cc" class="has-inline-color">JDBC</mark></strong></mark></strong>を使用することで、異なるデータベースに対しても同じJavaコードを使ってアクセスすることができます。</p>



<p><strong><mark style="background-color:#fff7cc" class="has-inline-color"><strong><mark style="background-color:#fff7cc" class="has-inline-color">JDBC</mark></strong></mark></strong>を使用すると、以下のような手順でデータベースにアクセスできます：</p>



<ol class="wp-block-list">
<li>データベースに接続するための<span class="red">ドライバ</span>をロードします。</li>



<li>データベースへの接続を確立します。</li>



<li>SQLクエリを実行してデータベースに対して操作を行います。</li>



<li>必要に応じてトランザクションを管理します。</li>



<li>データベースとの接続を閉じます。</li>
</ol>



<p>以上が<strong><mark style="background-color:#fff7cc" class="has-inline-color"><strong><mark style="background-color:#fff7cc" class="has-inline-color">JDBC</mark></strong></mark></strong>の軽い、説明です。</p>



<div style="border: 5px double #91D8AC; padding: 10px; border-radius: 10px; background: ;">p.s.要するにJDBCとは、Javaアプリケーションからデータベースにアクセスできるよっていうツールです。具体的には、データベースとの接続を確立してくれて、SQLクエリを実行してデータの取得・更新・削除などが行えるようになるよっていう優れもの。</div>



<h4 class="wp-block-heading"><span id="toc4">Q. APIってなに？</span></h4>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-1024x576.jpg" alt="クエスチョン" class="wp-image-2562" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>先ほど<strong><mark style="background-color:#fff7cc" class="has-inline-color"><strong><mark style="background-color:#fff7cc" class="has-inline-color">JDBC</mark></strong></mark></strong>はAPIだと説明しました。でも、そもそもAPIって何？ってなりますよね？だし、ITを勉強していると、けっこーな頻度でAPIって耳にすると思います。ということで、今日の内にAPIとはなんなのかをしっかりと理解しておきましょう！</p>



<!-- START MoshimoAffiliateEasyLink -->
<script type="text/javascript">
(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;
b[a]=b[a]||function(){arguments.currentScript=c.currentScript
||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};
c.getElementById(a)||(d=c.createElement(f),d.src=g,
d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})
(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");
msmaflink({"n":"スッキリわかるJava入門 第4版 （スッキリわかる入門シリーズ） [ 中山 清喬 ]","b":"","t":"","d":"https:\/\/thumbnail.image.rakuten.co.jp","c_p":"\/@0_mall\/book\/cabinet\/7936","p":["\/9784295017936_1_3.jpg","\/9784295017936_2.jpg","\/9784295017936_3.jpg"],"u":{"u":"https:\/\/item.rakuten.co.jp\/book\/17608672\/","t":"rakuten","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/item.rakuten.co.jp\/book\/17608672\/","a_id":4440988,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":1},{"id":2,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/s\/ref=nb_sb_noss_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A\u0026url=search-alias%3Daps\u0026field-keywords=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80%20%E7%AC%AC4%E7%89%88%20%EF%BC%88%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B%E5%85%A5%E9%96%80%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%89%20%5B%20%E4%B8%AD%E5%B1%B1%20%E6%B8%85%E5%96%AC%20%5D","a_id":4440991,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":2}],"eid":"NhpzU","s":"s"});
</script>
<div id="msmaflink-NhpzU">リンク</div>
<!-- MoshimoAffiliateEasyLink END -->



<h4 class="wp-block-heading"><span id="toc5">A. APIとはインタフェースのこと</span></h4>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-1024x576.jpg" alt="Answer" class="wp-image-2563" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>そもそも、<span class="red">API</span>とはApplication Programming <strong>Interface</strong>の略です。つまり、文字通りインタフェースを意味します。</p>



<p><span class="red">API</span>（Application Programming Interface）は、プログラムやソフトウェアの機能やデータにアクセスするための<span class="marker-under-red">インターフェース</span>です。つまり、他のプログラムがあるプログラムやサービスを使う際に、そのプログラムやサービスが提供する機能やデータにアクセスするための取っ掛けや手段です。<br><br>要するに<span class="red">API</span>は、開発者が他のプログラムやサービスと連携するための<span class="marker-under-red">架け橋（インタフェース）</span>のような役割です。</p>



<h4 class="wp-block-heading"><span id="toc6">Q.ドライバってなに？</span></h4>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-1024x576.jpg" alt="クエスチョン" class="wp-image-2562" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>では、今度はドライバについてみていきましょう！これもちょくちょく耳にする言葉ですよね？先ほどの解説でも「データベースに接続するための<span class="red">ドライバ</span>をロードします。」という文章がありました。ということで、次はドライバって何なの？っていうことを紐解いていきましょう！</p>



<h4 class="wp-block-heading"><span id="toc7">A.ドライバとはコンパイラの様なもの</span></h4>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-1024x576.jpg" alt="Answer" class="wp-image-2563" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><span class="red">ドライバ</span>は、コンピュータシステム内で特定のハードウェアやソフトウェアを制御するためのプログラムやモジュールです。一般的には、ハードウェアやソフトウェアが提供する機能や<span class="marker-under-red">インターフェースにアクセスするためのインターフェース</span>を提供します。</p>



<p><strong><span class="fz-22px">【JDBCでの具体例】</span></strong><br><strong><mark style="background-color:#fff7cc" class="has-inline-color">JDBC</mark></strong>ドライバはJavaプログラムがデータベースと通信するための手段を提供します。これにより、Javaプログラムがデータベースに接続し、クエリを実行し、データを取得することができます。ドライバは、データベースの特定の種類やバージョンに対応するように設計されています。</p>



<p><strong><span class="fz-22px">【もっと簡単に言うと..】</span></strong><br>Javaのアプリケーションはデータベースと直接通信はできません。でも、そんな時に仲介役となれるのが<span class="red">ドライバ</span>です。イメージとしてはコンパイラを想像してください。</p>



<p>プログラミング言語とコンピュータでは直接やり取りできないけど、そこにコンパイラをはさむことで、プログラミング言語を機械語に翻訳して、それをコンピュータに実行させることができる。まぁざっとこんなイメージで十分でしょう！</p>



<div>
    <div style="height: 24px; margin-top: 5px;"><span style="background: #91D8AC; padding: 6px 10px; border-radius: 5px; color: #ffffff; font-weight: bold; margin-left: 10px; font-size: 18px;">JDBCとドライバの違い</span></div>
    <div style="padding: 30px 15px 10px; border-radius: 5px; border: 2px solid #91D8AC;">
        <p><span style="font-size: 16px;">JDBCもドライバも仲介役という意味では一緒です。<br>でも、JDBCは概念的な枠組みやAPIを指しています。そして、ドライバー概念的なものではなく、しっかりと目に見えるもので、実際にデータベースに接続し、JDBCの機能を実現するための具体的な実装を表しています。<br><br>要するに、概念的な枠組みがJDBC。具体的な実装がドラバ。以上の様な解釈で進めていきましょう！</span></p>
    </div>
</div>



<h4 class="wp-block-heading"><span id="toc8">Q. JDBCにおけるDAOってなに？</span></h4>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-1024x576.jpg" alt="クエスチョン" class="wp-image-2562" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong><mark style="background-color:#fff7cc" class="has-inline-color">JDBC</mark></strong>を勉強していると必ずと言っていいほど、<span class="red">DAO</span>と<span class="red">DTO</span>という単語を目にします。しかし、案外複雑な概念なので、挫折しちゃう人もいます。ということで、ここではDAOについてパッと理解していきましょう！</p>



<p>p.s.DTOはDAOの次に扱うので待っててください。</p>



<h4 class="wp-block-heading"><span id="toc9">A. DAOっていうのはアクセサメソッドの様なもの</span></h4>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-1024x576.jpg" alt="Answer" class="wp-image-2563" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><span class="red">DAO</span>（Data Access Object）は、データベースとのやり取りを<span class="marker-under-red">抽象化</span>し、データベースへのアクセスを管理するためのパターンまたは設計アプローチです。</p>



<p>簡単に言うと、DAOはデータベースにアクセスするための窓口のようなものです。プログラム内でデータベースにアクセスする際に、そのアクセスを一元化し、簡単に管理できるようにするための仕組みです。</p>



<p><strong><span class="fz-22px">【抽象化のメリット】</span></strong></p>



<ul class="wp-block-list">
<li>アプリケーションとデータベースとの間に制御された空間を設けることができる</li>



<li>同じようなパターン化された処理をまとめられる（柔軟性と保守性）</li>
</ul>



<p><strong><span class="fz-22px">【もっとわかりやすく言うと&#8230;】</span></strong><br>イメージとしてはGetterメソッドやSetterメソッドなどのアクセサメソッドを頭に描いてください。アクセサメソッドは直接的にフィールドを操作できないようにするための窓口の様なものですよね？それと考え方は同じです。つまり、DAOとは直接データベースを操作できないようにするために、作られたメソッドだよ！ということです。</p>



<!-- START MoshimoAffiliateEasyLink -->
<script type="text/javascript">
(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;
b[a]=b[a]||function(){arguments.currentScript=c.currentScript
||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};
c.getElementById(a)||(d=c.createElement(f),d.src=g,
d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})
(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");
msmaflink({"n":"徹底攻略Java SE Bronze問題集［1Z0-818］対応 [ 志賀澄人 ]","b":"","t":"","d":"https:\/\/thumbnail.image.rakuten.co.jp","c_p":"","p":["\/@0_mall\/book\/cabinet\/8958\/9784295008958.jpg"],"u":{"u":"https:\/\/item.rakuten.co.jp\/book\/16365496\/","t":"rakuten","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/item.rakuten.co.jp\/book\/16365496\/","a_id":4440988,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":1},{"id":2,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/s\/ref=nb_sb_noss_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A\u0026url=search-alias%3Daps\u0026field-keywords=%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java%20SE%20Bronze%E5%95%8F%E9%A1%8C%E9%9B%86%EF%BC%BB1Z0-818%EF%BC%BD%E5%AF%BE%E5%BF%9C%20%5B%20%E5%BF%97%E8%B3%80%E6%BE%84%E4%BA%BA%20%5D","a_id":4440991,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":2}],"eid":"sgkdk","s":"s"});
</script>
<div id="msmaflink-sgkdk">リンク</div>
<!-- MoshimoAffiliateEasyLink END -->



<h4 class="wp-block-heading"><span id="toc10">Q. JDBCにおけるDTOってなに？</span></h4>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-1024x576.jpg" alt="クエスチョン" class="wp-image-2562" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>お待たせしました。最後に、DTOを紐解いていきましょう！DTOは、よくDAOとセットで学習する内容です。それを今から見ていきましょう！</p>



<h4 class="wp-block-heading"><span id="toc11">A.DTOとはデータに一貫性を持たせるもの</span></h4>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-1024x576.jpg" alt="Answer" class="wp-image-2563" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><span class="red">DTO</span>（Data Transfer Object）はデータのかたまりみたいなもので、ある場所から別の場所にデータを渡す際に使います。</p>



<p><strong><span class="fz-22px">【DTOのメリット】</span></strong></p>



<ol class="wp-block-list">
<li><strong>データの整理と統一</strong>: DTOを使用することで、異なるレイヤーやコンポーネント間でデータを<span class="marker-under-red">一貫した形式でやり取りすることができます</span>。これにより、データの整理と統一が実現され、コードの可読性と保守性が向上します。</li>



<li><strong>データの軽量化</strong>: DTOを使うことで、必要なデータのみを含むオブジェクトを作成することができます。これにより、<span class="marker-under-red">不要なデータの転送や処理を削減</span>し、パフォーマンスを向上させることができます。</li>



<li><strong>レイヤー間の疎結合</strong>: DTOを使用することで、異なるレイヤー間でデータをやり取りする際に、それぞれのレイヤーが独立して変更されることが可能になります。つまり、あるレイヤーでの変更が他のレイヤーに影響を与えないようになり、システム全体の保守性と拡張性が向上します。</li>
</ol>



<p>メリットだけではまだ、イメージできませんよね？ということで、次は逆にDTOを使わないとどうなってしまうのかを見ていきましょう！</p>



<p><strong><span class="fz-22px">【DTOを使わないと&#8230;..】</span></strong></p>



<ol class="wp-block-list">
<li><strong>データの不整合</strong>: レイヤーやコンポーネント間で直接データをやり取りする場合、データの形式や内容が一貫していないと、予期しないエラーが発生する可能性があります。</li>



<li><strong>冗長なデータの転送</strong>: 必要のないデータが含まれている場合、不要なデータの転送や処理が発生し、パフォーマンスが低下する可能性があります。</li>



<li><strong>依存性の増加</strong>: レイヤーやコンポーネントが直接的にデータを共有すると、それらの間で強い依存関係が生じる可能性があります。これにより、変更が難しくなり、システム全体の保守性が低下します。</li>
</ol>



<p>以上の様な問題を解決するためにDTOがあります。</p>



<p><strong><span class="fz-22px">【まとめ】</span></strong><br><span class="red">DTO</span>は通常、データを保持するフィールド（属性）のみを持ち、そのデータをアクセスするためのゲッター（getter）やセッター（setter）メソッドを含むことがありますが、その<span class="marker-under-red">目的はデータの取得や設定</span>にあります。つまり、DTOはデータの形式を管理するためのものであるということです。</p>



<div style="border: 5px double #91D8AC; padding: 10px; border-radius: 10px; background: ;">要するに、DTOってのは、<font color="red">データの形式に一貫性を持たせたもの</font>
を意味します。<br>形式に一貫性があれば受け渡しなどがスムーズに行えたりするなどの多くのメリットがあります。<br>そのため、DTOを実装するということは多々あります。</div>



<h4 class="wp-block-heading"><span id="toc12">Q.DAOとDTOの違いって何？</span></h4>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-1024x576.jpg" alt="クエスチョン" class="wp-image-2562" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/04/bf924c03227d32f95eaae3a4a7fe9983.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>DAOもDTOもカプセル化を実現する手段だということは分かりました。でも、それらの違いがよくわかりません&#8230;.　そんな声が聞こえてくるようです。でも安心してください。以下ではっきりと明確な違いをまとめているので、そこでぜひスッキリと解決してください！</p>



<h4 class="wp-block-heading"><span id="toc13">A.DAOとDTOは、カプセル化する対象が違う！</span></h4>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-1024x576.jpg" alt="Answer" class="wp-image-2563" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/04/cf445e4f1daa1b5de9d5147272945131.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>結論から言うと、DAOとDTOではカプセル化している対象が違います。</p>



<ul class="wp-block-list">
<li><strong>DAO（Data Access Object）</strong>: <span class="bold-red">データベースとの通信をカプセル化</span>し、アプリケーション内の他の部分からデータベースの詳細を隠蔽することで、不要なアクセスやデータの一貫性を確保します。DTOのように直接的なデータの取得や設定を行うわけではありませんが、その考え方を取り入れてデータベースアクセスの方法をカプセル化します。</li>



<li><strong>DTO（Data Transfer Object）</strong>: <span class="bold-blue">データのフィールド</span><span class="blue"><span class="bold-blue">とそれに対するアクセスをカプセル化</span></span>します。そして、それを実現するのがGetterメソッドやSetterメソッドです。DTOはデータの転送や受け渡しを担当し、外部からの直接アクセスを防ぎ、データの整合性を保つ役割を果たします。</li>
</ul>



<p>つまり、DAOはデータベースとの通信をカプセル化し、DTOはデータのフィールドとそれに対するアクセスをカプセル化します。で、DTOは実際にGetterメソッドやSetterメソッドを定義します。それに対して、DAOはGetterメソッドやSetterメソッドの考え方が採用された、メソッドを提供しています。</p>



<p>だから、機能的にはほぼ、同じだけど対象がちょっと違うから呼び方を変えているだけって感じですね。</p>



<h3 class="wp-block-heading"><span id="toc14">JDBCのまとめ</span></h3>



<p><strong><mark style="background-color:#fff7cc" class="has-inline-color">JDBC</mark></strong>（Java Database Connectivity）は、Javaプログラミング言語用の<span class="bold-red">API</span>であり、データベースとの接続や操作を可能にします。<strong><mark style="background-color:#fff7cc" class="has-inline-color">JDBC</mark></strong>を使用することで、Javaアプリケーションからデータベースにアクセスし、SQLクエリを実行することができます。</p>



<p>基本的な手順は、<span class="bold-red">ドライバ</span>のロード、データベースへの接続、SQLクエリの実行、トランザクション管理、接続のクローズです。</p>



<p><strong><mark style="background-color:#fff7cc" class="has-inline-color">JDBC</mark></strong>を使うことで、異なるデータベース間での<span class="bold-red">一貫</span>（DAO＆DTOなど）したアクセスが可能になり、安全かつ効率的なデータベース操作が実現されます。</p>



<h2 class="wp-block-heading"><span id="toc15">おわりに</span></h2>



<p>お疲れさまでした！今日はJDBCについてマスター＆Studyしました。</p>



<p>疑問を持ち、それを一つずつ紐解いていくことで、いつの間にか多くの知識が身についていたんです。気が付きましたか？たった、数分であなたは知識を爆発的に増やしました！</p>



<p>これからも、今日みたいにヌルっと気づいたら知識が増えてた！みたいなStudyを一緒にしていきましょう！</p>



<p>本日はここで、終わります。ありがとうございました。またお会いしましょう！では、さらばじゃ！</p>



<p><strong><span class="fz-24px">【この記事も一緒に読まれています】</span></strong></p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/2556" title="【新感覚Study】ArrayListにクラス格納＆取得をマスターしよう！【java初心者】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/04/a3a92c974a516459544595b2af932bc0-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/a3a92c974a516459544595b2af932bc0-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/04/a3a92c974a516459544595b2af932bc0-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/a3a92c974a516459544595b2af932bc0-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/04/a3a92c974a516459544595b2af932bc0-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/04/a3a92c974a516459544595b2af932bc0-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/04/a3a92c974a516459544595b2af932bc0-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/04/a3a92c974a516459544595b2af932bc0.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【新感覚Study】ArrayListにクラス格納＆取得をマスターしよう！【java初心者】</div><div class="blogcard-snippet internal-blogcard-snippet">JavaのArrayListクラスをStudyしてきます。『配列の中にクラスを格納＆取得するのが苦手な人』、『ArrayListという訳分からんクラスの利用法が曖昧な人』などを対象にこの記事は書かれています。ぜひ、読み進めて今日で苦手とお別れしましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.04.27</div></div></div></div></a>
</div></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【新感覚Study】VLANをマスターしよう！【応用情報/対策】</title>
		<link>https://ascend-beyond.com/study/2527/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Mon, 22 Apr 2024 12:45:23 +0000</pubDate>
				<category><![CDATA[Study]]></category>
		<category><![CDATA[応用情報技術者]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[独学]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=2527</guid>

					<description><![CDATA[目次 アバンタイトルはじめにVLANってなに？【VLANのイメージ】Q. VLANの論理的な分割って結局、何がしたいの？A.論理的な分割は様々な観点で役立つ！VLANだと、なんで管理が楽になるの？A. VLANは論理的だ [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">アバンタイトル</a></li><li><a href="#toc2" tabindex="0">はじめに</a><ol><li><a href="#toc3" tabindex="0">VLANってなに？</a><ol><li><a href="#toc4" tabindex="0">【VLANのイメージ】</a></li><li><a href="#toc5" tabindex="0">Q. VLANの論理的な分割って結局、何がしたいの？</a><ol><li><a href="#toc6" tabindex="0">A.論理的な分割は様々な観点で役立つ！</a></li><li><a href="#toc7" tabindex="0">VLANだと、なんで管理が楽になるの？</a><ol><li><a href="#toc8" tabindex="0">A. VLANは論理的だからこそ！</a></li></ol></li></ol></li><li><a href="#toc9" tabindex="0">VLANの具体的な実現方法を教えて！</a></li></ol></li><li><a href="#toc10" tabindex="0">まとめ: VLAN</a></li></ol></li><li><a href="#toc11" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">アバンタイトル</span></h2>



<p>IT分野は範囲がとても広いです。そのため、過去問を解いていると１ページに何個も理解できない単語が出てきます。それを一気に理解しようとするのはとても骨が折れるし、やる気も続きません。</p>



<p>しかし、そんな時は１周まわって１つのことに徹底集中してみるのはどうでしょうか？覚えなきゃいけないことが沢山あると、終わりが見えずモチベーションが続きません。</p>



<p>でも、「今日はこの１つをマスターしよう！」と１つにフォーカスすればゴールが見えて、集中力も続くようになります。また、一点集中型なので理解力も深まり応用も効くようになります。</p>



<p>ということで、当サイトでは１点集中をコンセプトに解説を展開しています。勉強法が定まっていなかったり悩んでいる方は是非、続きをご覧になってみてはいかかでしょうか？</p>



<h2 class="wp-block-heading"><span id="toc2">はじめに</span></h2>



<p>今回は<strong><strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong></strong>(Virtual Local Area Network)をStudyしていきましょう！これまでの、もやもやとした<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>への知識は終了です！今日でカッチリと理解して、<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>を得意分野にかえてしまいましょう！</p>



<h3 class="wp-block-heading"><span id="toc3">VLANってなに？</span></h3>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="527" src="https://ascend-beyond.com/wp-content/uploads/2024/04/b834c0270bb47b9fa5c45d3d8df86f7f.jpg" alt="クエスチョン" class="wp-image-2541" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/b834c0270bb47b9fa5c45d3d8df86f7f.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/04/b834c0270bb47b9fa5c45d3d8df86f7f-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/b834c0270bb47b9fa5c45d3d8df86f7f-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>はVirtual Local Area Networkの略で、物理的なネットワークインフラストラクチャを論理的に分割する技術です。</p>



<div style="border: 5px double #91D8AC; padding: 10px; border-radius: 10px; background: ;">VLANは<font color="red">Layer 2</font>（データリンク層）の技術であり、スイッチングハブやスイッチなどのネットワークデバイスで実装されます。</div>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/2338" title="【応用情報/対策】OSI基本参照モデル-第２層（データリンク層）【衝撃簡単！】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/04/1620a46948e8abb97c20129b8fdc66d8-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/1620a46948e8abb97c20129b8fdc66d8-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/04/1620a46948e8abb97c20129b8fdc66d8-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/1620a46948e8abb97c20129b8fdc66d8-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/04/1620a46948e8abb97c20129b8fdc66d8-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/04/1620a46948e8abb97c20129b8fdc66d8-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/04/1620a46948e8abb97c20129b8fdc66d8-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/04/1620a46948e8abb97c20129b8fdc66d8.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【応用情報/対策】OSI基本参照モデル-第２層（データリンク層）【衝撃簡単！】</div><div class="blogcard-snippet internal-blogcard-snippet">今回は、OSI基本参照モデルの第２層にまつわる、データリンク層、MACアドレス、フレーム、L2スイッチ、ブリッジの計５つを勉強します。勉強の始めは、色々とごちゃごちゃしますが、ここではその一つである、L2スイッチとブリッジの違いなどを明確に解説しています。また、１回でマスターするのではなく、繰り返しでマスターしようというメンタリティーで行きましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.04.08</div></div></div></div></a>
</div></figure>



<h4 class="wp-block-heading"><span id="toc4">【VLANのイメージ】</span></h4>



<p>例えば、あなたの学校が大きな建物で構成されており、それぞれの建物が異なる活動やクラスを行っているとします。<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>は、各建物が別々のクラスや活動を行っているかのように、ネットワークを仮想的に分割することができます。例えば、図書館のコンピューターは体育館のコンピューターとは独立しており、<span class="red">通信を分離</span>することができます。</p>



<h4 class="wp-block-heading"><span id="toc5">Q. VLANの論理的な分割って結局、何がしたいの？</span></h4>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="527" src="https://ascend-beyond.com/wp-content/uploads/2024/04/2fd7e8892c7d9464563dfbaf3de27277.jpg" alt="question" class="wp-image-2521" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/2fd7e8892c7d9464563dfbaf3de27277.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/04/2fd7e8892c7d9464563dfbaf3de27277-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/2fd7e8892c7d9464563dfbaf3de27277-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>の解説などを見ると、必ず「論理的に分割～」と書いてあります。え？？そもそも何で物理的じゃなくて、論理的に分割する必要があるの？そんな疑問に以下では応えていきます。</p>



<h5 class="wp-block-heading"><span id="toc6">A.論理的な分割は様々な観点で役立つ！</span></h5>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="527" src="https://ascend-beyond.com/wp-content/uploads/2024/04/74290e8e1046764205caa5949b96422d.jpg" alt="answer" class="wp-image-2519" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/74290e8e1046764205caa5949b96422d.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/04/74290e8e1046764205caa5949b96422d-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/74290e8e1046764205caa5949b96422d-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<ul class="wp-block-list">
<li><strong>セキュリティの向上</strong>: 異なる部門や機能を持つデバイスを分離することで、セキュリティを強化することができます。たとえば、経理部門のデバイスと開発部門のデバイスを別々の<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>に配置することで、セキュリティポリシーを適用しやすくなります。</li>
</ul>



<div style="border: 5px double #91D8AC; padding: 10px; border-radius: 10px; background: ;">p.s.一般的に、異なるVLANに属するデバイス間の通信はデフォルトでは許可されていません。</div>



<ul class="wp-block-list">
<li><strong>リソースの効率的な利用</strong>: 物理的なネットワークを論理的に分割することで、リソースをより効率的に利用できます。各<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>は独立しており、それぞれが必要なリソースにのみアクセスできるため、トラフィックが最小限に抑えられます。</li>



<li><strong>管理の簡素化</strong>: 一つの物理的なネットワーク上に複数の<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>を作成することで、管理を簡素化できます。異なるグループや部門間で通信を分離しながらも、共通のネットワークインフラストラクチャを使用できるため、管理作業が容易になります。</li>
</ul>



<h5 class="wp-block-heading"><span id="toc7">VLANだと、なんで管理が楽になるの？</span></h5>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="527" src="https://ascend-beyond.com/wp-content/uploads/2024/04/2fd7e8892c7d9464563dfbaf3de27277.jpg" alt="question" class="wp-image-2521" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/2fd7e8892c7d9464563dfbaf3de27277.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/04/2fd7e8892c7d9464563dfbaf3de27277-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/2fd7e8892c7d9464563dfbaf3de27277-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><strong><mark style="background-color:#fff7cc" class="has-inline-color"><strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong></mark></strong>は論理的なものだから！と言っても、複数のセグメントが確実に存在しているわけで&#8230;.ってことは、物理的なLANも<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>も実質の管理は同じレベルで大変なんじゃないの？<br>以下ではこんな疑問を解決していきましょう！</p>



<h6 class="wp-block-heading"><span id="toc8">A. VLANは論理的だからこそ！</span></h6>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="527" src="https://ascend-beyond.com/wp-content/uploads/2024/04/74290e8e1046764205caa5949b96422d.jpg" alt="answer" class="wp-image-2519" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/74290e8e1046764205caa5949b96422d.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/04/74290e8e1046764205caa5949b96422d-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/74290e8e1046764205caa5949b96422d-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><strong><mark style="background-color:#fff7cc" class="has-inline-color"><strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong></mark></strong>を使用することで、物理的なネットワークインフラストラクチャを変更せずに、新しいセグメントを追加したり、既存のセグメントを変更したりすることができます。たとえば、新しい部門が追加された場合、新しい<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>を作成してその部門のデバイスをそこに割り当てることができます。これにより、ネットワークの柔軟性と拡張性が向上し、管理作業が容易になります。</p>



<div>
    <div style="height: 24px; margin-top: 5px;"><span style="background: #91D8AC; padding: 6px 10px; border-radius: 5px; color: #ffffff; font-weight: bold; margin-left: 10px; font-size: 18px;">VLANは柔軟性・拡張性がある</span></div>
    <div style="padding: 30px 15px 10px; border-radius: 5px; border: 2px solid #91D8AC;">
        <p><span style="font-size: 16px;">もしVLANではなく物理的なLANだと、変更がききにくいというデメリットがあります。わざわざ機器を注文したり、設定したり、配置したり&#8230;.その点で、論理的なVLANだと追加・削除などの変更がPC一つで実現できます。これこそが、VLANにおける「論理的」のメリットです。</span></p>
    </div>
</div>



<!-- START MoshimoAffiliateEasyLink -->
<script type="text/javascript">
(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;
b[a]=b[a]||function(){arguments.currentScript=c.currentScript
||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};
c.getElementById(a)||(d=c.createElement(f),d.src=g,
d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})
(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");
msmaflink({"n":"情報処理教科書 出るとこだけ！基本情報技術者［科目B］第4版 （EXAMPRESS） [ 橋本 祐史 ]","b":"","t":"","d":"https:\/\/thumbnail.image.rakuten.co.jp","c_p":"","p":["\/@0_mall\/book\/cabinet\/2520\/9784798182520_1_132.jpg"],"u":{"u":"https:\/\/item.rakuten.co.jp\/book\/17615511\/","t":"rakuten","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/item.rakuten.co.jp\/book\/17615511\/","a_id":4440988,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":1},{"id":2,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/s\/ref=nb_sb_noss_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A\u0026url=search-alias%3Daps\u0026field-keywords=%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%95%99%E7%A7%91%E6%9B%B8%20%E5%87%BA%E3%82%8B%E3%81%A8%E3%81%93%E3%81%A0%E3%81%91%EF%BC%81%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%EF%BC%BB%E7%A7%91%E7%9B%AEB%EF%BC%BD%E7%AC%AC4%E7%89%88%20%EF%BC%88EXAMPRESS%EF%BC%89%20%5B%20%E6%A9%8B%E6%9C%AC%20%E7%A5%90%E5%8F%B2%20%5D","a_id":4440991,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":2}],"eid":"gmiX0","s":"s"});
</script>
<div id="msmaflink-gmiX0">リンク</div>
<!-- MoshimoAffiliateEasyLink END -->



<h4 class="wp-block-heading"><span id="toc9">VLANの具体的な実現方法を教えて！</span></h4>



<ul class="wp-block-list">
<li><strong>ポートベースVLAN</strong>: 最も基本的な<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>設定方法で、スイッチの<span class="red">ポート</span>を<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>に割り当てます。各ポートは1つの<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>にのみ属することができます。</li>
</ul>



<div>
    <div style="height: 24px; margin-top: 5px;"><span style="background: #91D8AC; padding: 6px 10px; border-radius: 5px; color: #ffffff; font-weight: bold; margin-left: 10px; font-size: 18px;">スイッチ</span></div>
    <div style="padding: 30px 15px 10px; border-radius: 5px; border: 2px solid #91D8AC;">
        <p><span style="font-size: 16px;">スイッチとは、Layer 2（データリンク層）における<font color="red">データ転送装置</font>です。また、その転送は<font color="red">MACアドレス</font>をもとにデバイスを識別しています。</span></p>
    </div>
</div>



<ul class="wp-block-list">
<li><strong>タグ付きVLAN</strong>: 通常、複数の<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>が同じスイッチ内で共存します。タグ付き<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>では、スイッチ間を通信する際に、<span class="red">フレームにVLANタグ</span>が付与されます。これにより、スイッチはフレームを正しい<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>にルーティングすることができます。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc10">まとめ: VLAN</span></h3>



<p><strong><mark style="background-color:#fff7cc" class="has-inline-color"><strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong></mark></strong>（Virtual Local Area Network）は、物理的なネットワークを論理的に<span class="red">分割する技術</span>です。これにより、異なるグループや部門間で通信を分離し、セキュリティを向上させることができます。<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>は、データリンク層で動作し、<span class="red">ポートベースVLAN</span>や<span class="red">タグ付きVLAN</span>などの種類があります。<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>を使用することで、リソースを効率的に利用し、管理作業を簡素化することができます。</p>



<h2 class="wp-block-heading"><span id="toc11">おわりに</span></h2>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="527" src="https://ascend-beyond.com/wp-content/uploads/2024/04/63d6c93571bdbfab9013eb7d5e53c400.jpg" alt="おわりに" class="wp-image-2517" srcset="https://ascend-beyond.com/wp-content/uploads/2024/04/63d6c93571bdbfab9013eb7d5e53c400.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/04/63d6c93571bdbfab9013eb7d5e53c400-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/04/63d6c93571bdbfab9013eb7d5e53c400-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>本日は、<strong><mark style="background-color:#fff7cc" class="has-inline-color">VLAN</mark></strong>についてstudyしてきました！どうでしょうか？大枠は捉えられたと思います！これで、問題が出題されても焦ることなく冷静に解くことができるようになりました！何事においても日々の積み重ねが大切です。ゴールを明確にして、目的意識をもって一緒に頑張っていきましょう！では、さらばじゃ！</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【AI/実装編】サイズの大きな画像を生成【衝撃簡単⑧】</title>
		<link>https://ascend-beyond.com/study/1478/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Sat, 09 Mar 2024 11:39:33 +0000</pubDate>
				<category><![CDATA[AI（人工知能）]]></category>
		<category><![CDATA[Study]]></category>
		<category><![CDATA[実践]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[独学]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=1478</guid>

					<description><![CDATA[目次 対象読者今回の全コードカラー画像の収集＋前処理モジュール準備生成画像の型を定義生成器（ジェネレーター）モデルを定義識別器（ディスクリミネーター）を定義DCGANモデルの定義とコンパイルモデルのコンパイルモデルの訓練 [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">対象読者</a><ol><li><a href="#toc2" tabindex="0">今回の全コード</a></li><li><a href="#toc3" tabindex="0">カラー画像の収集＋前処理</a></li><li><a href="#toc4" tabindex="0">モジュール準備</a></li><li><a href="#toc5" tabindex="0">生成画像の型を定義</a></li><li><a href="#toc6" tabindex="0">生成器（ジェネレーター）モデルを定義</a></li><li><a href="#toc7" tabindex="0">識別器（ディスクリミネーター）を定義</a></li><li><a href="#toc8" tabindex="0">DCGANモデルの定義とコンパイル</a></li><li><a href="#toc9" tabindex="0">モデルのコンパイル</a></li><li><a href="#toc10" tabindex="0">モデルの訓練</a></li><li><a href="#toc11" tabindex="0">画像ロードの関数を定義する</a></li><li><a href="#toc12" tabindex="0">生成画像の保存</a></li><li><a href="#toc13" tabindex="0">モデルの実行＆保存</a></li><li><a href="#toc14" tabindex="0">ファイルの実行</a></li><li><a href="#toc15" tabindex="0">学習モデルで１枚ずつ確認してみよう！</a></li></ol></li><li><a href="#toc16" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">対象読者</span></h2>



<p>前回は40&#215;40のカラー画像を生成しました。しかし、今回は144&#215;144の少し大き目な画像を生成していきましょう！あいかわらず、低品質ですが流れの大枠は正しいはずです。</p>



<p>p.s.もはや抽象画の域ですね。これ（笑）。まぁでも、流れは掴んだんでよしとしましょう！</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/03/2064199165db028289e247c09e9faa09-1024x576.jpg" alt="GAN　サイズ" class="wp-image-1479" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/2064199165db028289e247c09e9faa09-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/2064199165db028289e247c09e9faa09-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/2064199165db028289e247c09e9faa09-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/2064199165db028289e247c09e9faa09-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/2064199165db028289e247c09e9faa09-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/2064199165db028289e247c09e9faa09-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/2064199165db028289e247c09e9faa09.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading"><span id="toc2">今回の全コード</span></h3>



<p>かなり、以前までのコードを多く使っているので、かなり解説は割愛させていただきます。というか、だんだん慣れてきましたよね。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import matplotlib.pyplot as plt
import numpy as np
from keras.datasets import mnist
import os
from keras.layers import Dense, Flatten, Reshape, LeakyReLU, Dropout
from keras.models import Sequential
from keras.optimizers import Adam
from keras.layers import BatchNormalization, Activation
from keras.layers import Activation, BatchNormalization
from keras.layers import Conv2D, Conv2DTranspose
import cv2

width = 144
height = 144
channels = 1
shape = (width, height, channels)
noise_dim = 100



def generator_model(noise_dim):
    model = Sequential()
    model.add(Dense(256 * 18 * 18, input_dim=noise_dim))
    model.add(Reshape((18, 18, 256)))

    model.add(Conv2DTranspose(128, kernel_size=3, strides=2, padding='same'))
    model.add(LeakyReLU(alpha=0.01))

    model.add(Conv2DTranspose(64, kernel_size=3, strides=1, padding='same'))
    model.add(LeakyReLU(alpha=0.01))
    
    model.add(Conv2DTranspose(32, kernel_size=3, strides=2, padding='same'))
    model.add(LeakyReLU(alpha=0.01))

    model.add(Conv2DTranspose(1, kernel_size=3, strides=2, padding='same'))
    model.add(Activation('tanh'))
    
    return model


def discriminator_model(shape):
    model = Sequential()

    model.add(Conv2D(32, kernel_size=3, strides=2, input_shape=shape, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))

    model.add(Conv2D(64, kernel_size=3, strides=2, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))

    model.add(Conv2D(128, kernel_size=3, strides=2, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))

    model.add(Conv2D(256, kernel_size=3, strides=2, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))

    model.add(Conv2D(512, kernel_size=3, strides=2, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))

    model.add(Conv2D(1024, kernel_size=3, strides=2, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Dense(1, activation='sigmoid'))

    return model



def gan_model(generator, discriminator):
    model = Sequential()
    model.add(generator)
    model.add(discriminator)
    return model

discriminator = discriminator_model(shape)
discriminator.compile(loss='binary_crossentropy',
                      optimizer=Adam(lr=0.0001, beta_1=0.5),#0.0001→0.0002,
                      metrics=['accuracy'])

generator = generator_model(noise_dim)
generator.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0007, beta_1=0.5))#0.0003→0.0004

discriminator.trainable = False

gan = gan_model(generator, discriminator)
gan.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0007, beta_1=0.5))

losses = []
accuracies = []
iteration_checkpoints = []

def train(iterations, batch_size, sample_interval):
    X_train = load_images(&quot;./gray_144_face&quot;)
    X_train = X_train / 127.5 - 1.0
    X_train=np.expand_dims(X_train,axis=3)#グレースケールだから
    real_label = np.ones((batch_size, 1))  # 修正
    fake_label = np.zeros((batch_size, 1))  # 修正

    for iteration in range(iterations):
        idx = np.random.randint(0, X_train.shape[0], batch_size)
        batch_images = X_train[idx]
        z = np.random.normal(0, 1, (batch_size, noise_dim))
        gene_imgs = generator.predict(z)

        d_loss_real = discriminator.train_on_batch(batch_images, real_label)
        d_loss_fake = discriminator.train_on_batch(gene_imgs, fake_label)
        d_loss, accuracy = 0.5 * np.add(d_loss_real, d_loss_fake)

        z = np.random.normal(0, 1, (batch_size, noise_dim))
        g_loss = gan.train_on_batch(z, real_label)


        if (iteration + 1) % sample_interval == 0:
            losses.append((d_loss, g_loss))
            accuracies.append(100.0 * accuracy)
            iteration_checkpoints.append(iteration + 1)

            print(&quot;%d [D loss: %f, acc.: %.2f%%] [G loss: %f]&quot; % (iteration + 1, d_loss, 100.0 * accuracy, g_loss))
            save_images(generator, iteration + 1)


def save_images(generator, iteration, directory='144x144x_face_gray_images', image_grid_rows=4, image_grid_columns=4):
    if not os.path.exists(directory):
        os.makedirs(directory)

    z = np.random.normal(0, 1, (image_grid_rows * image_grid_columns, noise_dim))
    gene_imgs = generator.predict(z)
    gene_imgs = 0.5 * gene_imgs + 0.5
    fig, axs = plt.subplots(image_grid_rows, image_grid_columns, figsize=(4, 4), sharey=True, sharex=True)
    cnt = 0
    for row in range(image_grid_rows):
        for col in range(image_grid_columns):
            axs[row, col].imshow(gene_imgs[cnt, :, :, 0], cmap='gray')
            axs[row, col].axis('off')
            cnt += 1

    fig.savefig(f&quot;{directory}/iteration_{iteration}.png&quot;)
    plt.close(fig)

def load_images(directory):#グレースケール用に変換する
    images = []
    for filename in os.listdir(directory):
        img = cv2.imread(os.path.join(directory, filename))
        if img is not None:  
            img = cv2.resize(img, (width, height))
            if len(img.shape) == 3:  # チャンネルが3の場合はグレースケールに変換
                img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            images.append(img)
        else:
            print(f&quot;Warning: Failed to load image {filename}&quot;)
    if len(images) == 0:
        print(&quot;Error: No images loaded&quot;)
        return None
    else:
        return np.array(images)



iterations = 20000
batch_size = 128
sample_interval = 1  

train(iterations, batch_size, sample_interval)
generator.save('Face-gene.keras')
discriminator.save('Face-dis.keras')
gan.save('Face-gan.keras')" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> matplotlib.pyplot </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> plt</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.datasets </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> mnist</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Dense, Flatten, Reshape, LeakyReLU, Dropout</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.optimizers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Adam</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> BatchNormalization, Activation</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Activation, BatchNormalization</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Conv2D, Conv2DTranspose</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> cv2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">width </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">144</span></span>
<span class="line"><span style="color: #F8F8F2">height </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">144</span></span>
<span class="line"><span style="color: #F8F8F2">channels </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"><span style="color: #F8F8F2">shape </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> (width, height, channels)</span></span>
<span class="line"><span style="color: #F8F8F2">noise_dim </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">100</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">generator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">noise_dim</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">256</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">18</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">18</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_dim</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Reshape((</span><span style="color: #AE81FF">18</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">18</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">256</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2DTranspose(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2DTranspose(</span><span style="color: #AE81FF">64</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2DTranspose(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2DTranspose(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Activation(</span><span style="color: #E6DB74">&#39;tanh&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">discriminator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">shape</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_shape</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">shape, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">64</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">256</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">512</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">1024</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Flatten())</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">activation</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;sigmoid&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">gan_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">discriminator</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(generator)</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(discriminator)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">discriminator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator_model(shape)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">                      </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0001</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">),</span><span style="color: #88846F">#0.0001→0.0002,</span></span>
<span class="line"><span style="color: #F8F8F2">                      </span><span style="color: #FD971F; font-style: italic">metrics</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[</span><span style="color: #E6DB74">&#39;accuracy&#39;</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">generator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator_model(noise_dim)</span></span>
<span class="line"><span style="color: #F8F8F2">generator.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0007</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span><span style="color: #88846F">#0.0003→0.0004</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">discriminator.trainable </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">gan </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gan_model(generator, discriminator)</span></span>
<span class="line"><span style="color: #F8F8F2">gan.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0007</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">losses </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">accuracies </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">iteration_checkpoints </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">train</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">iterations</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">sample_interval</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> load_images(</span><span style="color: #E6DB74">&quot;./gray_144_face&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train </span><span style="color: #F92672">/</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">127.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">-</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1.0</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">np.expand_dims(X_train,</span><span style="color: #FD971F; font-style: italic">axis</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)</span><span style="color: #88846F">#グレースケールだから</span></span>
<span class="line"><span style="color: #F8F8F2">    real_label </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.ones((batch_size, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"><span style="color: #F8F8F2">    fake_label </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.zeros((batch_size, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> iteration </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(iterations):</span></span>
<span class="line"><span style="color: #F8F8F2">        idx </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.randint(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, X_train.shape[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], batch_size)</span></span>
<span class="line"><span style="color: #F8F8F2">        batch_images </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train[idx]</span></span>
<span class="line"><span style="color: #F8F8F2">        z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (batch_size, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">        gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(z)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_real </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator.train_on_batch(batch_images, real_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_fake </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator.train_on_batch(gene_imgs, fake_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss, accuracy </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> np.add(d_loss_real, d_loss_fake)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (batch_size, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">        g_loss </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gan.train_on_batch(z, real_label)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> (iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> sample_interval </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            losses.append((d_loss, g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            accuracies.append(</span><span style="color: #AE81FF">100.0</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> accuracy)</span></span>
<span class="line"><span style="color: #F8F8F2">            iteration_checkpoints.append(iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> [D loss: </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">, acc.: </span><span style="color: #AE81FF">%.2f%%</span><span style="color: #E6DB74">] [G loss: </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">]&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, d_loss, </span><span style="color: #AE81FF">100.0</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> accuracy, g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            save_images(generator, iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">save_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">iteration</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">directory</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;144x144x_face_gray_images&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_rows</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_columns</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> os.path.exists(directory):</span></span>
<span class="line"><span style="color: #F8F8F2">        os.makedirs(directory)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (image_grid_rows </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> image_grid_columns, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(z)</span></span>
<span class="line"><span style="color: #F8F8F2">    gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> gene_imgs </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span></span>
<span class="line"><span style="color: #F8F8F2">    fig, axs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> plt.subplots(image_grid_rows, image_grid_columns, </span><span style="color: #FD971F; font-style: italic">figsize</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">), </span><span style="color: #FD971F; font-style: italic">sharey</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">sharex</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    cnt </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> row </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_rows):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> col </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_columns):</span></span>
<span class="line"><span style="color: #F8F8F2">            axs[row, col].imshow(gene_imgs[cnt, :, :, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], </span><span style="color: #FD971F; font-style: italic">cmap</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;gray&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            axs[row, col].axis(</span><span style="color: #E6DB74">&#39;off&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            cnt </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    fig.savefig(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">directory</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">/iteration_</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">iteration</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">.png&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    plt.close(fig)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">load_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">directory</span><span style="color: #F8F8F2">):</span><span style="color: #88846F">#グレースケール用に変換する</span></span>
<span class="line"><span style="color: #F8F8F2">    images </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> filename </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> os.listdir(directory):</span></span>
<span class="line"><span style="color: #F8F8F2">        img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.imread(os.path.join(directory, filename))</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> img </span><span style="color: #F92672">is</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">:  </span></span>
<span class="line"><span style="color: #F8F8F2">            img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.resize(img, (width, height))</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(img.shape) </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">:  </span><span style="color: #88846F"># チャンネルが3の場合はグレースケールに変換</span></span>
<span class="line"><span style="color: #F8F8F2">                img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.cvtColor(img, cv2.</span><span style="color: #AE81FF">COLOR_BGR2GRAY</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            images.append(img)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;Warning: Failed to load image </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">filename</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(images) </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Error: No images loaded&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> np.array(images)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">iterations </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">20000</span></span>
<span class="line"><span style="color: #F8F8F2">batch_size </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">128</span></span>
<span class="line"><span style="color: #F8F8F2">sample_interval </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">  </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">train(iterations, batch_size, sample_interval)</span></span>
<span class="line"><span style="color: #F8F8F2">generator.save(</span><span style="color: #E6DB74">&#39;Face-gene.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.save(</span><span style="color: #E6DB74">&#39;Face-dis.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">gan.save(</span><span style="color: #E6DB74">&#39;Face-gan.keras&#39;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc3">カラー画像の収集＋前処理</span></h3>



<p>では、早速やっていきましょう。まずは<strong>画像収集</strong>と<strong>前処理</strong>です。具体的なコードはこちらでやってみてください。↓</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1432/" title="【AI/実践編】画像収集～画像前処理方法【衝撃簡単⑥】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】画像収集～画像前処理方法【衝撃簡単⑥】</div><div class="blogcard-snippet internal-blogcard-snippet">対象読者ここでは、機械学習における画像収集～前処理（サイズ変更・ファイル名変更・グレースケール化）を扱います。このページで紹介する内容は機械学習のサブ的な技術なのでコードの細かな解説などは割愛させていただきます。あくまでも...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.07</div></div></div></div></a>
</div></figure>



<p>ここのタスクで私がやったことをまとめます。</p>



<ol class="wp-block-list">
<li>独断と偏見から綺麗だと思う<strong>女性画像を100枚ずつ計400枚集める</strong><br>（有村架純・長澤まさみ・橋本環奈・パクジヒョ）<br>集めれるならもっと多い方がいいです。</li>



<li>画像サイズを<strong>144×144に変更</strong>する</li>



<li><strong>ファイル名を変更</strong>する</li>
</ol>



<p>この３ステップをここではやりました。また、先ほど提供した記事でこれらすべてのプログラムコードをのせているので、誰でも簡単にできますよ。</p>



<h3 class="wp-block-heading"><span id="toc4">モジュール準備</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import matplotlib.pyplot as plt
import numpy as np
from keras.layers import Dense, Flatten,Reshape, LeakyReLU 
from keras.models import Sequential
from keras.optimizers import Adam
import os
from keras.layers import Activation,Dropout,BatchNormalization
from keras.layers import Conv2D
from keras.layers import UpSampling2D
import cv2
#上記↑は『衝撃簡単7』と同じ
from keras.layers import Conv2DTranspose" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> matplotlib.pyplot </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> plt</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Dense, Flatten,Reshape, LeakyReLU </span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.optimizers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Adam</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Activation,Dropout,BatchNormalization</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Conv2D</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> UpSampling2D</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> cv2</span></span>
<span class="line"><span style="color: #88846F">#上記↑は『衝撃簡単7』と同じ</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Conv2DTranspose</span></span></code></pre></div>



<p><span class="bold-green">from keras.layers import Conv2DTranspose</span><br>＃<strong>Conv2DTranspose</strong>は畳み込みの逆操作を行い、入力データをより大きな空間に<span class="bold-red">逆畳み込み</span>するために使用される。<br>＃通常の畳み込み層は、入力としてデータを受け取り、それをフィルター（カーネル）と畳み込んで、出力を生成します。しかし、<code>Conv2DTranspose</code>は逆の操作を行います。つまり、入力を受け取り、その情報を使用して<span class="red">より大きな出力を生成</span>します。</p>



<p>前回は畳み込み層としてUpsampling2Dを使いました。では、ここで一旦、<code>Conv2DTranspose</code>とUpsampling2Dの違いをまとめておきましょう。</p>



<p><code><strong><span class="fz-28px">Conv2DTranspose</span></strong></code><span class="fz-28px"><strong>：</strong></span></p>



<ul class="wp-block-list">
<li>畳み込みの逆操作を行う</li>



<li>入力を<span class="red">より大きな空間に</span>逆畳み込みする</li>



<li>フィルターを使用して入力に<span class="red">重みを適用</span>し、出力を生成する</li>



<li>フィルターサイズやストライドなどの<span class="red">パラメータを調整</span>することで、出力のサイズや形状を制御することができる</li>
</ul>



<p><span class="fz-28px"><code><strong>UpSampling2D</strong></code>: </span></p>



<ul class="wp-block-list">
<li>入力データの<span class="red">サイズを拡大</span>する</li>



<li><span class="red">重みはもたない</span></li>



<li>単純に入力の各ピクセルの間に新しいピクセルを挿入し、それらの値を元のピクセルの値と同じにする</li>



<li>補間法（nearest neighborやbilinearなど）を使用して、新しいピクセルの値を計算する</li>



<li>主な<span class="red">パラメータは拡大する倍率のみ</span>。通常、2の累乗倍率を使用する</li>
</ul>



<p>要するに、<span class="red">画像生成などのタスク</span>では<code><strong>Conv2DTranspose</strong></code>が使用され、データの<span class="red">拡大だけが必要</span>な場合は<code><strong>UpSampling2D</strong></code>が選択される。</p>



<!-- START MoshimoAffiliateEasyLink -->
<script type="text/javascript">
(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;
b[a]=b[a]||function(){arguments.currentScript=c.currentScript
||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};
c.getElementById(a)||(d=c.createElement(f),d.src=g,
d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})
(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");
msmaflink({"n":"物体・画像認識と時系列データ処理入門 [TensorFlow2\/PyTorch対応第2版] NumPy\/TensorFlow2（Keras）\/PyTorchによる実装ディープラーニング [ チーム・カルポ ]","b":"","t":"","d":"https:\/\/thumbnail.image.rakuten.co.jp","c_p":"","p":["\/@0_mall\/book\/cabinet\/3546\/9784798063546.jpg"],"u":{"u":"https:\/\/item.rakuten.co.jp\/book\/16470663\/","t":"rakuten","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/item.rakuten.co.jp\/book\/16470663\/","a_id":4440988,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":1}],"eid":"EtlPa","s":"s"});
</script>
<div id="msmaflink-EtlPa">リンク</div>
<!-- MoshimoAffiliateEasyLink END -->



<h3 class="wp-block-heading"><span id="toc5">生成画像の型を定義</span></h3>



<p>生成する画像の型を定義します。幅と高さを自分の生成したい大きさに調整します。また、チャンネルはグレースケールなので１にします。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="width = 144
height = 144
channels = 1
shape = (width, height, channels)
noise_dim = 100" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">width </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">144</span></span>
<span class="line"><span style="color: #F8F8F2">height </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">144</span></span>
<span class="line"><span style="color: #F8F8F2">channels </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"><span style="color: #F8F8F2">shape </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> (width, height, channels)</span></span>
<span class="line"><span style="color: #F8F8F2">noise_dim </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">100</span></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc6">生成器（ジェネレーター）モデルを定義</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def generator_model(noise_dim):
    model = Sequential()
    model.add(Dense(256 * 18 * 18, input_dim=noise_dim))
    model.add(Reshape((18, 18, 256)))

    model.add(Conv2DTranspose(128, kernel_size=3, strides=2, padding='same'))
    model.add(LeakyReLU(alpha=0.01))

    model.add(Conv2DTranspose(64, kernel_size=3, strides=1, padding='same'))
    model.add(LeakyReLU(alpha=0.01))
    
    model.add(Conv2DTranspose(32, kernel_size=3, strides=2, padding='same'))
    model.add(LeakyReLU(alpha=0.01))

    model.add(Conv2DTranspose(1, kernel_size=3, strides=2, padding='same'))
    model.add(Activation('tanh'))
    
    return model" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">generator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">noise_dim</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">256</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">18</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">18</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_dim</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Reshape((</span><span style="color: #AE81FF">18</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">18</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">256</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2DTranspose(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2DTranspose(</span><span style="color: #AE81FF">64</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2DTranspose(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2DTranspose(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Activation(</span><span style="color: #E6DB74">&#39;tanh&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span></code></pre></div>



<p><span class="bold-green">model.add(Dense(256 * 18 * 18, input_dim=noise_dim))</span><br>＃18はConv2DTransposeの数、ストライドから導く。<br>#ストライド２が３あるから、１８ｘ２ｘ２ｘ２＝１４４（画像サイズ）となるようにする。<br><br><span class="bold-green">model.add(Conv2DTranspose(128, kernel_size=3, strides=2, padding=&#8217;same&#8217;)) </span><br>＃128個のフィルターを使用し、カーネルサイズが3&#215;3で、<strong>ストライド</strong>が2の畳み込みの逆操作を行う。これにより、18&#215;18の入力が36&#215;36に拡大される。<br>＃<strong>ストライド</strong>：畳み込み演算においてフィルター（カーネル）が入力データを<span class="red">どのくらいのステップで移動するか</span>を制御するパラメータ。<br>＃例：<span class="bold">ストライドが1</span>の場合→フィルターは1つのピクセルごとに移動→<span class="red">出力画像は入力と同じ</span>サイズ<br>＃例：<strong>ストライドが2</strong>の場合→フィルターは2つのピクセルごとに移動→<span class="red">出力は入力の２倍</span>になる<br>このようにして、畳み込みの逆操作を行い、より大きな出力を生成することができる。</p>



<p><span class="bold-green">model.add(Conv2DTranspose(64, kernel_size=3, strides=1, padding=&#8217;same&#8217;))</span><br>＃stridesを１にしているため、画像サイズはキープされる。<span class="bold-green"><br></span><br>＊以降の解説は前回までで沢山しているので割愛します。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1074/" title="【AI/実践編】DCGANで高画質化【衝撃簡単⑤】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】DCGANで高画質化【衝撃簡単⑤】</div><div class="blogcard-snippet internal-blogcard-snippet">衝撃簡単です。DCGANを使ってフェイク画像を作っていきましょう！ディープフェイクにも使われている技術を誰でも、簡単にできるようにまとめました。AI学習は座学よりも実践あるのみです！DCGANを体験していきましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.02</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading"><span id="toc7">識別器（ディスクリミネーター）を定義</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def discriminator_model(shape):
    model = Sequential()

    model.add(Conv2D(32, kernel_size=3, strides=2, input_shape=shape, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))

    model.add(Conv2D(64, kernel_size=3, strides=2, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))

    model.add(Conv2D(128, kernel_size=3, strides=2, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))

    model.add(Conv2D(256, kernel_size=3, strides=2, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))

    model.add(Conv2D(512, kernel_size=3, strides=2, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))

    model.add(Conv2D(1024, kernel_size=3, strides=2, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Dense(1, activation='sigmoid'))

    return model" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">discriminator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">shape</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_shape</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">shape, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">64</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">256</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">512</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">1024</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Flatten())</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">activation</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;sigmoid&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span></code></pre></div>



<p>このdiscriminatorの調整には理論はありません。<br>『実行しては修正して』を繰り返したら、こうなりました。これが正解ではないので、皆さんも増やしたり、減らしたり、カスタマイズして最適解を導いてみてください。<br><br>p.s.以下に私の経験則や一般論を置いておきます。微力ですがカスタマイズで困ったらどうぞ。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1177/" title="【AI/座学】GANパラメーター調整のコツ・極意書" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-160x90.png 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-300x169.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-1024x576.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-768x432.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-120x68.png 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-320x180.png 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1.png 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/座学】GANパラメーター調整のコツ・極意書</div><div class="blogcard-snippet internal-blogcard-snippet">GANモデルは学習が不安定になりがちです。それを見ると、私の心も不安定(なんちゃって)。ここでは、そんな学習も心も不安定になってしまった人に向けての、GANモデルパラメーター調整のコツを紹介します。私の過去からの経験から【これは効果あった】や一般論をまとめています。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.02</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading"><span id="toc8">DCGANモデルの定義とコンパイル</span></h3>



<p>生成器と識別器を結合してDCGANモデルを作成しましょう！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def gan_model(generator, discriminator):
    model = Sequential()
    model.add(generator)
    model.add(discriminator)
    return model" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">gan_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">discriminator</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(generator)</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(discriminator)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span></code></pre></div>



<p>これも今までに何回も登場しました。もはや定型文ですね。</p>



<h3 class="wp-block-heading"><span id="toc9">モデルのコンパイル</span></h3>



<p>パラメーターの設定をしていきましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="discriminator = discriminator_model(shape)
discriminator.compile(loss='binary_crossentropy',
                      optimizer=Adam(lr=0.0001, beta_1=0.5),metrics=['accuracy'])

generator = generator_model(noise_dim)
generator.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0007, beta_1=0.5))

discriminator.trainable = False

gan = gan_model(generator, discriminator)
gan.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0007, beta_1=0.5))" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">discriminator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator_model(shape)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">                      </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0001</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">),</span><span style="color: #FD971F; font-style: italic">metrics</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[</span><span style="color: #E6DB74">&#39;accuracy&#39;</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">generator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator_model(noise_dim)</span></span>
<span class="line"><span style="color: #F8F8F2">generator.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0007</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">discriminator.trainable </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">gan </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gan_model(generator, discriminator)</span></span>
<span class="line"><span style="color: #F8F8F2">gan.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0007</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span></code></pre></div>



<p>こちらも、トライアンドエラーの繰り返しです。強いて言うなら、<span class="red">１つずつ変えてみてください</span>。複数を同時に変更すると、何が影響を与えたか判断できなくなってしまうので。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1177/" title="【AI/座学】GANパラメーター調整のコツ・極意書" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-160x90.png 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-300x169.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-1024x576.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-768x432.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-120x68.png 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-320x180.png 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1.png 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/座学】GANパラメーター調整のコツ・極意書</div><div class="blogcard-snippet internal-blogcard-snippet">GANモデルは学習が不安定になりがちです。それを見ると、私の心も不安定(なんちゃって)。ここでは、そんな学習も心も不安定になってしまった人に向けての、GANモデルパラメーター調整のコツを紹介します。私の過去からの経験から【これは効果あった】や一般論をまとめています。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.02</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading"><span id="toc10">モデルの訓練</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="losses = []
accuracies = []
iteration_checkpoints = []

def train(iterations, batch_size, sample_interval):
    X_train = load_images(&quot;./gray_144_face&quot;)
    X_train = X_train / 127.5 - 1.0
    X_train=np.expand_dims(X_train,axis=3)#グレースケールだから
    real_label = np.ones((batch_size, 1))  # 修正
    fake_label = np.zeros((batch_size, 1))  # 修正

    for iteration in range(iterations):
        idx = np.random.randint(0, X_train.shape[0], batch_size)
        batch_images = X_train[idx]
        z = np.random.normal(0, 1, (batch_size, noise_dim))
        gene_imgs = generator.predict(z)

        d_loss_real = discriminator.train_on_batch(batch_images, real_label)
        d_loss_fake = discriminator.train_on_batch(gene_imgs, fake_label)
        d_loss, accuracy = 0.5 * np.add(d_loss_real, d_loss_fake)

        z = np.random.normal(0, 1, (batch_size, noise_dim))
        g_loss = gan.train_on_batch(z, real_label)


        if (iteration + 1) % sample_interval == 0:
            losses.append((d_loss, g_loss))
            accuracies.append(100.0 * accuracy)
            iteration_checkpoints.append(iteration + 1)

            print(&quot;%d [D loss: %f, acc.: %.2f%%] [G loss: %f]&quot; % (iteration + 1, d_loss, 100.0 * accuracy, g_loss))
            save_images(generator, iteration + 1)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">losses </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">accuracies </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">iteration_checkpoints </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">train</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">iterations</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">sample_interval</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> load_images(</span><span style="color: #E6DB74">&quot;./gray_144_face&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train </span><span style="color: #F92672">/</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">127.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">-</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1.0</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">np.expand_dims(X_train,</span><span style="color: #FD971F; font-style: italic">axis</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)</span><span style="color: #88846F">#グレースケールだから</span></span>
<span class="line"><span style="color: #F8F8F2">    real_label </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.ones((batch_size, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"><span style="color: #F8F8F2">    fake_label </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.zeros((batch_size, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> iteration </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(iterations):</span></span>
<span class="line"><span style="color: #F8F8F2">        idx </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.randint(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, X_train.shape[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], batch_size)</span></span>
<span class="line"><span style="color: #F8F8F2">        batch_images </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train[idx]</span></span>
<span class="line"><span style="color: #F8F8F2">        z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (batch_size, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">        gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(z)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_real </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator.train_on_batch(batch_images, real_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_fake </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator.train_on_batch(gene_imgs, fake_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss, accuracy </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> np.add(d_loss_real, d_loss_fake)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (batch_size, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">        g_loss </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gan.train_on_batch(z, real_label)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> (iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> sample_interval </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            losses.append((d_loss, g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            accuracies.append(</span><span style="color: #AE81FF">100.0</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> accuracy)</span></span>
<span class="line"><span style="color: #F8F8F2">            iteration_checkpoints.append(iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> [D loss: </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">, acc.: </span><span style="color: #AE81FF">%.2f%%</span><span style="color: #E6DB74">] [G loss: </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">]&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, d_loss, </span><span style="color: #AE81FF">100.0</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> accuracy, g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            save_images(generator, iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p><span class="bold-green"><strong>idx_real = np.random.randint(0, X_train.shape[0] , batch_size)</strong><br></span>＃<code>batch_size</code>&nbsp;の数だけデータをランダムに抽出する<br>＃<strong><code>np.random.randint(a, b, size)</code>&nbsp;</strong>関数は、<span class="red"><code>a</code>&nbsp;以上&nbsp;<code>b</code>&nbsp;未満の範囲</span>からランダムに整数を&nbsp;<code>size</code>&nbsp;個生成します。<br><br><span class="bold-green"><code><strong>z = np.random.normal(0, 1, (batch_size, noise_dim))</strong></code><br></span>＃引数として、<span class="red">平均</span>（0）、<span class="red">標準偏差</span>（1）、および形状を指定しています。ここで、<code>batch_size</code>は生成される行列の<span class="red">行数</span>（サンプル数）、<code>noise_dim</code>は<span class="red">列数</span>（ノイズの次元数）を示しています。</p>



<p><strong><span class="bold-green"><code>d_loss_real = discriminator.train_on_batch(batch_images_real, real_label)</code><br><code>d_loss_fake = discriminator.train_on_batch(gene_imgs, fake_label)</code></span></strong><br>＃Discriminatorを訓練。本物の画像と偽物の画像をそれぞれ使用して損失を計算。<br>＃<strong><code>train_on_batch</code>&nbsp;メソッド</strong>は、バッチで訓練するために使用されます。このメソッドは、入力データと対応する正解ラベル（または目標値）を受け取り、モデルの重みを更新します。以下に、このメソッドの引数と使い方を説明します。</p>



<p><strong><span class="bold-green"><code>g_loss = gan.train_on_batch(z, real_label)</code><br></span></strong>＃GANモデルを訓練。GANは、生成された画像を本物と誤認させるように学習します。<br>＃<code><strong>real_label</strong></code>は、生成器（Generator）の訓練時に使用される目標値。目標値として本物の画像に対応するラベルが与えられます。</p>



<p>＊他は何回も解説していることなので、割愛します。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1074/" title="【AI/実践編】DCGANで高画質化【衝撃簡単⑤】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】DCGANで高画質化【衝撃簡単⑤】</div><div class="blogcard-snippet internal-blogcard-snippet">衝撃簡単です。DCGANを使ってフェイク画像を作っていきましょう！ディープフェイクにも使われている技術を誰でも、簡単にできるようにまとめました。AI学習は座学よりも実践あるのみです！DCGANを体験していきましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.02</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading"><span id="toc11">画像ロードの関数を定義する</span></h3>



<p>今回は独自の画像データを使うので、モデルに画像を読み込ますためのロード関数が必要になります。ここでは、それを定義していきましょう！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def load_images(directory):#グレースケール用に変換する
    images = []
    for filename in os.listdir(directory):
        img = cv2.imread(os.path.join(directory, filename))
        if img is not None:  
            img = cv2.resize(img, (width, height))
            if len(img.shape) == 3:  # チャンネルが3の場合はグレースケールに変換
                img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            images.append(img)
        else:
            print(f&quot;Warning: Failed to load image {filename}&quot;)
    if len(images) == 0:
        print(&quot;Error: No images loaded&quot;)
        return None
    else:
        return np.array(images)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">load_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">directory</span><span style="color: #F8F8F2">):</span><span style="color: #88846F">#グレースケール用に変換する</span></span>
<span class="line"><span style="color: #F8F8F2">    images </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> filename </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> os.listdir(directory):</span></span>
<span class="line"><span style="color: #F8F8F2">        img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.imread(os.path.join(directory, filename))</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> img </span><span style="color: #F92672">is</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">:  </span></span>
<span class="line"><span style="color: #F8F8F2">            img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.resize(img, (width, height))</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(img.shape) </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">:  </span><span style="color: #88846F"># チャンネルが3の場合はグレースケールに変換</span></span>
<span class="line"><span style="color: #F8F8F2">                img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.cvtColor(img, cv2.</span><span style="color: #AE81FF">COLOR_BGR2GRAY</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            images.append(img)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;Warning: Failed to load image </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">filename</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(images) </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Error: No images loaded&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> np.array(images)</span></span></code></pre></div>



<p>これでモデルに独自の画像データを読み込むことができます。</p>



<h3 class="wp-block-heading"><span id="toc12">生成画像の保存</span></h3>



<p>画像を保存して目視できるようにしましょう！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def save_images(generator, iteration, directory='144x144x_face_gray_images', image_grid_rows=4, image_grid_columns=4):
    if not os.path.exists(directory):
        os.makedirs(directory)

    z = np.random.normal(0, 1, (image_grid_rows * image_grid_columns, noise_dim))
    gene_imgs = generator.predict(z)
    gene_imgs = 0.5 * gene_imgs + 0.5
    fig, axs = plt.subplots(image_grid_rows, image_grid_columns, figsize=(4, 4), sharey=True, sharex=True)
    cnt = 0
    for row in range(image_grid_rows):
        for col in range(image_grid_columns):
            axs[row, col].imshow(gene_imgs[cnt, :, :, 0], cmap='gray')
            axs[row, col].axis('off')
            cnt += 1

    fig.savefig(f&quot;{directory}/iteration_{iteration}.png&quot;)
    plt.close(fig)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">save_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">iteration</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">directory</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;144x144x_face_gray_images&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_rows</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_columns</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> os.path.exists(directory):</span></span>
<span class="line"><span style="color: #F8F8F2">        os.makedirs(directory)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (image_grid_rows </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> image_grid_columns, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(z)</span></span>
<span class="line"><span style="color: #F8F8F2">    gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> gene_imgs </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span></span>
<span class="line"><span style="color: #F8F8F2">    fig, axs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> plt.subplots(image_grid_rows, image_grid_columns, </span><span style="color: #FD971F; font-style: italic">figsize</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">), </span><span style="color: #FD971F; font-style: italic">sharey</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">sharex</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    cnt </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> row </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_rows):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> col </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_columns):</span></span>
<span class="line"><span style="color: #F8F8F2">            axs[row, col].imshow(gene_imgs[cnt, :, :, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], </span><span style="color: #FD971F; font-style: italic">cmap</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;gray&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            axs[row, col].axis(</span><span style="color: #E6DB74">&#39;off&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            cnt </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    fig.savefig(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">directory</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">/iteration_</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">iteration</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">.png&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    plt.close(fig)</span></span></code></pre></div>



<p>引数の<strong>directory=</strong>を変えないと、以前の保存画像に上書きされてしまうので、これは変えておきましょう！</p>



<p>また、12行目の<strong>axs[row, col].imshow(gene_imgs[cnt, :, :, 0], cmap=&#8217;gray&#8217;)</strong>はグレースケール用に変えています。<br><br>p.s.今まで、使ってきたメソッドなので細かい解説は割愛します。</p>



<!-- START MoshimoAffiliateEasyLink -->
<script type="text/javascript">
(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;
b[a]=b[a]||function(){arguments.currentScript=c.currentScript
||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};
c.getElementById(a)||(d=c.createElement(f),d.src=g,
d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})
(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");
msmaflink({"n":"現場で使える！TensorFlow開発入門 Kerasによる深層学習モデル構築手法 （AI \u0026 TECHNOLOGY） [ 太田 満久 ]","b":"","t":"","d":"https:\/\/thumbnail.image.rakuten.co.jp","c_p":"","p":["\/@0_mall\/book\/cabinet\/4121\/9784798154121.jpg"],"u":{"u":"https:\/\/item.rakuten.co.jp\/book\/15374717\/","t":"rakuten","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/item.rakuten.co.jp\/book\/15374717\/","a_id":4440988,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":1}],"eid":"uMUKS","s":"s"});
</script>
<div id="msmaflink-uMUKS">リンク</div>
<!-- MoshimoAffiliateEasyLink END -->



<h3 class="wp-block-heading"><span id="toc13">モデルの実行＆保存</span></h3>



<p>バッチサイズを変えると、学習に影響が出ます。それ以外のパラメーターはお好みでどうぞ！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="iterations = 20000
batch_size = 128
sample_interval = 100 

train(iterations, batch_size, sample_interval)
generator.save('144Face-gene.keras')
discriminator.save('144Face-dis.keras')
gan.save('144Face-gan.keras')" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">iterations </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">20000</span></span>
<span class="line"><span style="color: #F8F8F2">batch_size </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">128</span></span>
<span class="line"><span style="color: #F8F8F2">sample_interval </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">100</span><span style="color: #F8F8F2"> </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">train(iterations, batch_size, sample_interval)</span></span>
<span class="line"><span style="color: #F8F8F2">generator.save(</span><span style="color: #E6DB74">&#39;144Face-gene.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.save(</span><span style="color: #E6DB74">&#39;144Face-dis.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">gan.save(</span><span style="color: #E6DB74">&#39;144Face-gan.keras&#39;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc14">ファイルの実行</span></h3>



<p>では、実行していきましょう。実行方法は人それぞれですが、私の場合はCMDでファイル名を入力することで実行しています。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="ファイル名.py" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">ファイル名.py</span></span></code></pre></div>



<p>これで、いい感じの出力がされたら完了です！</p>



<h3 class="wp-block-heading"><span id="toc15">学習モデルで１枚ずつ確認してみよう！</span></h3>



<p>今までは、4&#215;4で画像を確認しましたが、サイズを大きく確認したいので１枚で出力されるようにしましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import numpy as np
import matplotlib.pyplot as plt
from keras.models import load_model
import os

noise_dim=100
def generate_and_save_images(generator, noise_dim, save_directory='generated_images', num_images=10):
    if not os.path.exists(save_directory):
        os.makedirs(save_directory)
    
    for i in range(num_images):
        noise = np.random.normal(0, 1, (1, noise_dim))
        generated_image = generator.predict(noise)
        generated_image = 0.5 * generated_image + 0.5  # 画像のスケーリングを元に戻す
        generated_image = np.squeeze(generated_image)  # 不要な次元を削除
        plt.imshow(generated_image, cmap='gray')
        plt.axis('off')
        plt.savefig(f&quot;{save_directory}/generated_image_{i+1}.png&quot;)
        plt.close()

# 生成器モデルをロードする
generator = load_model('144Face-gene.keras')

# 10枚の画像を生成して保存する
generate_and_save_images(generator, noise_dim)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> matplotlib.pyplot </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> plt</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> load_model</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">noise_dim</span><span style="color: #F92672">=</span><span style="color: #AE81FF">100</span></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">generate_and_save_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">noise_dim</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">save_directory</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;generated_images&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">num_images</span><span style="color: #F92672">=</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> os.path.exists(save_directory):</span></span>
<span class="line"><span style="color: #F8F8F2">        os.makedirs(save_directory)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> i </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(num_images):</span></span>
<span class="line"><span style="color: #F8F8F2">        noise </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">        generated_image </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(noise)</span></span>
<span class="line"><span style="color: #F8F8F2">        generated_image </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> generated_image </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">  </span><span style="color: #88846F"># 画像のスケーリングを元に戻す</span></span>
<span class="line"><span style="color: #F8F8F2">        generated_image </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.squeeze(generated_image)  </span><span style="color: #88846F"># 不要な次元を削除</span></span>
<span class="line"><span style="color: #F8F8F2">        plt.imshow(generated_image, </span><span style="color: #FD971F; font-style: italic">cmap</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;gray&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        plt.axis(</span><span style="color: #E6DB74">&#39;off&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        plt.savefig(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">save_directory</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">/generated_image_</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">i</span><span style="color: #F92672">+</span><span style="color: #AE81FF">1}</span><span style="color: #E6DB74">.png&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        plt.close()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># 生成器モデルをロードする</span></span>
<span class="line"><span style="color: #F8F8F2">generator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> load_model(</span><span style="color: #E6DB74">&#39;144Face-gene.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># 10枚の画像を生成して保存する</span></span>
<span class="line"><span style="color: #F8F8F2">generate_and_save_images(generator, noise_dim)</span></span></code></pre></div>



<p>これで、大きなサイズで画像を確認できるようになりました。</p>



<h2 class="wp-block-heading"><span id="toc16">おわりに</span></h2>



<p>今回は大きなサイズの生成方法を紹介しました。もっと、質を高めたい方は、層を複雑にしたりパラメーターの値をカスタマイズしてみてください。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【AI/実装編】DCGANでカラー画像を生成【衝撃簡単⑦】</title>
		<link>https://ascend-beyond.com/study/1455/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Thu, 07 Mar 2024 10:40:01 +0000</pubDate>
				<category><![CDATA[AI（人工知能）]]></category>
		<category><![CDATA[Study]]></category>
		<category><![CDATA[実践]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[独学]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=1455</guid>

					<description><![CDATA[目次 対象読者今回のプロセス今回の全コードカラー画像の収集＋前処理モジュール準備生成画像の型を定義生成器（ジェネレーター）モデルを定義識別器（ディスクリミネーター）を定義DCGANモデルの定義とコンパイルモデルのコンパイ [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">対象読者</a><ol><li><a href="#toc2" tabindex="0">今回のプロセス</a></li><li><a href="#toc3" tabindex="0">今回の全コード</a></li><li><a href="#toc4" tabindex="0">カラー画像の収集＋前処理</a></li><li><a href="#toc5" tabindex="0">モジュール準備</a></li><li><a href="#toc6" tabindex="0">生成画像の型を定義</a></li><li><a href="#toc7" tabindex="0">生成器（ジェネレーター）モデルを定義</a></li><li><a href="#toc8" tabindex="0">識別器（ディスクリミネーター）を定義</a></li><li><a href="#toc9" tabindex="0">DCGANモデルの定義とコンパイル</a></li><li><a href="#toc10" tabindex="0">モデルのコンパイル</a></li><li><a href="#toc11" tabindex="0">モデルの訓練</a></li><li><a href="#toc12" tabindex="0">画像ロードの関数を定義する</a></li><li><a href="#toc13" tabindex="0">生成画像の保存</a></li><li><a href="#toc14" tabindex="0">モデルの実行＆保存</a></li><li><a href="#toc15" tabindex="0">ファイルの実行</a></li><li><a href="#toc16" tabindex="0">学習モデルで１枚ずつ確認してみよう！</a></li></ol></li><li><a href="#toc17" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">対象読者</span></h2>



<p>今回は、<span class="bold-red">DCGAN</span>で<span class="bold-red">カラー画像</span>を生成していきます！あまり良い結果とは言えませんが、カラー画像自体は生成できているので、まぁよしとしてください💦</p>



<p>今回のゴール設定は『<strong>タイプを具現化する</strong>』ことです。綺麗だと思う女性の画像を集め、それらに共通する特徴をDCGANで生成してもらいます。これにより、自分のタイプという概念が具現化できます。<br>ちなみに下が結果です。</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/03/7260bff4907bc9338b51ea26bba6eaae-1024x576.jpg" alt="gan カラー画像" class="wp-image-1456" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/7260bff4907bc9338b51ea26bba6eaae-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/7260bff4907bc9338b51ea26bba6eaae-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/7260bff4907bc9338b51ea26bba6eaae-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/7260bff4907bc9338b51ea26bba6eaae-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/7260bff4907bc9338b51ea26bba6eaae-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/7260bff4907bc9338b51ea26bba6eaae-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/7260bff4907bc9338b51ea26bba6eaae.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>女性と思えば女性に見えるレベルの画像ですね（笑）<br>こんなレベルでもいいよ！と感じたら、読み進めてみてください。</p>



<h3 class="wp-block-heading"><span id="toc2">今回のプロセス</span></h3>



<p>では、まずはじめに<strong>DCGANでカラー画像生成</strong>プロセスを簡単に紹介しておきます。</p>



<ol class="wp-block-list">
<li><strong>画像収集</strong></li>



<li><strong>画像加工</strong></li>



<li><strong>プログラミング(モデル作成)</strong><br>１.モジュール準備<br>２.生成画像の型<br>３.生成器・識別器・GANモデルの構築<br>４.コンパイル<br>５.訓練<br>６.追加の関数とか<br>７.実行</li>



<li>モデルの<strong>評価・改善</strong></li>



<li><strong>終了</strong></li>
</ol>



<p>簡単にまとめるとこんな感じです。コードは前回までのを使ったりするので、意外とすんなり終わります。</p>



<h3 class="wp-block-heading"><span id="toc3">今回の全コード</span></h3>



<p>半分以上はこれまでの『衝撃簡単シリーズ』で登場したものとなるので、新しいことは意外とありません。<br>p.s.前回まででの重複箇所の説明は割愛させていただきます</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="from keras.layers import Input, Dense, Reshape, Flatten, Dropout
from keras.layers import BatchNormalization, Activation, ZeroPadding2D
from keras.layers import LeakyReLU
from keras.layers import UpSampling2D, Conv2D
from keras.models import Sequential, Model
from keras.optimizers import Adam
import matplotlib.pyplot as plt
import os
import cv2
import numpy as np

width = 40
height = 40
channels = 3
shape = (width, height, channels)
noise_dim = 100


def generator_model(noise_dim):
    model = Sequential()
    model.add(Dense(10 * 10 * 256, activation=&quot;relu&quot;, input_dim=noise_dim))
    model.add(Reshape((10, 10, 256)))
    model.add(BatchNormalization(momentum=0.8))
    model.add(UpSampling2D())

    model.add(Conv2D(128, kernel_size=3, padding=&quot;same&quot;))
    model.add(Activation(&quot;relu&quot;))
    model.add(BatchNormalization(momentum=0.8))
    model.add(UpSampling2D())


    model.add(Conv2D(64, kernel_size=3, padding=&quot;same&quot;))
    model.add(Activation(&quot;relu&quot;))
    model.add(BatchNormalization(momentum=0.8))

    model.add(Conv2D(3, kernel_size=3, padding=&quot;same&quot;))
    model.add(Activation(&quot;tanh&quot;))
    return model



def discriminator_model(shape):
    model = Sequential()
    model.add(Conv2D(32, kernel_size=3, strides=2, input_shape=shape, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))
    model.add(Conv2D(64, kernel_size=3, strides=2, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))
    model.add(Conv2D(128, kernel_size=3, strides=2, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(1, activation='sigmoid'))
    return model




def gan_model(generator, discriminator):
    model = Sequential()
    model.add(generator)
    model.add(discriminator)
    return model


discriminator = discriminator_model(shape)
discriminator.compile(loss='binary_crossentropy',
                      optimizer=Adam(lr=0.0001, beta_1=0.5),
                      metrics=['accuracy'])

generator = generator_model(noise_dim)
generator.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0003, beta_1=0.5))

discriminator.trainable = False

gan = gan_model(generator, discriminator)
gan.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0003, beta_1=0.5))



losses = []
accuracies = []
iteration_checkpoints = []



def train(iterations, batch_size, sample_interval):
    X_train = load_images(&quot;./resized_images_40&quot;)
    X_train = X_train / 127.5 - 1.0
    real_label = np.ones((batch_size, 1))  # 修正
    fake_label = np.zeros((batch_size, 1))  # 修正

    for iteration in range(iterations):
        idx_real = np.random.randint(0, X_train.shape[0] - 1, batch_size)  # 修正
        idx_fake = np.random.randint(0, X_train.shape[0] - 1, batch_size)  # 修正
        batch_images_real = X_train[idx_real]
        batch_images_fake = X_train[idx_fake]
        
        # ノイズの生成時に正しい次元数を使用する
        z = np.random.normal(0, 1, (batch_size, noise_dim))  # 修正
        gene_imgs = generator.predict(z)

        d_loss_real = discriminator.train_on_batch(batch_images_real, real_label)  # 修正
        d_loss_fake = discriminator.train_on_batch(gene_imgs, fake_label)
        d_loss, accuracy = 0.5 * np.add(d_loss_real, d_loss_fake)

        z = np.random.normal(0, 1, (batch_size, noise_dim))
        g_loss = gan.train_on_batch(z, real_label)

        if (iteration + 1) % sample_interval == 0:
            losses.append((d_loss, g_loss))
            accuracies.append(100.0 * accuracy)
            iteration_checkpoints.append(iteration + 1)

            print(&quot;%d [D loss: %f, acc.: %.2f%%] [G loss: %f]&quot; % (iteration + 1, d_loss, 100.0 * accuracy, g_loss))
            save_images(generator, iteration + 1)


def save_images(generator, iteration, directory='face-gan_images', image_grid_rows=4, image_grid_columns=4):
    if not os.path.exists(directory):
        os.makedirs(directory)

    z = np.random.normal(0, 1, (image_grid_rows * image_grid_columns, noise_dim))
    gene_imgs = generator.predict(z)
    gene_imgs = 0.5 * gene_imgs + 0.5
    fig, axs = plt.subplots(image_grid_rows, image_grid_columns, figsize=(4, 4), sharey=True, sharex=True)
    cnt = 0
    for row in range(image_grid_rows):
        for col in range(image_grid_columns):
            axs[row, col].imshow(gene_imgs[cnt])
            axs[row, col].axis('off')
            cnt += 1

    fig.savefig(f&quot;{directory}/iteration_{iteration}.png&quot;)
    plt.close(fig)


def load_images(directory):
    images = []
    for filename in os.listdir(directory):
        img = cv2.imread(os.path.join(directory, filename))
        if img is not None:  # 画像の読み込みが成功した場合のみ処理を続行
            img = cv2.resize(img, (width, height))
            images.append(img)
        else:
            print(f&quot;Warning: Failed to load image {filename}&quot;)
    if len(images) == 0:
        print(&quot;Error: No images loaded&quot;)
        return None
    else:
        return np.array(images)


iterations = 20000
batch_size = 128
sample_interval = 1  
train(iterations, batch_size, sample_interval)
generator.save('40x40color-Face-gene.keras')
discriminator.save('40x40color-Face-dis.keras')
gan.save('40x40color-Face-gan.keras')
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Input, Dense, Reshape, Flatten, Dropout</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> BatchNormalization, Activation, ZeroPadding2D</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> LeakyReLU</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> UpSampling2D, Conv2D</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential, Model</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.optimizers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Adam</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> matplotlib.pyplot </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> plt</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> cv2</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">width </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">40</span></span>
<span class="line"><span style="color: #F8F8F2">height </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">40</span></span>
<span class="line"><span style="color: #F8F8F2">channels </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">3</span></span>
<span class="line"><span style="color: #F8F8F2">shape </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> (width, height, channels)</span></span>
<span class="line"><span style="color: #F8F8F2">noise_dim </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">100</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">generator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">noise_dim</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">256</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">activation</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_dim</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Reshape((</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">256</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(BatchNormalization(</span><span style="color: #FD971F; font-style: italic">momentum</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.8</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(UpSampling2D())</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(BatchNormalization(</span><span style="color: #FD971F; font-style: italic">momentum</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.8</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(UpSampling2D())</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">64</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(BatchNormalization(</span><span style="color: #FD971F; font-style: italic">momentum</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.8</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Activation(</span><span style="color: #E6DB74">&quot;tanh&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">discriminator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">shape</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_shape</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">shape, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">64</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Flatten())</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">activation</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;sigmoid&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">gan_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">discriminator</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(generator)</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(discriminator)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">discriminator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator_model(shape)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">                      </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0001</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">),</span></span>
<span class="line"><span style="color: #F8F8F2">                      </span><span style="color: #FD971F; font-style: italic">metrics</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[</span><span style="color: #E6DB74">&#39;accuracy&#39;</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">generator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator_model(noise_dim)</span></span>
<span class="line"><span style="color: #F8F8F2">generator.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0003</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">discriminator.trainable </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">gan </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gan_model(generator, discriminator)</span></span>
<span class="line"><span style="color: #F8F8F2">gan.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0003</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">losses </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">accuracies </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">iteration_checkpoints </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">train</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">iterations</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">sample_interval</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> load_images(</span><span style="color: #E6DB74">&quot;./resized_images_40&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train </span><span style="color: #F92672">/</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">127.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">-</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1.0</span></span>
<span class="line"><span style="color: #F8F8F2">    real_label </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.ones((batch_size, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"><span style="color: #F8F8F2">    fake_label </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.zeros((batch_size, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> iteration </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(iterations):</span></span>
<span class="line"><span style="color: #F8F8F2">        idx_real </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.randint(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, X_train.shape[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">] </span><span style="color: #F92672">-</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, batch_size)  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"><span style="color: #F8F8F2">        idx_fake </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.randint(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, X_train.shape[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">] </span><span style="color: #F92672">-</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, batch_size)  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"><span style="color: #F8F8F2">        batch_images_real </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train[idx_real]</span></span>
<span class="line"><span style="color: #F8F8F2">        batch_images_fake </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train[idx_fake]</span></span>
<span class="line"><span style="color: #F8F8F2">        </span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># ノイズの生成時に正しい次元数を使用する</span></span>
<span class="line"><span style="color: #F8F8F2">        z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (batch_size, noise_dim))  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"><span style="color: #F8F8F2">        gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(z)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_real </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator.train_on_batch(batch_images_real, real_label)  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_fake </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator.train_on_batch(gene_imgs, fake_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss, accuracy </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> np.add(d_loss_real, d_loss_fake)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (batch_size, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">        g_loss </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gan.train_on_batch(z, real_label)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> (iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> sample_interval </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            losses.append((d_loss, g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            accuracies.append(</span><span style="color: #AE81FF">100.0</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> accuracy)</span></span>
<span class="line"><span style="color: #F8F8F2">            iteration_checkpoints.append(iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> [D loss: </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">, acc.: </span><span style="color: #AE81FF">%.2f%%</span><span style="color: #E6DB74">] [G loss: </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">]&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, d_loss, </span><span style="color: #AE81FF">100.0</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> accuracy, g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            save_images(generator, iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">save_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">iteration</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">directory</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;face-gan_images&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_rows</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_columns</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> os.path.exists(directory):</span></span>
<span class="line"><span style="color: #F8F8F2">        os.makedirs(directory)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (image_grid_rows </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> image_grid_columns, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(z)</span></span>
<span class="line"><span style="color: #F8F8F2">    gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> gene_imgs </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span></span>
<span class="line"><span style="color: #F8F8F2">    fig, axs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> plt.subplots(image_grid_rows, image_grid_columns, </span><span style="color: #FD971F; font-style: italic">figsize</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">), </span><span style="color: #FD971F; font-style: italic">sharey</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">sharex</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    cnt </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> row </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_rows):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> col </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_columns):</span></span>
<span class="line"><span style="color: #F8F8F2">            axs[row, col].imshow(gene_imgs[cnt])</span></span>
<span class="line"><span style="color: #F8F8F2">            axs[row, col].axis(</span><span style="color: #E6DB74">&#39;off&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            cnt </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    fig.savefig(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">directory</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">/iteration_</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">iteration</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">.png&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    plt.close(fig)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">load_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">directory</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    images </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> filename </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> os.listdir(directory):</span></span>
<span class="line"><span style="color: #F8F8F2">        img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.imread(os.path.join(directory, filename))</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> img </span><span style="color: #F92672">is</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">:  </span><span style="color: #88846F"># 画像の読み込みが成功した場合のみ処理を続行</span></span>
<span class="line"><span style="color: #F8F8F2">            img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.resize(img, (width, height))</span></span>
<span class="line"><span style="color: #F8F8F2">            images.append(img)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;Warning: Failed to load image </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">filename</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(images) </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Error: No images loaded&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> np.array(images)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">iterations </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">20000</span></span>
<span class="line"><span style="color: #F8F8F2">batch_size </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">128</span></span>
<span class="line"><span style="color: #F8F8F2">sample_interval </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">train(iterations, batch_size, sample_interval)</span></span>
<span class="line"><span style="color: #F8F8F2">generator.save(</span><span style="color: #E6DB74">&#39;40x40color-Face-gene.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.save(</span><span style="color: #E6DB74">&#39;40x40color-Face-dis.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">gan.save(</span><span style="color: #E6DB74">&#39;40x40color-Face-gan.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc4">カラー画像の収集＋前処理</span></h3>



<p>では、早速やっていきましょう。まずは<strong>画像収集</strong>と<strong>前処理</strong>です。具体的なコードはこちらでやってみてください。↓</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1432/" title="【AI/実践編】画像収集～画像前処理方法【衝撃簡単⑥】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/a1f8f9b9f38944a2503d71b3764c0b3f.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】画像収集～画像前処理方法【衝撃簡単⑥】</div><div class="blogcard-snippet internal-blogcard-snippet">対象読者ここでは、機械学習における画像収集～前処理（サイズ変更・ファイル名変更・グレースケール化）を扱います。このページで紹介する内容は機械学習のサブ的な技術なのでコードの細かな解説などは割愛させていただきます。あくまでも...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.07</div></div></div></div></a>
</div></figure>



<p>ここのタスクで私がやったことをまとめます。</p>



<ol class="wp-block-list">
<li>独断と偏見から綺麗だと思う<strong>女性画像を100枚ずつ計400枚集める</strong><br>（有村架純・長澤まさみ・橋本環奈・パクジヒョ）</li>



<li>画像サイズを<span class="bold">40&#215;40に変更</span>する</li>



<li><strong>ファイル名を変更</strong>する</li>
</ol>



<p>この３ステップをここではやりました。また、先ほど提供した記事でこれらすべてのプログラムコードをのせているので、誰でも簡単にできますよ。</p>



<h3 class="wp-block-heading"><span id="toc5">モジュール準備</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import matplotlib.pyplot as plt
import numpy as np
from keras.layers import Dense, Flatten,Reshape, LeakyReLU 
from keras.models import Sequential
from keras.optimizers import Adam
import os
from keras.layers import Activation,Dropout,BatchNormalization
#上記↑は『衝撃簡単５』と同じ
from keras.layers import Conv2D
from keras.layers import UpSampling2D
import cv2
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> matplotlib.pyplot </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> plt</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Dense, Flatten,Reshape, LeakyReLU </span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.optimizers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Adam</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Activation,Dropout,BatchNormalization</span></span>
<span class="line"><span style="color: #88846F">#上記↑は『衝撃簡単５』と同じ</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Conv2D</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> UpSampling2D</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> cv2</span></span>
<span class="line"></span></code></pre></div>



<p><span class="bold-green">from keras.layers import Conv2D<br></span>＃Conv2Dは入力データ（通常は画像や特徴マップ）に対して畳み込み演算を適用し、新しい特徴マップを生成するライブラリ<br><br><span class="bold-green"><strong>from keras.layers import UpSampling2D</strong><br></span>＃<strong>Upsampling2D</strong>はアップサンプリングプロセスを行うためのライブラリ。<br>＃<span class="bold-red">Conv2DTranspose</span>を使いたいが、計算量が大きくなってしまうのでやめました。<br><br><span class="bold-green">import cv2<br></span>＃cv2は画像処理に使われるライブラリ</p>



<h3 class="wp-block-heading"><span id="toc6">生成画像の型を定義</span></h3>



<p>生成する画像の型を定義します。幅と高さを自分の生成したい大きさに調整します。また、チャンネルはカラーなので３にします。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="width = 40
height = 40
channels = 3
shape = (width, height, channels)
noise_dim = 100" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">width </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">40</span></span>
<span class="line"><span style="color: #F8F8F2">height </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">40</span></span>
<span class="line"><span style="color: #F8F8F2">channels </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">3</span></span>
<span class="line"><span style="color: #F8F8F2">shape </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> (width, height, channels)</span></span>
<span class="line"><span style="color: #F8F8F2">noise_dim </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">100</span></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc7">生成器（ジェネレーター）モデルを定義</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def generator_model(noise_dim):
    model = Sequential()
    model.add(Dense(10 * 10 * 256, activation=&quot;relu&quot;, input_dim=noise_dim))
    model.add(Reshape((10, 10, 256)))
    model.add(BatchNormalization(momentum=0.8))
    model.add(UpSampling2D())

    model.add(Conv2D(128, kernel_size=3, padding=&quot;same&quot;))
    model.add(Activation(&quot;relu&quot;))
    model.add(BatchNormalization(momentum=0.8))
    model.add(UpSampling2D())


    model.add(Conv2D(64, kernel_size=3, padding=&quot;same&quot;))
    model.add(Activation(&quot;relu&quot;))
    model.add(BatchNormalization(momentum=0.8))

    model.add(Conv2D(3, kernel_size=3, padding=&quot;same&quot;))
    model.add(Activation(&quot;tanh&quot;))
    return model" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">generator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">noise_dim</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">256</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">activation</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_dim</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Reshape((</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">256</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(BatchNormalization(</span><span style="color: #FD971F; font-style: italic">momentum</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.8</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(UpSampling2D())</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(BatchNormalization(</span><span style="color: #FD971F; font-style: italic">momentum</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.8</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(UpSampling2D())</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">64</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(BatchNormalization(</span><span style="color: #FD971F; font-style: italic">momentum</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.8</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Activation(</span><span style="color: #E6DB74">&quot;tanh&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span></code></pre></div>



<p><span class="bold-green">model.add(Dense(10 * 10 * 256, activation=&#8221;relu&#8221;, input_dim=noise_dim))</span><br>＃<code>10 * 10 * 256</code>は、<span class="red">出力の次元数</span>を指定しており、<code>10 * 10 * 256</code>個のニューロンを持つ層を定義している。<br>＃10は、アップサンプリングの数から導く。もし、アップサンプリング数が１つなら20を設定する。。<br><br><code><span class="bold-green">model.add(Reshape((10, 10, 256)))</span></code><br>＃直前の全結合層からの出力を<code>(10, 10, 256)</code>の形状に変更している。→テンソルを<span class="red">3次元の画像形式に変換</span>できる<br><br><span class="bold-green"><code>model.add(BatchNormalization(momentum=0.8))</code><br></span>＃:学習を安定化し、収束を加速するための手法を用いる<br>＃<code><strong>momentum=0.8</strong></code>は、モーメンタムの値を指定する。更新において、ほぼ前回の更新の80％を保持して次のステップに反映させる。<br>＃<strong>モーメンタム</strong>：収束速度を向上させ、<span class="red">局所的最適解からの脱出</span>を助ける効果。一般的な値は0.9。</p>



<p><span class="bold-green"><code>model.add(UpSampling2D())</code><br></span># <strong>アップサンプリング</strong>は、画像のサイズを拡大する操作であり、ここでは<span class="red">画像を拡大</span>している。デフォルトでは<span class="red">2倍に拡大</span>される。→<span class="red">Dense層の入力はアップサンプリングを考慮</span>する必要がある。<br><br><span class="bold-green"><code>model.add(Conv2D(128, kernel_size=3, padding="same"))</code><br></span>＃<code><strong>Conv2D</strong></code>は、<span class="red">2次元の畳み込み</span>を行う層。画像データの処理において、畳み込み層はフィルター（カーネル）を用いて画像の特徴を抽出する<br>＃引数は、畳み込み演算に使用するフィルターの数を指定している。ここでは128個のフィルターを使用している→128個は、モデルが十分な表現力を持ちつつも、計算コストを抑えつつ、多様な特徴を捉えるためのバランスの取れた選択肢<br>＃<code><strong>kernel_size=3</strong></code>は、畳み込み演算に使用する<span class="green"><span class="red">フィルターのサイズ</span></span>を指定しています。ここでは3&#215;3のフィルター<br>＃<code><strong>padding="same"</strong></code>は、<span class="green"><span class="red">入力と出力のサイズを同じ</span></span>に保つために、入力画像の周囲にパディングを追加することを指定してる<br><br>＊以降は、繰り返しなので割愛<br><br><span class="bold-green">model.add(Activation(&#8220;tanh&#8221;))<br></span>＃<strong>tanh関数</strong>は、入力が無限に広がる範囲の実数を、 <span class="red">-1 から 1 の範囲</span>にマッピングする関数→生成された画像のピクセル値を調整し、モデルが学習しやすくするために役立つ<br>＃<strong>tanh関数</strong>は0 を中心とした対称的な出力を持つ→勾配の<span class="red">効率的な伝播</span>を可能にする</p>



<!-- START MoshimoAffiliateEasyLink -->
<script type="text/javascript">
(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;
b[a]=b[a]||function(){arguments.currentScript=c.currentScript
||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};
c.getElementById(a)||(d=c.createElement(f),d.src=g,
d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})
(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");
msmaflink({"n":"実践GAN 敵対的生成ネットワークによる深層学習 （Compass Booksシリーズ） [ Jakub Langr ]","b":"","t":"","d":"https:\/\/thumbnail.image.rakuten.co.jp","c_p":"\/@0_mall\/book\/cabinet\/7710","p":["\/9784839967710.jpg","\/9784839967710_2.jpg","\/9784839967710_3.jpg"],"u":{"u":"https:\/\/item.rakuten.co.jp\/book\/16191585\/","t":"rakuten","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/item.rakuten.co.jp\/book\/16191585\/","a_id":4440988,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":1}],"eid":"rtpB9","s":"s"});
</script>
<div id="msmaflink-rtpB9">リンク</div>
<!-- MoshimoAffiliateEasyLink END -->



<h3 class="wp-block-heading"><span id="toc8">識別器（ディスクリミネーター）を定義</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def discriminator_model(shape):
    model = Sequential()
    model.add(Conv2D(32, kernel_size=3, strides=2, input_shape=shape, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))
    model.add(Conv2D(64, kernel_size=3, strides=2, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))
    model.add(Conv2D(128, kernel_size=3, strides=2, padding=&quot;same&quot;))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(1, activation='sigmoid'))
    return model" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">discriminator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">shape</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_shape</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">shape, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">64</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;same&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Flatten())</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">activation</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;sigmoid&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span></code></pre></div>



<p>＃生成器と逆に、<strong>カーネルサイズの増加</strong>は、特徴の抽象化の階層を作成する一つの方法。<br>①最初の層は画像の<span class="red">低レベルの特徴</span>を取得し、<br>②その後の層はより<span class="red">抽象的な特徴</span>を取得します。<br>このような階層的な抽象化は、識別器が画像の本質的な特徴を理解するのに役立つ<br><br>＊このdiscriminatorコードは今までに何回も使っているので説明は割愛します。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1074/#toc6" title="【AI/実践編】DCGANで高画質化【衝撃簡単⑤】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】DCGANで高画質化【衝撃簡単⑤】</div><div class="blogcard-snippet internal-blogcard-snippet">衝撃簡単です。DCGANを使ってフェイク画像を作っていきましょう！ディープフェイクにも使われている技術を誰でも、簡単にできるようにまとめました。AI学習は座学よりも実践あるのみです！DCGANを体験していきましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.02</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading"><span id="toc9">DCGANモデルの定義とコンパイル</span></h3>



<p>生成器と識別器を結合してDCGANモデルを作成しましょう！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def gan_model(generator, discriminator):
    model = Sequential()
    model.add(generator)
    model.add(discriminator)
    return model" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">gan_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">discriminator</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(generator)</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(discriminator)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span></code></pre></div>



<p>これも今までに何回も登場しました。もはや定型文ですね。</p>



<h3 class="wp-block-heading"><span id="toc10">モデルのコンパイル</span></h3>



<p>パラメーターの設定をしていきましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="discriminator = discriminator_model(shape)
discriminator.compile(loss='binary_crossentropy',
                      optimizer=Adam(lr=0.0001, beta_1=0.5),
                      metrics=['accuracy'])

generator = generator_model(noise_dim)
generator.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0003, beta_1=0.5))

discriminator.trainable = False

gan = gan_model(generator, discriminator)
gan.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0003, beta_1=0.5))" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">discriminator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator_model(shape)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">                      </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0001</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">),</span></span>
<span class="line"><span style="color: #F8F8F2">                      </span><span style="color: #FD971F; font-style: italic">metrics</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[</span><span style="color: #E6DB74">&#39;accuracy&#39;</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">generator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator_model(noise_dim)</span></span>
<span class="line"><span style="color: #F8F8F2">generator.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0003</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">discriminator.trainable </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">gan </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gan_model(generator, discriminator)</span></span>
<span class="line"><span style="color: #F8F8F2">gan.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0003</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span></code></pre></div>



<p>こちらは、前回と一緒です。最初に見せたゴール画像よりも良質な画像を生成したい場合はカスタマイズして最適解を導いてみてください。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1074/#toc6" title="【AI/実践編】DCGANで高画質化【衝撃簡単⑤】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】DCGANで高画質化【衝撃簡単⑤】</div><div class="blogcard-snippet internal-blogcard-snippet">衝撃簡単です。DCGANを使ってフェイク画像を作っていきましょう！ディープフェイクにも使われている技術を誰でも、簡単にできるようにまとめました。AI学習は座学よりも実践あるのみです！DCGANを体験していきましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.02</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading"><span id="toc11">モデルの訓練</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="losses = []
accuracies = []
iteration_checkpoints = []

def train(iterations, batch_size, sample_interval):
    X_train = load_images(&quot;./resized_images_40&quot;)
    X_train = X_train / 127.5 - 1.0
    real_label = np.ones((batch_size, 1))  # 修正
    fake_label = np.zeros((batch_size, 1))  # 修正

    for iteration in range(iterations):
        idx_real = np.random.randint(0, X_train.shape[0] - 1, batch_size)  # 修正
        idx_fake = np.random.randint(0, X_train.shape[0] - 1, batch_size)  # 修正
        batch_images_real = X_train[idx_real]
        batch_images_fake = X_train[idx_fake]
        
        # ノイズの生成時に正しい次元数を使用する
        z = np.random.normal(0, 1, (batch_size, noise_dim))  # 修正
        gene_imgs = generator.predict(z)

        d_loss_real = discriminator.train_on_batch(batch_images_real, real_label)  # 修正
        d_loss_fake = discriminator.train_on_batch(gene_imgs, fake_label)
        d_loss, accuracy = 0.5 * np.add(d_loss_real, d_loss_fake)

        z = np.random.normal(0, 1, (batch_size, noise_dim))
        g_loss = gan.train_on_batch(z, real_label)

        if (iteration + 1) % sample_interval == 0:
            losses.append((d_loss, g_loss))
            accuracies.append(100.0 * accuracy)
            iteration_checkpoints.append(iteration + 1)

            print(&quot;%d [D loss: %f, acc.: %.2f%%] [G loss: %f]&quot; % (iteration + 1, d_loss, 100.0 * accuracy, g_loss))
            save_images(generator, iteration + 1)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">losses </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">accuracies </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">iteration_checkpoints </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">train</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">iterations</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">sample_interval</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> load_images(</span><span style="color: #E6DB74">&quot;./resized_images_40&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train </span><span style="color: #F92672">/</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">127.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">-</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1.0</span></span>
<span class="line"><span style="color: #F8F8F2">    real_label </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.ones((batch_size, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"><span style="color: #F8F8F2">    fake_label </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.zeros((batch_size, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> iteration </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(iterations):</span></span>
<span class="line"><span style="color: #F8F8F2">        idx_real </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.randint(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, X_train.shape[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">] </span><span style="color: #F92672">-</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, batch_size)  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"><span style="color: #F8F8F2">        idx_fake </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.randint(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, X_train.shape[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">] </span><span style="color: #F92672">-</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, batch_size)  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"><span style="color: #F8F8F2">        batch_images_real </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train[idx_real]</span></span>
<span class="line"><span style="color: #F8F8F2">        batch_images_fake </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train[idx_fake]</span></span>
<span class="line"><span style="color: #F8F8F2">        </span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># ノイズの生成時に正しい次元数を使用する</span></span>
<span class="line"><span style="color: #F8F8F2">        z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (batch_size, noise_dim))  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"><span style="color: #F8F8F2">        gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(z)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_real </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator.train_on_batch(batch_images_real, real_label)  </span><span style="color: #88846F"># 修正</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_fake </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator.train_on_batch(gene_imgs, fake_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss, accuracy </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> np.add(d_loss_real, d_loss_fake)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (batch_size, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">        g_loss </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gan.train_on_batch(z, real_label)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> (iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> sample_interval </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            losses.append((d_loss, g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            accuracies.append(</span><span style="color: #AE81FF">100.0</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> accuracy)</span></span>
<span class="line"><span style="color: #F8F8F2">            iteration_checkpoints.append(iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> [D loss: </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">, acc.: </span><span style="color: #AE81FF">%.2f%%</span><span style="color: #E6DB74">] [G loss: </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">]&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, d_loss, </span><span style="color: #AE81FF">100.0</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> accuracy, g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            save_images(generator, iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p><span class="bold-green"><code>losses = []</code>、<code>accuracies = []</code>、<code>iteration_checkpoints = []</code><br></span>＃損失、精度、およびイテレーションごとのチェックポイントを格納するための<span class="red">リストを初期化</span>。</p>



<p><span class="bold-green"><code>def train(iterations, batch_size, sample_interval):</code><br></span>＃<code>train</code> 関数を定義。この関数は、<span class="red">訓練のメインループ</span></p>



<p><span class="bold-green"><code>X_train = load_images("./resized_images_40")</code><br></span>＃<span class="red">画像データを読み込む</span>。<code>load_images</code> 関数は、指定されたディレクトリから画像を読み込む。(以降で定義)</p>



<p><span class="bold-green"><code>X_train = X_train / 127.5 - 1.0</code><br></span>＃画像の<span class="red">ピクセル値を正規化</span>。通常、画像のピクセル値は0から255の範囲だが、これを-1から1の範囲に変換。</p>



<p><span class="bold-green"><code>real_label = np.ones((batch_size, 1))</code></span><br><span class="bold-green"><code>fake_label = np.zeros((batch_size, 1))</code></span><br>＃本物の画像と偽物の画像のラベルを定義。</p>



<p><span class="bold-green"><code>for iteration in range(iterations):</code><br></span>＃指定されたイテレーション数だけ訓練を繰り返す<br><br><span class="bold-green"><code>idx_real = np.random.randint(0, X_train.shape[0] - 1, batch_size)</code><br><code>idx_fake = np.random.randint(0, X_train.shape[0] - 1, batch_size)</code></span><br>＃ランダムなインデックスを生成し、本物の画像と偽物の画像の<span class="red">バッチを選択</span>。<br>＃<strong><code>np.random.randint(a, b, size)</code> </strong>関数は、<span class="red"><code>a</code> 以上 <code>b</code> 未満の範囲</span>からランダムに整数を <code>size</code> 個生成する。<br><br><code><span class="bold-green">z = np.random.normal(0, 1, (batch_size, noise_dim))</span></code><br>＃正規分布からランダムな<span class="red">ノイズを生成</span>。これはGeneratorの入力として使用。</p>



<p><span class="bold-green"><code>gene_imgs = generator.predict(z)</code><br></span>＃Generatorを使用して、ノイズから<span class="red">偽の画像を生成</span>。</p>



<p><span class="bold-green"><code>d_loss_real = discriminator.train_on_batch(batch_images_real, real_label)</code><br><code>d_loss_fake = discriminator.train_on_batch(gene_imgs, fake_label)</code></span><br>＃<span class="red">Discriminatorを訓練</span>。本物の画像と偽物の画像をそれぞれ使用して損失を計算。<br>＃<strong><code>train_on_batch</code> メソッド</strong>は、<span class="red">バッチで訓練するため</span>に使用されます。このメソッドは、入力データと対応する正解ラベル（または目標値）を受け取り、モデルの重みを更新します。以下に、このメソッドの引数と使い方を説明します。</p>



<p><span class="bold-green"><code>d_loss, accuracy = 0.5 * np.add(d_loss_real, d_loss_fake)</code><br></span>＃<span class="red">Discriminatorの損失と精度</span>を計算します。</p>



<p><span class="bold-green"><code>g_loss = gan.train_on_batch(z, real_label)</code><br></span>＃<span class="red">GANモデルを訓練</span>。GANは、生成された画像を本物と誤認させるように学習します。<br>＃<code><strong>real_label</strong></code>は、生成器（Generator）の訓練時に使用される目標値。目標値として本物の画像に対応するラベルが与えられます。</p>



<p><span class="red"><span class="bold-green"><code>(iteration + 1) % sample_interval == 0</code><br></span></span>＃サンプル間隔ごとに、損失や精度を保存して結果を表示</p>



<p><span class="bold-green"><code>save_images(generator, iteration + 1)</code><br></span>＃生成された<span class="red">画像を保存</span></p>



<!-- START MoshimoAffiliateEasyLink -->
<script type="text/javascript">
(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;
b[a]=b[a]||function(){arguments.currentScript=c.currentScript
||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};
c.getElementById(a)||(d=c.createElement(f),d.src=g,
d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})
(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");
msmaflink({"n":"Pythonで機械学習入門 深層学習から敵対的生成ネットワークまで \/ 大関真之 【本】","b":"","t":"","d":"https:\/\/thumbnail.image.rakuten.co.jp","c_p":"","p":["\/@0_mall\/hmvjapan\/cabinet\/9532000\/9531400.jpg"],"u":{"u":"https:\/\/item.rakuten.co.jp\/hmvjapan\/9531400\/","t":"rakuten","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/item.rakuten.co.jp\/hmvjapan\/9531400\/","a_id":4440988,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":1}],"eid":"YJkbu","s":"s"});
</script>
<div id="msmaflink-YJkbu">リンク</div>
<!-- MoshimoAffiliateEasyLink END -->



<h3 class="wp-block-heading"><span id="toc12">画像ロードの関数を定義する</span></h3>



<p>今回は独自の画像データを使うので、モデルに画像を読み込ますためのロード関数が必要になります。ここでは、それを定義していきましょう！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def load_images(directory):
    images = []
    for filename in os.listdir(directory):
        img = cv2.imread(os.path.join(directory, filename))
        if img is not None:  # 画像の読み込みが成功した場合のみ処理を続行
            img = cv2.resize(img, (width, height))
            images.append(img)
        else:
            print(f&quot;Warning: Failed to load image {filename}&quot;)
    if len(images) == 0:
        print(&quot;Error: No images loaded&quot;)
        return None
    else:
        return np.array(images)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">load_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">directory</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    images </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> filename </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> os.listdir(directory):</span></span>
<span class="line"><span style="color: #F8F8F2">        img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.imread(os.path.join(directory, filename))</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> img </span><span style="color: #F92672">is</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span><span style="color: #F8F8F2">:  </span><span style="color: #88846F"># 画像の読み込みが成功した場合のみ処理を続行</span></span>
<span class="line"><span style="color: #F8F8F2">            img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.resize(img, (width, height))</span></span>
<span class="line"><span style="color: #F8F8F2">            images.append(img)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;Warning: Failed to load image </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">filename</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(images) </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;Error: No images loaded&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">None</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">else</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> np.array(images)</span></span></code></pre></div>



<p><span class="bold-green"><code>def load_images(directory):</code><br></span>＃<code>load_images</code> 関数を定義。この関数は、指定されたディレクトリから画像を読み込む<br><br><span class="bold-green"><code>images = []</code></span><br>＃画像を格納するための空のリスト <code>images</code> <br><br><span class="bold-green"><code>for filename in os.listdir(directory)</code>:<br></span>＃指定されたディレクトリ内のファイルを1つずつ反復処理する。<br><br><span class="bold-green"><code>img = cv2.imread(os.path.join(directory, filename))</code><br></span>＃<code><strong>os.path.join</strong></code> を使用して、ディレクトリと<span class="red">ファイル名を組み合わせ</span>てファイルのパスを作成<br>＃<code><strong>cv2.imread</strong></code> を使用して<span class="red">画像を読み込む</span>。<br><br><code><span class="bold-green">if img is not None</span></code>:<br>＃画像が正常に読み込まれたかどうかを<span class="red">チェック</span><br><br><span class="bold-green"><code>img = cv2.resize(img, (width, height))</code><br></span>＃読み込まれた画像を指定された幅と高さにリサイズ<br><br><code><span class="bold-green">images.append(img)</span></code><br>＃リサイズされた画像を <code>images</code> リストに追加します。</p>



<p><span class="bold-green"><code>else:</code><br></span>＃画像が読み込まれなかった場合（<code>img</code> が <code>None</code> の場合）に実行されるブロック</p>



<p><span class="bold-green"><code>print(f"Warning: Failed to load image {filename}")</code><br></span>＃警告メッセージを出力し、どの画像が<span class="red">読み込めなかったかを表示</span></p>



<p><span class="bold-green"><code>if len(images) == 0:</code><br></span>＃読み込まれた画像がない場合をチェックします。</p>



<p><span class="bold-green"><code>print("Error: No images loaded")</code><br></span>＃エラーメッセージを出力します。</p>



<p><span class="bold-green"><code>return None</code><br></span>＃画像が読み込まれなかった場合は <code>None</code> を返す<br><br><span class="bold-green"><code>else</code>:<br></span>＃それ以外の場合（画像が1つ以上読み込まれた場合）<br><br><span class="bold-green"><code>return np.array(images)</code><br></span>＃<code>images</code> リストをNumPy配列に変換して返す。 NumPy配列は、後続の処理で使用できる形式にデータを整形する。</p>



<p>これでモデルに独自の画像データを読み込むことができます。</p>



<h3 class="wp-block-heading"><span id="toc13">生成画像の保存</span></h3>



<p>画像を保存して目視できるようにしましょう！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def save_images(generator, iteration, directory='face-gan_images', image_grid_rows=4, image_grid_columns=4):
    if not os.path.exists(directory):
        os.makedirs(directory)

    z = np.random.normal(0, 1, (image_grid_rows * image_grid_columns, noise_dim))
    gene_imgs = generator.predict(z)
    gene_imgs = 0.5 * gene_imgs + 0.5
    fig, axs = plt.subplots(image_grid_rows, image_grid_columns, figsize=(4, 4), sharey=True, sharex=True)
    cnt = 0
    for row in range(image_grid_rows):
        for col in range(image_grid_columns):
            axs[row, col].imshow(gene_imgs[cnt])
            #カラーなので前回までのgene_imgs[cnt, :, :, 0], cmap='gray'は不要
            axs[row, col].axis('off')
            cnt += 1

    fig.savefig(f&quot;{directory}/iteration_{iteration}.png&quot;)
    plt.close(fig)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">save_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">iteration</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">directory</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;face-gan_images&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_rows</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_columns</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> os.path.exists(directory):</span></span>
<span class="line"><span style="color: #F8F8F2">        os.makedirs(directory)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (image_grid_rows </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> image_grid_columns, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(z)</span></span>
<span class="line"><span style="color: #F8F8F2">    gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> gene_imgs </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span></span>
<span class="line"><span style="color: #F8F8F2">    fig, axs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> plt.subplots(image_grid_rows, image_grid_columns, </span><span style="color: #FD971F; font-style: italic">figsize</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">), </span><span style="color: #FD971F; font-style: italic">sharey</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">sharex</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    cnt </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> row </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_rows):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> col </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_columns):</span></span>
<span class="line"><span style="color: #F8F8F2">            axs[row, col].imshow(gene_imgs[cnt])</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F">#カラーなので前回までのgene_imgs[cnt, :, :, 0], cmap=&#39;gray&#39;は不要</span></span>
<span class="line"><span style="color: #F8F8F2">            axs[row, col].axis(</span><span style="color: #E6DB74">&#39;off&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            cnt </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    fig.savefig(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">directory</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">/iteration_</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">iteration</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">.png&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    plt.close(fig)</span></span></code></pre></div>



<p>引数の<span class="bold-green">directory=</span>を変えないと、以前の保存画像に<span class="red">上書きされてしまう</span>ので、これは変えておきましょう！</p>



<h3 class="wp-block-heading"><span id="toc14">モデルの実行＆保存</span></h3>



<p>バッチサイズを変えると、学習に影響が出ます。それ以外のパラメーターはお好みでどうぞ！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="iterations = 20000
batch_size = 128
sample_interval = 100 
train(iterations, batch_size, sample_interval)
generator.save('40x40color-Face-gene.keras')
discriminator.save('40x40color-Face-dis.keras')
gan.save('40x40color-Face-gan.keras')" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">iterations </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">20000</span></span>
<span class="line"><span style="color: #F8F8F2">batch_size </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">128</span></span>
<span class="line"><span style="color: #F8F8F2">sample_interval </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">100</span><span style="color: #F8F8F2"> </span></span>
<span class="line"><span style="color: #F8F8F2">train(iterations, batch_size, sample_interval)</span></span>
<span class="line"><span style="color: #F8F8F2">generator.save(</span><span style="color: #E6DB74">&#39;40x40color-Face-gene.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.save(</span><span style="color: #E6DB74">&#39;40x40color-Face-dis.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">gan.save(</span><span style="color: #E6DB74">&#39;40x40color-Face-gan.keras&#39;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p>これもよく登場するので割愛します。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1074/#toc6" title="【AI/実践編】DCGANで高画質化【衝撃簡単⑤】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】DCGANで高画質化【衝撃簡単⑤】</div><div class="blogcard-snippet internal-blogcard-snippet">衝撃簡単です。DCGANを使ってフェイク画像を作っていきましょう！ディープフェイクにも使われている技術を誰でも、簡単にできるようにまとめました。AI学習は座学よりも実践あるのみです！DCGANを体験していきましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.02</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading"><span id="toc15">ファイルの実行</span></h3>



<p>では、実行していきましょう。実行方法は人それぞれですが、私の場合はCMDでファイル名を入力することで実行しています。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="ファイル名.py" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">ファイル名.py</span></span></code></pre></div>



<p>これで、いい感じの出力がされたら完了です！</p>



<h3 class="wp-block-heading"><span id="toc16">学習モデルで１枚ずつ確認してみよう！</span></h3>



<p>今までは、4&#215;4で画像を確認しましたが、サイズを大きく確認したいので１枚で出力されるようにしましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import numpy as np
import matplotlib.pyplot as plt
from keras.models import load_model
import os
import cv2
noise_dim=100
# 保存したGANモデルの読み込み
generator = load_model('40x40color-Face-gene.keras')

def generate_images(generator, save_directory, num_images=10):
    if not os.path.exists(save_directory):
        os.makedirs(save_directory)

    noise = np.random.normal(0, 1, (num_images, noise_dim))
    generated_images = generator.predict(noise)

    for i in range(num_images):
        img = (generated_images[i] + 1) / 2  # 画像のスケーリングを元に戻す
        plt.imshow(img)
        plt.axis('off')
        plt.savefig(f&quot;{save_directory}/generated_image_{i+1}.png&quot;)
        plt.close()

# 画像を保存するディレクトリと生成する画像の枚数を指定して実行
generate_images(generator, &quot;generated_images&quot;, num_images=40)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> matplotlib.pyplot </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> plt</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> load_model</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> cv2</span></span>
<span class="line"><span style="color: #F8F8F2">noise_dim</span><span style="color: #F92672">=</span><span style="color: #AE81FF">100</span></span>
<span class="line"><span style="color: #88846F"># 保存したGANモデルの読み込み</span></span>
<span class="line"><span style="color: #F8F8F2">generator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> load_model(</span><span style="color: #E6DB74">&#39;40x40color-Face-gene.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">generate_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">save_directory</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">num_images</span><span style="color: #F92672">=</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> os.path.exists(save_directory):</span></span>
<span class="line"><span style="color: #F8F8F2">        os.makedirs(save_directory)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    noise </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (num_images, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    generated_images </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(noise)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> i </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(num_images):</span></span>
<span class="line"><span style="color: #F8F8F2">        img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> (generated_images[i] </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">/</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">  </span><span style="color: #88846F"># 画像のスケーリングを元に戻す</span></span>
<span class="line"><span style="color: #F8F8F2">        plt.imshow(img)</span></span>
<span class="line"><span style="color: #F8F8F2">        plt.axis(</span><span style="color: #E6DB74">&#39;off&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        plt.savefig(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">save_directory</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">/generated_image_</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">i</span><span style="color: #F92672">+</span><span style="color: #AE81FF">1}</span><span style="color: #E6DB74">.png&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        plt.close()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># 画像を保存するディレクトリと生成する画像の枚数を指定して実行</span></span>
<span class="line"><span style="color: #F8F8F2">generate_images(generator, </span><span style="color: #E6DB74">&quot;generated_images&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">num_images</span><span style="color: #F92672">=</span><span style="color: #AE81FF">40</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p><span class="bold-green">generator = load_model(&#8217;40x40color-Face-gene.keras&#8217;)</span><br>＃括弧内には各自の学習済み生成器ファイル名を入れてください。<br><br><span class="bold-green">generate_images(generator, &#8220;generated_images&#8221;, num_images=40)</span><br>＃手動generated_imagesを作って、それを保存先ディレクトリに指定します。<br>＃num_images=40は保存する画像数です。</p>



<p>これで、大きなサイズで画像を確認できるようになりました。</p>



<h2 class="wp-block-heading"><span id="toc17">おわりに</span></h2>



<p>今回はカラー画像の生成方法を紹介しました。もっと、質を高めたい方は、層を複雑にしたりパラメーターの値をカスタマイズしてみてください。</p>



<p>では、次回はグレースケール画像で、サイズの大きな画像を生成できるようにします。流れは、今までやってきたことと同じなので、ササっとやっていきましょう！</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1478/" title="【AI/実装編】サイズの大きな画像を生成【衝撃簡単⑧】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実装編】サイズの大きな画像を生成【衝撃簡単⑧】</div><div class="blogcard-snippet internal-blogcard-snippet">【衝撃簡単】でDCGANモデルで大きな画像を生成していきます。流れはMNISTと同じです。初心者でもできるレベルの学習になので簡単にやっていきましょう。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.09</div></div></div></div></a>
</div></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【AI/実践編】DCGANで高画質化【衝撃簡単⑤】</title>
		<link>https://ascend-beyond.com/study/1074/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Sat, 02 Mar 2024 08:07:09 +0000</pubDate>
				<category><![CDATA[AI（人工知能）]]></category>
		<category><![CDATA[Study]]></category>
		<category><![CDATA[実践]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[独学]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=1074</guid>

					<description><![CDATA[目次 対象読者今回の全コードモジュールの準備生成画像の型を定義生成器（ジェネレーター）モデルを定義識別器(ディスクリミネーター)モデルを定義DCGANモデルの定義とコンパイルモデルのコンパイルモデルの訓練生成画像の保存モ [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">対象読者</a><ol><li><a href="#toc2" tabindex="0">今回の全コード</a></li><li><a href="#toc3" tabindex="0">モジュールの準備</a></li><li><a href="#toc4" tabindex="0">生成画像の型を定義</a></li><li><a href="#toc5" tabindex="0">生成器（ジェネレーター）モデルを定義</a></li><li><a href="#toc6" tabindex="0">識別器(ディスクリミネーター)モデルを定義</a></li><li><a href="#toc7" tabindex="0">DCGANモデルの定義とコンパイル</a></li><li><a href="#toc8" tabindex="0">モデルのコンパイル</a></li><li><a href="#toc9" tabindex="0">モデルの訓練</a></li><li><a href="#toc10" tabindex="0">生成画像の保存</a></li><li><a href="#toc11" tabindex="0">モデルの実行</a></li><li><a href="#toc12" tabindex="0">モデルの保存とロード方法</a></li><li><a href="#toc13" tabindex="0">ファイルの実行</a></li><li><a href="#toc14" tabindex="0">出力例</a></li></ol></li><li><a href="#toc15" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">対象読者</span></h2>



<p>今回はGANに畳み込み層を追加して、よりリアルな偽物画像を生成していきます（DCGAN）。</p>



<p>DCGANモデルを使って、MNISTデータに似た画像（偽物）を生成して、前回よりも、より鮮明で、<strong>本物と見分けがつかないレベルまで学習</strong>することをやっていきましょう！</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/03/f0bae9f82d03dbe4396184f220bb5706-1024x576.png" alt="DCGAN" class="wp-image-1182" style="width:839px;height:auto" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/f0bae9f82d03dbe4396184f220bb5706-1024x576.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/f0bae9f82d03dbe4396184f220bb5706-300x169.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/f0bae9f82d03dbe4396184f220bb5706-768x432.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/f0bae9f82d03dbe4396184f220bb5706-120x68.png 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/f0bae9f82d03dbe4396184f220bb5706-160x90.png 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/f0bae9f82d03dbe4396184f220bb5706-320x180.png 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/f0bae9f82d03dbe4396184f220bb5706.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">DCGANを使ったイテレーション遷移</figcaption></figure>



<p>では、ただのGAN(前回)とDCGAN(今回)と本物のMNIST画像を比較してみましょう。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="414" src="https://ascend-beyond.com/wp-content/uploads/2024/03/904d4c46c819b6f6aabe7faa0e05048a-1-1024x414.png" alt="DCGAN　比較" class="wp-image-1184" style="width:840px;height:auto" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/904d4c46c819b6f6aabe7faa0e05048a-1-1024x414.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/904d4c46c819b6f6aabe7faa0e05048a-1-300x121.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/904d4c46c819b6f6aabe7faa0e05048a-1-768x311.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/904d4c46c819b6f6aabe7faa0e05048a-1.png 1280w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">GANとDCGANと本物ラベルの比較</figcaption></figure>



<p>どうですか？もう、本物と見分けがつきませんよね。たまにニュースで聞くディープフェイクなんかもこの技術が使われたりします。そんなすごい技術を今日は簡単に構築していきます。</p>



<p>また、今日はほとんど<span class="red">前回とコーディングが被っているので楽にできますよ～</span>。<br>そのため、細かい解説などは割愛させていただきます。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1002/" title="【AI/実践編】生成AI-GANを実装【衝撃簡単④】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】生成AI-GANを実装【衝撃簡単④】</div><div class="blogcard-snippet internal-blogcard-snippet">AIの深い原理が分からなくても作れます！今日はそんなAI技術を実践していきます。GANと呼ばれる画像生成AIを構築していきます。深い原理や、複雑な数学的思考は必要ありません。いまや、AIはパズル間隔でできる技術になっています。原理が分からなくても、実践でどんどん原理なんて補ってやりましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.27</div></div></div></div></a>
</div><figcaption class="wp-element-caption">前回</figcaption></figure>



<h3 class="wp-block-heading"><span id="toc2">今回の全コード</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import matplotlib.pyplot as plt
import numpy as np
from keras.datasets import mnist
import os
from keras.layers import Dense, Flatten, Reshape, LeakyReLU, Dropout
from keras.models import Sequential
from keras.optimizers import Adam

from keras.layers import Activation, BatchNormalization
from keras.layers import Conv2D, Conv2DTranspose

width = 28
height = 28
channels = 1
shape = (width, height, channels)
noise_dim = 100

def generator_model(noise_dim):
    model = Sequential()
    model.add(Dense(256 * 7 * 7, input_dim=noise_dim))
    model.add(Reshape((7, 7, 256)))
    model.add(Conv2DTranspose(128, kernel_size=3, strides=2, padding='same'))
    model.add(BatchNormalization())

    model.add(LeakyReLU(alpha=0.01))

    model.add(Conv2DTranspose(64, kernel_size=3, strides=1, padding='same'))
    model.add(BatchNormalization())
    model.add(LeakyReLU(alpha=0.01))
    model.add(Conv2DTranspose(1, kernel_size=3, strides=2, padding='same'))
    model.add(Activation('tanh'))
    return model



def discriminator_model(shape):
    model = Sequential()
    model.add(Conv2D(32, kernel_size=3, strides=2, input_shape=shape, padding='same'))
    model.add(LeakyReLU(alpha=0.01))
    
    model.add(Dropout(0.25))
    model.add(Conv2D(64, kernel_size=3, strides=2, padding='same'))
    model.add(LeakyReLU(alpha=0.01))
    model.add(Conv2D(128, kernel_size=3, strides=2, padding='same'))
    model.add(LeakyReLU(alpha=0.01))
    model.add(Flatten())
    model.add(Dense(1, activation='sigmoid'))
    return model

def gan_model(generator, discriminator):
    model = Sequential()
    model.add(generator)
    model.add(discriminator)
    return model

discriminator = discriminator_model(shape)
discriminator.compile(loss='binary_crossentropy',
                      optimizer=Adam(lr=0.0001, beta_1=0.5),
                      metrics=['accuracy'])

generator = generator_model(noise_dim)
generator.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0003, beta_1=0.5))

discriminator.trainable = False

gan = gan_model(generator, discriminator)
gan.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0003, beta_1=0.5))

losses = []
accuracies = []
iteration_checkpoints = []

def train(iterations, batch_size, sample_interval):
    (X_train, _), (_, _) = mnist.load_data()
    X_train = X_train / 127.5 - 1.0
    X_train = np.expand_dims(X_train, axis=3)
    real_label = np.ones((batch_size, 1))
    fake_label = np.zeros((batch_size, 1))

    for iteration in range(iterations):
        idx = np.random.randint(0, X_train.shape[0], batch_size)
        batch_images = X_train[idx]
        z = np.random.normal(0, 1, (batch_size, noise_dim))
        gene_imgs = generator.predict(z)

        d_loss_real = discriminator.train_on_batch(batch_images, real_label)
        d_loss_fake = discriminator.train_on_batch(gene_imgs, fake_label)
        d_loss, accuracy = 0.5 * np.add(d_loss_real, d_loss_fake)

        z = np.random.normal(0, 1, (batch_size, noise_dim))
        g_loss = gan.train_on_batch(z, real_label)


        if (iteration + 1) % sample_interval == 0:
            losses.append((d_loss, g_loss))
            accuracies.append(100.0 * accuracy)
            iteration_checkpoints.append(iteration + 1)

            print(&quot;%d [D loss: %f, acc.: %.2f%%] [G loss: %f]&quot; % (iteration + 1, d_loss, 100.0 * accuracy, g_loss))
            save_images(generator, iteration + 1)



def save_images(generator, iteration, directory='dcgan_images', image_grid_rows=4, image_grid_columns=4):
    if not os.path.exists(directory):
        os.makedirs(directory)

    z = np.random.normal(0, 1, (image_grid_rows * image_grid_columns, noise_dim))
    gene_imgs = generator.predict(z)
    gene_imgs = 0.5 * gene_imgs + 0.5
    fig, axs = plt.subplots(image_grid_rows, image_grid_columns, figsize=(4, 4), sharey=True, sharex=True)
    cnt = 0
    for row in range(image_grid_rows):
        for col in range(image_grid_columns):
            axs[row, col].imshow(gene_imgs[cnt, :, :, 0], cmap='gray')
            axs[row, col].axis('off')
            cnt += 1

    fig.savefig(f&quot;{directory}/iteration_{iteration}.png&quot;)
    plt.close(fig)

iterations = 20000
batch_size = 128
sample_interval = 50  

train(iterations, batch_size, sample_interval)
generator.save('DC_generator.keras')
discriminator.save('DC_discriminator.keras')
gan.save('dcgan_model.keras')" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> matplotlib.pyplot </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> plt</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.datasets </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> mnist</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Dense, Flatten, Reshape, LeakyReLU, Dropout</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.optimizers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Adam</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Activation, BatchNormalization</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Conv2D, Conv2DTranspose</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">width </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">28</span></span>
<span class="line"><span style="color: #F8F8F2">height </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">28</span></span>
<span class="line"><span style="color: #F8F8F2">channels </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"><span style="color: #F8F8F2">shape </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> (width, height, channels)</span></span>
<span class="line"><span style="color: #F8F8F2">noise_dim </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">100</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">generator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">noise_dim</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">256</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">7</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">7</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_dim</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Reshape((</span><span style="color: #AE81FF">7</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">7</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">256</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2DTranspose(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(BatchNormalization())</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2DTranspose(</span><span style="color: #AE81FF">64</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(BatchNormalization())</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2DTranspose(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Activation(</span><span style="color: #E6DB74">&#39;tanh&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">discriminator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">shape</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_shape</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">shape, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">64</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Flatten())</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">activation</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;sigmoid&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">gan_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">discriminator</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(generator)</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(discriminator)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">discriminator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator_model(shape)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">                      </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0001</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">),</span></span>
<span class="line"><span style="color: #F8F8F2">                      </span><span style="color: #FD971F; font-style: italic">metrics</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[</span><span style="color: #E6DB74">&#39;accuracy&#39;</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">generator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator_model(noise_dim)</span></span>
<span class="line"><span style="color: #F8F8F2">generator.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0003</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">discriminator.trainable </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">gan </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gan_model(generator, discriminator)</span></span>
<span class="line"><span style="color: #F8F8F2">gan.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0003</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">losses </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">accuracies </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">iteration_checkpoints </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">train</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">iterations</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">sample_interval</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    (X_train, _), (_, _) </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> mnist.load_data()</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train </span><span style="color: #F92672">/</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">127.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">-</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1.0</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.expand_dims(X_train, </span><span style="color: #FD971F; font-style: italic">axis</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    real_label </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.ones((batch_size, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    fake_label </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.zeros((batch_size, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> iteration </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(iterations):</span></span>
<span class="line"><span style="color: #F8F8F2">        idx </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.randint(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, X_train.shape[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], batch_size)</span></span>
<span class="line"><span style="color: #F8F8F2">        batch_images </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train[idx]</span></span>
<span class="line"><span style="color: #F8F8F2">        z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (batch_size, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">        gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(z)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_real </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator.train_on_batch(batch_images, real_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_fake </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator.train_on_batch(gene_imgs, fake_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss, accuracy </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> np.add(d_loss_real, d_loss_fake)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (batch_size, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">        g_loss </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gan.train_on_batch(z, real_label)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> (iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> sample_interval </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            losses.append((d_loss, g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            accuracies.append(</span><span style="color: #AE81FF">100.0</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> accuracy)</span></span>
<span class="line"><span style="color: #F8F8F2">            iteration_checkpoints.append(iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> [D loss: </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">, acc.: </span><span style="color: #AE81FF">%.2f%%</span><span style="color: #E6DB74">] [G loss: </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">]&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, d_loss, </span><span style="color: #AE81FF">100.0</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> accuracy, g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            save_images(generator, iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">save_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">iteration</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">directory</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;dcgan_images&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_rows</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_columns</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> os.path.exists(directory):</span></span>
<span class="line"><span style="color: #F8F8F2">        os.makedirs(directory)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (image_grid_rows </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> image_grid_columns, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(z)</span></span>
<span class="line"><span style="color: #F8F8F2">    gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> gene_imgs </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span></span>
<span class="line"><span style="color: #F8F8F2">    fig, axs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> plt.subplots(image_grid_rows, image_grid_columns, </span><span style="color: #FD971F; font-style: italic">figsize</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">), </span><span style="color: #FD971F; font-style: italic">sharey</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">sharex</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    cnt </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> row </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_rows):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> col </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_columns):</span></span>
<span class="line"><span style="color: #F8F8F2">            axs[row, col].imshow(gene_imgs[cnt, :, :, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], </span><span style="color: #FD971F; font-style: italic">cmap</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;gray&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            axs[row, col].axis(</span><span style="color: #E6DB74">&#39;off&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            cnt </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    fig.savefig(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">directory</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">/iteration_</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">iteration</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">.png&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    plt.close(fig)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">iterations </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">20000</span></span>
<span class="line"><span style="color: #F8F8F2">batch_size </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">128</span></span>
<span class="line"><span style="color: #F8F8F2">sample_interval </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">50</span><span style="color: #F8F8F2">  </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">train(iterations, batch_size, sample_interval)</span></span>
<span class="line"><span style="color: #F8F8F2">generator.save(</span><span style="color: #E6DB74">&#39;DC_generator.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.save(</span><span style="color: #E6DB74">&#39;DC_discriminator.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">gan.save(</span><span style="color: #E6DB74">&#39;dcgan_model.keras&#39;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc3">モジュールの準備</span></h3>



<p>必要な素材をまずは準備しましょう！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import matplotlib.pyplot as plt
import numpy as np
from keras.datasets import mnist

from keras.layers import Dense, Flatten, Reshape,LeakyReLU
from keras.models import Sequential
from keras.optimizers import Adam
import os
#上記↑は前回と同じ
from keras.layers import Activation, Dropout,BatchNormalization
from keras.layers import Conv2D, Conv2DTranspose" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> matplotlib.pyplot </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> plt</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.datasets </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> mnist</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Dense, Flatten, Reshape,LeakyReLU</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.optimizers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Adam</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"><span style="color: #88846F">#上記↑は前回と同じ</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Activation, Dropout,BatchNormalization</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Conv2D, Conv2DTranspose</span></span></code></pre></div>



<p><code><span class="bold-green">from keras.layers import Activation, Dropout, BatchNormalization</span></code><br>＃Kerasの<code>layers</code>モジュールから<code>Activation</code>、<code>Dropout</code>、<code>BatchNormalization</code>クラスをインポートしています。<br>＃<code><strong>Activation</strong></code>は活性化関数を定義するために使用されます。ニューラルネットワークの各層で活性化関数が適用され、モデルの非線形性を導入します。<br>＃<code><strong>Dropout</strong></code>は、<span class="marker-under">過学習を防ぐため</span>にランダムにノードを無効にすることによって、ネットワークの一部を無効にします。これにより、モデルが特定のパターンに過度に適合するのを防ぎます。<br>＃<code><strong><span class="bold-red">BatchNormalization</span></strong></code>は、トレーニングプロセス中に層の出力を標準化することによって、学習を安定化させ、収束を早めます。各バッチごとに平均と分散を計算することで、モデルが訓練データに過剰に適合する（過学習）リスクを軽減します。<br><br><code><span class="bold-green">from keras.layers import Conv2D, Conv2DTranspose</span></code><br>＃Kerasの<code>layers</code>モジュールから<code>Conv2D</code>と<code>Conv2DTranspose</code>クラスをインポートしています。<br>＃<code>Conv2D</code>は、<span class="marker-under">2次元の畳み込み層</span>を表します。畳み込み演算は、画像や音声などのデータで局所的なパターンを検出するのに使用されます。<br>＃<code>Conv2DTranspose</code>は、<span class="bold-red">転置畳み込み</span>と呼ばれる操作を行います。これは、畳み込み演算の逆操作であり、<span class="marker-under">入力の次元を増やすため</span>に使用されます。一般的には、画像のアップサンプリングやセグメンテーションなどのタスクで使用されます。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1177/" title="【AI/座学】GANパラメーター調整のコツ・極意書" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-160x90.png 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-300x169.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-1024x576.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-768x432.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-120x68.png 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-320x180.png 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1.png 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/座学】GANパラメーター調整のコツ・極意書</div><div class="blogcard-snippet internal-blogcard-snippet">GANモデルは学習が不安定になりがちです。それを見ると、私の心も不安定(なんちゃって)。ここでは、そんな学習も心も不安定になってしまった人に向けての、GANモデルパラメーター調整のコツを紹介します。私の過去からの経験から【これは効果あった】や一般論をまとめています。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.02</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading"><span id="toc4">生成画像の型を定義</span></h3>



<p>出力される画像の型を定義しておきましょう！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="width=28
height=28
channels=1
shape=(width,height,channels)
noise_dim=100" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">width</span><span style="color: #F92672">=</span><span style="color: #AE81FF">28</span></span>
<span class="line"><span style="color: #F8F8F2">height</span><span style="color: #F92672">=</span><span style="color: #AE81FF">28</span></span>
<span class="line"><span style="color: #F8F8F2">channels</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span></span>
<span class="line"><span style="color: #F8F8F2">shape</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(width,height,channels)</span></span>
<span class="line"><span style="color: #F8F8F2">noise_dim</span><span style="color: #F92672">=</span><span style="color: #AE81FF">100</span></span></code></pre></div>



<p>前回と同じのため解説は割愛します。</p>



<h3 class="wp-block-heading"><span id="toc5">生成器（ジェネレーター）モデルを定義</span></h3>



<p>ここで、畳み込み技術を用いてよりリアルな画像を生成できる仕組みを作っていきましょう！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def generator_model(noise_dim):
    model = Sequential()
    model.add(Dense(256 * 7 * 7, input_dim=noise_dim))
    model.add(Reshape((7, 7, 256)))
    model.add(Conv2DTranspose(128, kernel_size=3, strides=2, padding='same'))
    model.add(BatchNormalization())

    model.add(LeakyReLU(alpha=0.01))

    model.add(Conv2DTranspose(64, kernel_size=3, strides=1, padding='same'))
    model.add(BatchNormalization())
    model.add(LeakyReLU(alpha=0.01))
    model.add(Conv2DTranspose(1, kernel_size=3, strides=2, padding='same'))
    model.add(Activation('tanh'))
    return model" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">generator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">noise_dim</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">256</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">7</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">7</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_dim</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Reshape((</span><span style="color: #AE81FF">7</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">7</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">256</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2DTranspose(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(BatchNormalization())</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2DTranspose(</span><span style="color: #AE81FF">64</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(BatchNormalization())</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2DTranspose(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Activation(</span><span style="color: #E6DB74">&#39;tanh&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span></code></pre></div>



<p><span class="bold-green"><code>def generator_model(noise_dim)</code>:</span><br>＃<code>generator_model</code>という関数を定義しています。この関数は、ノイズの次元数（<code>noise_dim</code>）を引数として受け取ります。<br><br><code><span class="bold-green">model = Sequential()</span></code><br>＃Sequentialモデルを作成します。Sequentialモデルは、層を積み重ねてシーケンシャルにネットワークを構築するためのKerasの一般的な方法です。<br><br><span class="bold-green"><code>model.add(Dense(256*7*7, input_dim=noise_dim))</code></span><br>＃全結合層（Dense層）を追加します。入力次元は<code>noise_dim</code>で指定されたノイズの次元数です。出力次元は<span class="bold-red">256 * 7 * 7</span>であり、これは後続の畳み込み層に適した形状です。<br><br><code><span class="bold-green">model.add(Reshape((7, 7, 256)))</span></code><br>＃<code>Reshape</code>層を追加して、出力を<span class="bold-red">3次元テンソル</span>に変形します。ここでは、出力を (<span class="bold-red">7, 7, 256</span>) の形状に変形しています。<br><br><code><span class="bold-green">model.add(Conv2DTranspose(128, kernel_size=3, strides=2, padding='same'))</span></code><br>＃転置畳み込み層（Conv2DTranspose層）を追加します。これにより、<span class="bold-red">特徴マップ</span>のサイズが拡大されます。<span class="bold-red">128個</span>のフィルターを使用し、カーネルサイズは<span class="bold-red">3&#215;3</span>です。また、<span class="bold-red">ストライドは2</span>で、<span class="bold-red">パディングは&#8217;same&#8217;</span>です。</p>



<p><span class="bold-green"><code>model.add(BatchNormalization())</code><br></span>＃<span class="bold-red">BatchNormalization層</span>を追加して、ネットワークの安定化と学習の収束を改善します。</p>



<p><span class="bold-green"><code>model.add(LeakyReLU(alpha=0.01))</code><br></span>＃LeakyReLU活性化関数を追加します。これは、通常のReLU関数に比べて負の領域でわずかに傾いた特性を持ち、勾配消失問題を緩和します。<br><br><span class="bold-red">model.add(Conv2DTranspose(64, kernel_size=3, strides=1, padding=&#8217;same&#8217;))</span><br>#64<br>: 出力フィルター数。つまり、このレイヤーが出力する特徴マップの数です。<br><br>＃kernel_size=3<br>: カーネル（フィルター）のサイズ。この場合、3&#215;3のカーネルが使用されます。</p>



<p>strides=1<br>: ストライドのサイズ。畳み込み操作を適用する際の移動量を指定します。この場合、ストライドは1となります。</p>



<p>padding=&#8217;same&#8217;<br>: パディングの種類を指定します。&#8217;same&#8217;を指定することで、入力と同じサイズの出力が得られるように入力にパディングが追加されます。<br><br><span class="bold-red"><span class="bold-green">model.add(BatchNormalization())<br>model.add(LeakyReLU(alpha=0.01))</span><br></span>#上記で解説済み<br><br><span class="bold-green"><code>model.add(Conv2DTranspose(1, kernel_size=3, strides=2, padding='same'))</code></span><br>＃最後の転置畳み込み層では、<span class="bold-red">1</span>つのチャンネルの画像が生成されます（<code>kernel_size</code>、<code>strides</code>、<code>padding</code>によってサイズが調整されます）。</p>



<p><span class="bold-green"><code>model.add(Activation('tanh'))</code><br></span>＃<span class="bold-red">tanh活性化関数</span>が適用されます。これにより、出力が[-1, 1]の範囲にスケーリングされます。これは、一般的に画像のピクセル値がこの範囲に収まるようにするためです。<br><br><span class="bold-green"><code>return mode</code>l<br></span>#完成した生成器モデルを返します。</p>



<h3 class="wp-block-heading"><span id="toc6">識別器(ディスクリミネーター)モデルを定義</span></h3>



<p>識別器も作っていきましょう。また、識別器は生成器よりも強くなりやすいので、Dropoutを追加したり、正規化は行わず性能を上げ過ぎないようにします。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def discriminator_model(shape):
    model = Sequential()
    model.add(Conv2D(32, kernel_size=3, strides=2, input_shape=shape, padding='same'))
    model.add(LeakyReLU(alpha=0.01))
    model.add(Dropout(0.25))
    model.add(Conv2D(64, kernel_size=3, strides=2, padding='same'))
    model.add(LeakyReLU(alpha=0.01))
    model.add(Conv2D(128, kernel_size=3, strides=2, padding='same'))
    model.add(LeakyReLU(alpha=0.01))
    model.add(Flatten())
    model.add(Dense(1, activation='sigmoid'))
    return model" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">discriminator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">shape</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_shape</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">shape, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dropout(</span><span style="color: #AE81FF">0.25</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">64</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Conv2D(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">kernel_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">strides</span><span style="color: #F92672">=</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">padding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;same&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Flatten())</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">activation</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;sigmoid&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span></code></pre></div>



<p><span class="bold-green"><code>def discriminator_model(shape)</code>:</span><br>＃<code>discriminator_model</code>という関数を定義しています。この関数は、入力画像の形状（<code>shape</code>）を引数として受け取ります。</p>



<p><span class="bold-green"><code>model = Sequential()</code><br></span>＃Sequentialモデルを作成します。</p>



<p><span class="bold-green"><code>model.add(Conv2D(32, <span class="bold-red">kernel_size=3, strides=2, input_shape=shape, padding='same'</span>))</code><br></span>＃畳み込み層（Conv2D層）を追加します。<span class="bold-red">32個</span>のフィルターを使用し、カーネルサイズは3&#215;3です。ストライドは2で、パディングは&#8217;same&#8217;です。<code>input_shape</code>は、入力画像の形状を指定します。<br><br><span class="bold-green"><code>model.add(LeakyReLU(alpha=0.01))</code><br></span>＃LeakyReLU活性化関数を追加します。これは、通常のReLU関数に比べて負の領域でわずかに傾いた特性を持ち、勾配消失問題を緩和します。<br><br><span class="bold-green">model.add(Dropout(0.25))<span class="bold-red"> </span>&nbsp;</span><br># Dropoutを追加することで、過学習を抑制できる。<br><br><span class="bold-green">model.add(Conv2D(64, kernel_size=3, strides=2, padding=&#8217;same&#8217;))<br></span>＃上記で解説済み<span class="bold-green"><br>model.add(LeakyReLU(alpha=0.01))<br></span>＃上記で解説済み<span class="bold-green"><br>model.add(Conv2D(128, kernel_size=3, strides=2, padding=&#8217;same&#8217;))<br></span>＃上記で解説済み<span class="bold-green"><br>model.add(LeakyReLU(alpha=0.01))<br></span>＃上記で解説済み</p>



<p><span class="bold-green"><code>model.add(Flatten())</code><br></span>＃Flatten層を追加して、畳み込み層からの出力をフラットなベクトルに変換します。これにより、<span class="marker-under">全結合層に接続することができます</span>。<br><br><span class="bold-green"><code>model.add(<span class="bold-red">Dense(1, activation='sigmoid'</span>))</code><br></span>＃全結合層（Dense層）を追加します。1つのノードがあり、出力の活性化関数としてシグモイド関数が使用されています。これにより、識別器は入力画像が本物である<span class="marker-under">確率を出力</span>します（0から1の間の値）。</p>



<h3 class="wp-block-heading"><span id="toc7">DCGANモデルの定義とコンパイル</span></h3>



<p>生成器と識別器を結合してDCGANモデルを作成しましょう！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def gan_model(generator,discriminator):
    model=Sequential()
    model.add(generator)
    model.add(discriminator)
    return model" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">gan_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">,</span><span style="color: #FD971F; font-style: italic">discriminator</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(generator)</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(discriminator)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span></code></pre></div>



<p>これは、前回と全く一緒です。</p>



<h3 class="wp-block-heading"><span id="toc8">モデルのコンパイル</span></h3>



<p>GANモデルはパラメーターに敏感に反応するので、慎重にパラメーターを設定していきましょう！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="discriminator = discriminator_model(shape)#前回と同じ
discriminator.compile(loss='binary_crossentropy',
                      optimizer=Adam(lr=0.0001, beta_1=0.5),
                      metrics=['accuracy'])#追加コード

generator = generator_model(noise_dim)#前回と同じ
generator.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0003, beta_1=0.5))#追加コード

discriminator.trainable = False#前回と同じ

gan = gan_model(generator, discriminator)#前回と同じ
gan.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.0003, beta_1=0.5))#追加コード" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">discriminator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator_model(shape)</span><span style="color: #88846F">#前回と同じ</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">                      </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0001</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">),</span></span>
<span class="line"><span style="color: #F8F8F2">                      </span><span style="color: #FD971F; font-style: italic">metrics</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[</span><span style="color: #E6DB74">&#39;accuracy&#39;</span><span style="color: #F8F8F2">])</span><span style="color: #88846F">#追加コード</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">generator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator_model(noise_dim)</span><span style="color: #88846F">#前回と同じ</span></span>
<span class="line"><span style="color: #F8F8F2">generator.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0003</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span><span style="color: #88846F">#追加コード</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">discriminator.trainable </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span><span style="color: #88846F">#前回と同じ</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">gan </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gan_model(generator, discriminator)</span><span style="color: #88846F">#前回と同じ</span></span>
<span class="line"><span style="color: #F8F8F2">gan.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(</span><span style="color: #FD971F; font-style: italic">lr</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.0003</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">beta_1</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span><span style="color: #88846F">#追加コード</span></span></code></pre></div>



<p>こちらも、大枠では前回とほぼ同じです。しかし、今回は細かな設定を変えたり、追加したりしています。前回と同じコードは基本、解説は割愛します。<br><br><span class="bold-green">discriminator = discriminator_model(shape)<br></span>#前回と同じ<br><br><span class="bold-green">discriminator.compile(loss=&#8217;binary_crossentropy&#8217;,optimizer=Adam(lr=0.0001, beta_1=0.5),metrics=[&#8216;accuracy&#8217;])</span><br>#Adam()の学習率を0.0001にしている。ちなみにデフォルト値は0.001です。<br>#beta_1はDCGANでは0.5が一般的な選択肢<br>＃それ以外は前回と共通<br><br><span class="bold-green">generator = generator_model(noise_dim)<br></span>#前回と同じ<br><br><span class="bold-green">generator.compile(loss=&#8217;binary_crossentropy&#8217;, optimizer=Adam(lr=0.0003, beta_1=0.5))</span><br>＃Adam()での生成器の学習率は識別器よりも大きくするのが一般的。生成器の方が最初は不利なので、その分プラスさせている。</p>



<p><span class="bold-green">discriminator.trainable = False<br></span>#前回と同じ<span class="bold-green"><br></span>＃<code>trainable</code>属性を使用して、特定のモデルまたはレイヤーのトレーニング可能なパラメータを無効にする操作です。識別器のすべてのトレーニング可能なパラメータ（重み）を「<span class="bold-red">フリーズ」する</span>ことを意味します。つまり、この行以降で行われる識別器へのバックプロパゲーションによる更新は、識別器の重みには反映されません。この操作により、生成器のみが更新され、識別器の重みは固定された状態でトレーニングが行われます。</p>



<p><span class="bold-green">gan = gan_model(generator, discriminator)<br></span>#前回と同じ<br><br><span class="bold-green">gan.compile(loss=&#8217;binary_crossentropy&#8217;, optimizer=Adam(lr=0.0003, beta_1=0.5))<br></span>#Adam()での生成器の学習率は識別器よりも大きくするのが一般的。識別器の方が強すぎると、ほとんどが偽とはじかれてどれを修正したらいいか分からなくなる。→学習が進まなくなる</p>



<!-- START MoshimoAffiliateEasyLink -->
<script type="text/javascript">
(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;
b[a]=b[a]||function(){arguments.currentScript=c.currentScript
||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};
c.getElementById(a)||(d=c.createElement(f),d.src=g,
d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})
(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");
msmaflink({"n":"直感 Deep Learning Python×Kerasでアイデアを形にするレシピ [ Antonio Gulli ]","b":"","t":"","d":"https:\/\/thumbnail.image.rakuten.co.jp","c_p":"","p":["\/@0_mall\/book\/cabinet\/8260\/9784873118260.jpg"],"u":{"u":"https:\/\/item.rakuten.co.jp\/book\/15333368\/","t":"rakuten","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/item.rakuten.co.jp\/book\/15333368\/","a_id":4440988,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":1}],"eid":"tmlJA","s":"s"});
</script>
<div id="msmaflink-tmlJA">リンク</div>
<!-- MoshimoAffiliateEasyLink END -->



<h3 class="wp-block-heading"><span id="toc9">モデルの訓練</span></h3>



<p>ここも、前回と全く同じでも動作します。しかし、今回は少しだけ遊び心で変えてみました。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="losses = []
accuracies = []
iteration_checkpoints = []

def train(iterations, batch_size, sample_interval):
    (X_train, _), (_, _) = mnist.load_data()
    X_train = X_train / 127.5 - 1.0
    X_train = np.expand_dims(X_train, axis=3)
    real_label = np.ones((batch_size, 1))
    fake_label = np.zeros((batch_size, 1))

    for iteration in range(iterations):
        idx = np.random.randint(0, X_train.shape[0], batch_size)
        batch_images = X_train[idx]
        z = np.random.normal(0, 1, (batch_size, noise_dim))
        gene_imgs = generator.predict(z)

        d_loss_real = discriminator.train_on_batch(batch_images, real_label)
        d_loss_fake = discriminator.train_on_batch(gene_imgs, fake_label)
        d_loss, accuracy = 0.5 * np.add(d_loss_real, d_loss_fake)

        z = np.random.normal(0, 1, (batch_size, noise_dim))#前回と違って今回はこれを追加する
        #前回はここにdiscriminator.trainable = Falseを入れたが今回は削除

        g_loss = gan.train_on_batch(z, real_label)
        #前回はここにdiscriminator.trainable = True を入れたが今回は削除

        if (iteration + 1) % sample_interval == 0:
            losses.append((d_loss, g_loss))
            accuracies.append(100.0 * accuracy)
            iteration_checkpoints.append(iteration + 1)

            print(&quot;%d [D loss: %f, acc.: %.2f%%] [G loss: %f]&quot; % (iteration + 1, d_loss, 100.0 * accuracy, g_loss))
            save_images(generator, iteration + 1)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">losses </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">accuracies </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">iteration_checkpoints </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">train</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">iterations</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">sample_interval</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    (X_train, _), (_, _) </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> mnist.load_data()</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train </span><span style="color: #F92672">/</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">127.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">-</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1.0</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.expand_dims(X_train, </span><span style="color: #FD971F; font-style: italic">axis</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    real_label </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.ones((batch_size, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    fake_label </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.zeros((batch_size, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> iteration </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(iterations):</span></span>
<span class="line"><span style="color: #F8F8F2">        idx </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.randint(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, X_train.shape[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], batch_size)</span></span>
<span class="line"><span style="color: #F8F8F2">        batch_images </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train[idx]</span></span>
<span class="line"><span style="color: #F8F8F2">        z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (batch_size, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">        gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(z)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_real </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator.train_on_batch(batch_images, real_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_fake </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator.train_on_batch(gene_imgs, fake_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss, accuracy </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> np.add(d_loss_real, d_loss_fake)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (batch_size, noise_dim))</span><span style="color: #88846F">#前回と違って今回はこれを追加する</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F">#前回はここにdiscriminator.trainable = Falseを入れたが今回は削除</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        g_loss </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gan.train_on_batch(z, real_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F">#前回はここにdiscriminator.trainable = True を入れたが今回は削除</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> (iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> sample_interval </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            losses.append((d_loss, g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            accuracies.append(</span><span style="color: #AE81FF">100.0</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> accuracy)</span></span>
<span class="line"><span style="color: #F8F8F2">            iteration_checkpoints.append(iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> [D loss: </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">, acc.: </span><span style="color: #AE81FF">%.2f%%</span><span style="color: #E6DB74">] [G loss: </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">]&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, d_loss, </span><span style="color: #AE81FF">100.0</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> accuracy, g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            save_images(generator, iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p>discriminator.trainable = Falseとdiscriminator.trainable = Trueはあってもなくても結果が変わらないことに気づいたので、今回は削除して訓練をすることにした。<br><br><span class="bold-green">z = np.random.normal(0, 1, (batch_size, noise_dim))</span><br>＃このコードは２回使われている(15行と22行）。１回目は<strong>偽の画像を生成するため</strong>につかわれ、２回目はGeneratorを<strong>訓練するため</strong>に使われます。<br>＃同じノイズを使い回すと、Generatorが学習するデータの多様性が制限されます。つまり、同じノイズから生成された画像は似通ってしまい、多様な画像を生成する能力が制限される可能性があります。→モード崩壊につながる</p>



<p>要するに、今回やったことはdiscriminator.trainable = Falseとdiscriminator.trainable = Trueを削除した代わりに、z = np.random.normal(0, 1, (batch_size, noise_dim))で補ったということです。</p>



<p>紛らわしくしてすみません！でも、どうしても試してみたくなってしまいました。</p>



<h3 class="wp-block-heading"><span id="toc10">生成画像の保存</span></h3>



<p>画像を保存して目視できるようにしましょう！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def save_images(generator, iteration, directory='dcgan_directory', image_grid_rows=4, image_grid_columns=4):
    if not os.path.exists(directory):
        os.makedirs(directory)

    z = np.random.normal(0, 1, (image_grid_rows * image_grid_columns, noise_dim))
    gene_imgs = generator.predict(z)
    gene_imgs = 0.5 * gene_imgs + 0.5
    fig, axs = plt.subplots(image_grid_rows, image_grid_columns, figsize=(4, 4), sharey=True, sharex=True)
    cnt = 0
    for row in range(image_grid_rows):
        for col in range(image_grid_columns):
            axs[row, col].imshow(gene_imgs[cnt, :, :, 0], cmap='gray')
            axs[row, col].axis('off')
            cnt += 1

    fig.savefig(f&quot;{directory}/iteration_{iteration}.png&quot;)
    plt.close(fig)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">save_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">iteration</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">directory</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;dcgan_directory&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_rows</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_columns</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> os.path.exists(directory):</span></span>
<span class="line"><span style="color: #F8F8F2">        os.makedirs(directory)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (image_grid_rows </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> image_grid_columns, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(z)</span></span>
<span class="line"><span style="color: #F8F8F2">    gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> gene_imgs </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span></span>
<span class="line"><span style="color: #F8F8F2">    fig, axs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> plt.subplots(image_grid_rows, image_grid_columns, </span><span style="color: #FD971F; font-style: italic">figsize</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">), </span><span style="color: #FD971F; font-style: italic">sharey</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">sharex</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    cnt </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> row </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_rows):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> col </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_columns):</span></span>
<span class="line"><span style="color: #F8F8F2">            axs[row, col].imshow(gene_imgs[cnt, :, :, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], </span><span style="color: #FD971F; font-style: italic">cmap</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;gray&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            axs[row, col].axis(</span><span style="color: #E6DB74">&#39;off&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            cnt </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    fig.savefig(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">directory</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">/iteration_</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">iteration</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">.png&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    plt.close(fig)</span></span></code></pre></div>



<p>保存されるデフォルトディレクトリの名前をdcganにしました。それ以外は前回と同じです。</p>



<h3 class="wp-block-heading"><span id="toc11">モデルの実行</span></h3>



<p>バッチサイズを変えると、学習に影響が出ます。それ以外のパラメーターはお好みでどうぞ！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="iterations=20000
batch_size=128
sample_interval=1000
train(iterations,batch_size,sample_interval)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">iterations</span><span style="color: #F92672">=</span><span style="color: #AE81FF">20000</span></span>
<span class="line"><span style="color: #F8F8F2">batch_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">128</span></span>
<span class="line"><span style="color: #F8F8F2">sample_interval</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1000</span></span>
<span class="line"><span style="color: #F8F8F2">train(iterations,batch_size,sample_interval)</span></span></code></pre></div>



<p><span class="bold-green">sample_interval=1000</span><br>＃画像や評価が出力される間隔です。<br>＃この数を変化させても、学習には影響はありません。適度にみたいのなら、500などの小さい数字にしてもいいかもです。</p>



<h3 class="wp-block-heading"><span id="toc12">モデルの保存とロード方法</span></h3>



<p>今回学習したモデルを再利用するために、保存しておきましょう！</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="#モデルの保存
generator.save('DCGAN_generator.keras')
discriminator.save('DCGAN_discriminator.keras')
gan.save('DCGAN_model.keras')" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F">#モデルの保存</span></span>
<span class="line"><span style="color: #F8F8F2">generator.save(</span><span style="color: #E6DB74">&#39;DCGAN_generator.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.save(</span><span style="color: #E6DB74">&#39;DCGAN_discriminator.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">gan.save(</span><span style="color: #E6DB74">&#39;DCGAN_model.keras&#39;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="#モデルのロード方法
from keras.models import load_model

# 保存されたモデルをロード
loaded_model = load_model('DCGAN_generator.keras')" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F">#モデルのロード方法</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> load_model</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># 保存されたモデルをロード</span></span>
<span class="line"><span style="color: #F8F8F2">loaded_model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> load_model(</span><span style="color: #E6DB74">&#39;DCGAN_generator.keras&#39;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p>上書きを防ぐために前回とファイル名を変えました。<br>それ以外はすべて同じ流れです。</p>



<h3 class="wp-block-heading"><span id="toc13">ファイルの実行</span></h3>



<p>では、実行していきましょう。実行方法は人それぞれですが、私の場合はCMDでファイル名を入力することで実行しています。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="ファイル名.py" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">ファイル名.py</span></span></code></pre></div>



<p>これで、いい感じの出力がされたら完了です！<br><br>p.s.　1000イテレーションで8分です。つまり20000イテレーションは160分くらいかかります。(=2.6時間)</p>



<h3 class="wp-block-heading"><span id="toc14">出力例</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="50 [D loss: 0.000624, acc.: 100.00%] [G loss: 0.007994]
100 [D loss: 0.694652, acc.: 54.69%] [G loss: 1.168186]
150 [D loss: 0.732862, acc.: 40.23%] [G loss: 0.726937]
200 [D loss: 0.756426, acc.: 33.20%] [G loss: 0.835835]
300 [D loss: 0.711406, acc.: 36.33%] [G loss: 0.747646]
350 [D loss: 0.703592, acc.: 44.53%] [G loss: 0.748230]
400 [D loss: 0.679182, acc.: 60.55%] [G loss: 0.719221]
500 [D loss: 0.684259, acc.: 54.30%] [G loss: 0.721480]
600 [D loss: 0.685240, acc.: 57.42%] [G loss: 0.719235]
700 [D loss: 0.695925, acc.: 49.61%] [G loss: 0.702438]
800 [D loss: 0.696105, acc.: 50.00%] [G loss: 0.697281]
900 [D loss: 0.688253, acc.: 56.25%] [G loss: 0.704283]
1000 [D loss: 0.687551, acc.: 56.25%] [G loss: 0.706025]
1350 [D loss: 0.697760, acc.: 48.44%] [G loss: 0.717108]
1400 [D loss: 0.686100, acc.: 53.91%] [G loss: 0.708159]
2000 [D loss: 0.659652, acc.: 60.16%] [G loss: 0.790444]
3000 [D loss: 0.645585, acc.: 62.50%] [G loss: 0.880491]
4000 [D loss: 0.553337, acc.: 74.22%] [G loss: 1.089478]
～
14000 [D loss: 0.467627, acc.: 78.12%] [G loss: 1.328423]
15000 [D loss: 0.543287, acc.: 69.92%] [G loss: 1.445801]
19000 [D loss: 0.486697, acc.: 75.00%] [G loss: 1.706172]
20000 [D loss: 0.515853, acc.: 72.27%] [G loss: 1.522569]" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #AE81FF">50</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.000624</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">100.00</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.007994</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">100</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.694652</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">54.69</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">1.168186</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">150</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.732862</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">40.23</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.726937</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">200</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.756426</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">33.20</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.835835</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">300</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.711406</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">36.33</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.747646</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">350</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.703592</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">44.53</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.748230</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">400</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.679182</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">60.55</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.719221</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">500</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.684259</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">54.30</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.721480</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">600</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.685240</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">57.42</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.719235</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">700</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.695925</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">49.61</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.702438</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">800</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.696105</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">50.00</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.697281</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">900</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.688253</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">56.25</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.704283</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">1000</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.687551</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">56.25</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.706025</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">1350</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.697760</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">48.44</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.717108</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">1400</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.686100</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">53.91</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.708159</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">2000</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.659652</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">60.16</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.790444</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">3000</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.645585</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">62.50</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.880491</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">4000</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.553337</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">74.22</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">1.089478</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">～</span></span>
<span class="line"><span style="color: #AE81FF">14000</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.467627</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">78.12</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">1.328423</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">15000</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.543287</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">69.92</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">1.445801</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">19000</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.486697</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">75.00</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">1.706172</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">20000</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.515853</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">72.27</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">1.522569</span><span style="color: #F8F8F2">]</span></span></code></pre></div>



<table border="0" cellpadding="0" cellspacing="0"><tr><td><div style="border:1px solid #95a5a6;border-radius:.75rem;background-color:#FFFFFF;width:280px;margin:0px;padding:5px;text-align:center;overflow:hidden;"><table><tr><td style="width:128px"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/3a19e183.08365096.3a19e184.6a2b305f/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Frakutenkobo-ebooks%2F3a3416dae5323d70adc1119c60b0a274%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;"><img decoding="async" src="https://hbb.afl.rakuten.co.jp/hgb/3a19e183.08365096.3a19e184.6a2b305f/?me_id=1278256&#038;item_id=21826167&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Frakutenkobo-ebooks%2Fcabinet%2F0427%2F2000012260427.jpg%3F_ex%3D128x128&#038;s=128x128&#038;t=picttext" border="0" style="margin:2px" alt="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]" title="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]"></a></td><td style="vertical-align:top;width:136px;display: block;"><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px;word-wrap:break-word"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/3a19e183.08365096.3a19e184.6a2b305f/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Frakutenkobo-ebooks%2F3a3416dae5323d70adc1119c60b0a274%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">Python機械学習プログラミング PyTorch＆scikit-learn編【電子書籍】[ Sebastian Raschka ]</a><br><span >価格：4,620円</span> <span style="color:#BBB">(2024/3/4時点)</span></p></td></tr></table></div><br><p style="color:#000000;font-size:12px;line-height:1.4em;margin:5px;word-wrap:break-word"></p></td></tr></table>



<h2 class="wp-block-heading"><span id="toc15">おわりに</span></h2>



<p>お疲れさまでした。時間があったら、自分でパラメータをいじってみて動向の変化を確かめてみるのも勉強になったりします。</p>



<p>次回は、カラー画像の生成をGANでやっていきます。<br>p.s.CPU性能の限界があるので、大した画像は生成できません🙇</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1177/" title="【AI/座学】GANパラメーター調整のコツ・極意書" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-160x90.png 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-300x169.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-1024x576.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-768x432.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-120x68.png 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-320x180.png 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1.png 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/座学】GANパラメーター調整のコツ・極意書</div><div class="blogcard-snippet internal-blogcard-snippet">GANモデルは学習が不安定になりがちです。それを見ると、私の心も不安定(なんちゃって)。ここでは、そんな学習も心も不安定になってしまった人に向けての、GANモデルパラメーター調整のコツを紹介します。私の過去からの経験から【これは効果あった】や一般論をまとめています。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.02</div></div></div></div></a>
</div></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【AI/実践編】生成AI-GANを実装【衝撃簡単④】</title>
		<link>https://ascend-beyond.com/study/1002/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Tue, 27 Feb 2024 05:43:45 +0000</pubDate>
				<category><![CDATA[AI（人工知能）]]></category>
		<category><![CDATA[Study]]></category>
		<category><![CDATA[実践]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[独学]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=1002</guid>

					<description><![CDATA[目次 対象読者今回の流れ今回の全コードモジュールの準備生成画像を定義生成器（ジェネレータ―）モデルを定義識別器（ディスクリミネーター）モデルを定義GANモデルの定義モデルのコンパイルモデルの訓練生成画像の保存モデルの実行 [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">対象読者</a><ol><li><a href="#toc2" tabindex="0">今回の流れ</a></li><li><a href="#toc3" tabindex="0">今回の全コード</a></li><li><a href="#toc4" tabindex="0">モジュールの準備</a></li><li><a href="#toc5" tabindex="0">生成画像を定義</a></li><li><a href="#toc6" tabindex="0">生成器（ジェネレータ―）モデルを定義</a></li><li><a href="#toc7" tabindex="0">識別器（ディスクリミネーター）モデルを定義</a></li><li><a href="#toc8" tabindex="0">GANモデルの定義</a></li><li><a href="#toc9" tabindex="0">モデルのコンパイル</a></li><li><a href="#toc10" tabindex="0">モデルの訓練</a></li><li><a href="#toc11" tabindex="0">生成画像の保存</a></li><li><a href="#toc12" tabindex="0">モデルの実行</a></li><li><a href="#toc13" tabindex="0">モデルの保存とロード方法</a><ol><ol><ol><li><a href="#toc14" tabindex="0">モデルのロード</a></li></ol></li></ol></li></ol></li></ol></li><li><a href="#toc15" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">対象読者</span></h2>



<p>今日はGAN(敵対生成ネットワーク)を実装していきます。</p>



<p>やることは、GAN（敵対生成ネットワーク）モデルを使って、MNISTデータに似た画像（偽物）を生成していきます。ノイズからMNISTっぽい画像を生成できるのはなかなか感動ものですよ！（笑）</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://ascend-beyond.com/wp-content/uploads/2024/02/efea087142f86e3fdff7c59e803f716a-1024x576.jpg" alt="GAN" class="wp-image-1104" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/efea087142f86e3fdff7c59e803f716a-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/efea087142f86e3fdff7c59e803f716a-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/efea087142f86e3fdff7c59e803f716a-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/efea087142f86e3fdff7c59e803f716a-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/efea087142f86e3fdff7c59e803f716a-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/efea087142f86e3fdff7c59e803f716a-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/efea087142f86e3fdff7c59e803f716a.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>p.s.学習には約40分くらいかかります。（1000イテレーションに約２分かかる）</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1037/" title="【AI/座学編】GAN-敵対生成ネットワーク" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/46f07a61a883caa5c7d5295d40426cfb-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/46f07a61a883caa5c7d5295d40426cfb-160x90.png 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/46f07a61a883caa5c7d5295d40426cfb-300x169.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/46f07a61a883caa5c7d5295d40426cfb-1024x576.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/46f07a61a883caa5c7d5295d40426cfb-768x432.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/46f07a61a883caa5c7d5295d40426cfb-120x68.png 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/46f07a61a883caa5c7d5295d40426cfb-320x180.png 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/46f07a61a883caa5c7d5295d40426cfb.png 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/座学編】GAN-敵対生成ネットワーク</div><div class="blogcard-snippet internal-blogcard-snippet">ここではGAN(敵対生成ネットワーク)について解説していきます。また、解説は複雑な概念理解には重きを置かず、【すぐに実践できるレベル】の知識のみを提供しています。座学で時間を浪費しないように必要最低限の重要な知識のみに絞って提供しています。これを読み終えたらすぐにＧＡＮを使った実装に移ってワクワクするような体験を積んでいきましょう。【実践編あり】</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.28</div></div></div></div></a>
</div><figcaption class="wp-element-caption">実践の前にササっと見てみてください</figcaption></figure>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/797/" title="【AI/実践編】MNISTでAIを体験【衝撃簡単①】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】MNISTでAIを体験【衝撃簡単①】</div><div class="blogcard-snippet internal-blogcard-snippet">AIの深い原理が分からなくても作れます！MNISTを使ったとっても簡単な実装をやっていきます。AIの概要は学んだけど何から作ればいいんだろう。という悩みをお持ちのあなたにピッタリのタスクです。また、始めたばかりで100％の理解を求める必要はありません。50%理解できたらいいや程度の軽い気持ちで学習を進めましょう。その方が挫折することなく長期間続けられ、結果的にいつか50%の理解が90%以上の理解になる時がきます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.24</div></div></div></div></a>
</div><figcaption class="wp-element-caption">AIの基本はこちらからどうぞ</figcaption></figure>



<h3 class="wp-block-heading"><span id="toc2">今回の流れ</span></h3>



<p>では、まずはプログラムの流れ・全体像を把握しておきましょう。</p>



<ol class="wp-block-list">
<li><strong>データの準備</strong>: まず、MNISTデータセットなどの画像データを準備します。各画像は28&#215;28ピクセルのグレースケール画像です。</li>



<li><strong>モデルの定義</strong>:
<ul class="wp-block-list">
<li>生成器（Generator）モデル: ランダムノイズから画像を生成します。<code>generator_model()</code> 関数で定義されます。</li>



<li>識別器（Discriminator）モデル: 画像が本物か偽物かを判定します。<code>discriminator_model()</code> 関数で定義されます。</li>



<li>GANモデル: 生成器と識別器を結合し、生成器がより良い偽の画像を生成できるようにトレーニングします。<code>gan_model()</code> 関数で定義されます。</li>
</ul>
</li>



<li><strong>モデルのコンパイル</strong>:
<ul class="wp-block-list">
<li>識別器: 二値分類の問題なので、binary_crossentropy 損失関数を使用してコンパイルします。また、Adamオプティマイザを使用します。</li>



<li>GAN: 生成器をトレーニングするので、生成器が生成した画像が本物に見えるように識別器を騙すようにします。生成器のみをトレーニングするため、識別器の重みは固定されます。</li>
</ul>
</li>



<li><strong>トレーニング</strong>: トレーニングループを実行してGANをトレーニングします。
<ul class="wp-block-list">
<li>本物の画像を識別器に渡してラベル1でトレーニングします。</li>



<li>生成器にノイズを入力し、偽の画像を生成します。この偽の画像にはラベル0が付けられます。</li>



<li>生成器が生成した偽の画像とラベル0を識別器に渡してトレーニングします。</li>



<li>これらのステップを繰り返し、GANをトレーニングします。</li>
</ul>
</li>



<li><strong>画像の保存</strong>: 一定の間隔で生成器によって生成された画像を保存します。これにより、トレーニング中の生成器の進行状況を視覚的に確認できます。</li>



<li><strong>モデルの保存</strong>: トレーニングが完了したら、生成器、識別器、およびGANモデルを保存します。これにより、将来の使用や再トレーニングが容易になります。</li>
</ol>



<p>この手順に従うことで、GANモデルをトレーニングして新しい画像を生成することができます。<br><br>p.s.見ての通り長いので、一気にやろうとせず休憩しながら、ゆっくりやっていきましょう！</p>



<h3 class="wp-block-heading"><span id="toc3">今回の全コード</span></h3>



<p>では、ここに今日使ったコードを全部張っておきます。説明が前後することがあるので、不安に感じたらこちらで確認してください。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import matplotlib.pyplot as plt
import numpy as np
import os
from keras.datasets import mnist
from keras.layers import Dense, Flatten, Reshape, LeakyReLU
from keras.models import Sequential
from keras.optimizers import Adam

width = 28
height = 28
channels = 1
shape = (width, height, channels)
noise_dim = 100

def generator_model(shape, noise_dim):
    model = Sequential()
    model.add(Dense(128, input_dim=noise_dim))
    model.add(LeakyReLU(alpha=0.01))
    model.add(Dense(28 * 28 * 1, activation='tanh'))
    model.add(Reshape(shape))
    return model

def discriminator_model(shape):
    model = Sequential()
    model.add(Flatten(input_shape=shape))
    model.add(Dense(128))
    model.add(LeakyReLU(alpha=0.01))
    model.add(Dense(1, activation='sigmoid'))
    return model

def gan_model(generator, discriminator):
    model = Sequential()
    model.add(generator)
    model.add(discriminator)
    return model

discriminator = discriminator_model(shape)
discriminator.compile(loss='binary_crossentropy', optimizer=Adam(), metrics=['accuracy'])
generator = generator_model(shape, noise_dim)
discriminator.trainable = False
gan = gan_model(generator, discriminator)
gan.compile(loss='binary_crossentropy', optimizer=Adam())

losses = []
accuracies = []
iteration_checkpoints = []

def train(iterations, batch_size, sample_interval):
    #前処理
    (X_train, _), (_, _) = mnist.load_data()
    X_train = X_train / 127.5 - 1.0
    X_train = np.expand_dims(X_train, axis=3)
    real_label = np.ones((batch_size, 1))
    fake_label = np.zeros((batch_size, 1))

    #訓練
    for iteration in range(iterations):
        idx = np.random.randint(0, X_train.shape[0], batch_size)
        batch_images = X_train[idx]
        z = np.random.normal(0, 1, (batch_size, noise_dim))
        gene_imgs = generator.predict(z)
        d_loss_real = discriminator.train_on_batch(batch_images, real_label)
        d_loss_fake = discriminator.train_on_batch(gene_imgs, fake_label)
        d_loss, accuracy = 0.5 * np.add(d_loss_real, d_loss_fake)
        discriminator.trainable = False
        g_loss = gan.train_on_batch(z, real_label)
        discriminator.trainable = True

        #データ確認
        if (iteration + 1) % sample_interval == 0:
            losses.append((d_loss, g_loss))
            accuracies.append(100.0 * accuracy)
            iteration_checkpoints.append(iteration + 1)

            print(&quot;%d [D loss: %f, acc.: %.2f%%] [G loss: %f]&quot; % (iteration + 1, d_loss, 100.0 * accuracy, g_loss))
            save_images(generator, iteration + 1)

def save_images(generator, iteration, directory='gan_directory', image_grid_rows=4, image_grid_columns=4):
    if not os.path.exists(directory):
        os.makedirs(directory)

    z = np.random.normal(0, 1, (image_grid_rows * image_grid_columns, noise_dim))
    gene_imgs = generator.predict(z)
    gene_imgs = 0.5 * gene_imgs + 0.5
    fig, axs = plt.subplots(image_grid_rows, image_grid_columns, figsize=(4, 4), sharey=True, sharex=True)
    cnt = 0
    for row in range(image_grid_rows):
        for col in range(image_grid_columns):
            axs[row, col].imshow(gene_imgs[cnt, :, :, 0], cmap='gray')
            axs[row, col].axis('off')
            cnt += 1

    fig.savefig(f&quot;{directory}/iteration_{iteration}.png&quot;)
    plt.close(fig)

iterations = 40000
batch_size = 128
sample_interval = 500
train(iterations, batch_size, sample_interval)

generator.save('generator.keras')
discriminator.save('discriminator.keras')
gan.save('gan_model.keras')
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> matplotlib.pyplot </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> plt</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.datasets </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> mnist</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Dense, Flatten, Reshape, LeakyReLU</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.optimizers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Adam</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">width </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">28</span></span>
<span class="line"><span style="color: #F8F8F2">height </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">28</span></span>
<span class="line"><span style="color: #F8F8F2">channels </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"><span style="color: #F8F8F2">shape </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> (width, height, channels)</span></span>
<span class="line"><span style="color: #F8F8F2">noise_dim </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">100</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">generator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">shape</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">noise_dim</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_dim</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">activation</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;tanh&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Reshape(shape))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">discriminator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">shape</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Flatten(</span><span style="color: #FD971F; font-style: italic">input_shape</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">shape))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">activation</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;sigmoid&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">gan_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">discriminator</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(generator)</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(discriminator)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">discriminator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator_model(shape)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(), </span><span style="color: #FD971F; font-style: italic">metrics</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[</span><span style="color: #E6DB74">&#39;accuracy&#39;</span><span style="color: #F8F8F2">])</span></span>
<span class="line"><span style="color: #F8F8F2">generator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator_model(shape, noise_dim)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.trainable </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"><span style="color: #F8F8F2">gan </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gan_model(generator, discriminator)</span></span>
<span class="line"><span style="color: #F8F8F2">gan.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam())</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">losses </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">accuracies </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">iteration_checkpoints </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">train</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">iterations</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">sample_interval</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F">#前処理</span></span>
<span class="line"><span style="color: #F8F8F2">    (X_train, _), (_, _) </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> mnist.load_data()</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train </span><span style="color: #F92672">/</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">127.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">-</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1.0</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.expand_dims(X_train, </span><span style="color: #FD971F; font-style: italic">axis</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    real_label </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.ones((batch_size, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    fake_label </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.zeros((batch_size, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F">#訓練</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> iteration </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(iterations):</span></span>
<span class="line"><span style="color: #F8F8F2">        idx </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.randint(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, X_train.shape[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], batch_size)</span></span>
<span class="line"><span style="color: #F8F8F2">        batch_images </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train[idx]</span></span>
<span class="line"><span style="color: #F8F8F2">        z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (batch_size, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">        gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(z)</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_real </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator.train_on_batch(batch_images, real_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_fake </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator.train_on_batch(gene_imgs, fake_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss, accuracy </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> np.add(d_loss_real, d_loss_fake)</span></span>
<span class="line"><span style="color: #F8F8F2">        discriminator.trainable </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"><span style="color: #F8F8F2">        g_loss </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gan.train_on_batch(z, real_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        discriminator.trainable </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">True</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F">#データ確認</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> (iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> sample_interval </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"><span style="color: #F8F8F2">            losses.append((d_loss, g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            accuracies.append(</span><span style="color: #AE81FF">100.0</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> accuracy)</span></span>
<span class="line"><span style="color: #F8F8F2">            iteration_checkpoints.append(iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> [D loss: </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">, acc.: </span><span style="color: #AE81FF">%.2f%%</span><span style="color: #E6DB74">] [G loss: </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">]&quot;</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">%</span><span style="color: #F8F8F2"> (iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, d_loss, </span><span style="color: #AE81FF">100.0</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> accuracy, g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            save_images(generator, iteration </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">save_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">iteration</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">directory</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;gan_directory&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_rows</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_columns</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> os.path.exists(directory):</span></span>
<span class="line"><span style="color: #F8F8F2">        os.makedirs(directory)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (image_grid_rows </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> image_grid_columns, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(z)</span></span>
<span class="line"><span style="color: #F8F8F2">    gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> gene_imgs </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span></span>
<span class="line"><span style="color: #F8F8F2">    fig, axs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> plt.subplots(image_grid_rows, image_grid_columns, </span><span style="color: #FD971F; font-style: italic">figsize</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">), </span><span style="color: #FD971F; font-style: italic">sharey</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">sharex</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    cnt </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> row </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_rows):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> col </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_columns):</span></span>
<span class="line"><span style="color: #F8F8F2">            axs[row, col].imshow(gene_imgs[cnt, :, :, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], </span><span style="color: #FD971F; font-style: italic">cmap</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;gray&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            axs[row, col].axis(</span><span style="color: #E6DB74">&#39;off&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">            cnt </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    fig.savefig(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">directory</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">/iteration_</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">iteration</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">.png&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    plt.close(fig)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">iterations </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">40000</span></span>
<span class="line"><span style="color: #F8F8F2">batch_size </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">128</span></span>
<span class="line"><span style="color: #F8F8F2">sample_interval </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">500</span></span>
<span class="line"><span style="color: #F8F8F2">train(iterations, batch_size, sample_interval)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">generator.save(</span><span style="color: #E6DB74">&#39;generator.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.save(</span><span style="color: #E6DB74">&#39;discriminator.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">gan.save(</span><span style="color: #E6DB74">&#39;gan_model.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc4">モジュールの準備</span></h3>



<p>必要なモジュールをインポートします。もし、エラーが出たら『pip install ○○』インストールしてください。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import matplotlib.pyplot as plt
import numpy as np
from keras.datasets import mnist
from keras.layers import Dense, Flatten, Reshape
from keras.layers import LeakyReLU
from keras.models import Sequential
from keras.optimizers import Adam
import os" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> matplotlib.pyplot </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> plt</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.datasets </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> mnist</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Dense, Flatten, Reshape</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> LeakyReLU</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.optimizers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Adam</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> os</span></span></code></pre></div>



<p><code><span class="bold-green">import matplotlib.pyplot as plt</span></code><br>＃Matplotlib ライブラリをインポートし、<code>plt</code> という別名で使用できるようにしています。Matplotlib は Python の<span class="marker-under">データ可視化ライブラリ</span>で、グラフや図を描画する際によく使用されます。<br><br><span class="bold-green"><code>import numpy as np</code><br></span>＃NumPy ライブラリをインポートし、<code>np</code> という別名で使用できるようにしています。NumPy は Python の<span class="marker-under">数値計算ライブラリ</span>であり、多次元配列や行列演算などの高度な数値計算をサポートしています。<br><br><span class="bold-green"><code>from keras.datasets import mnist</code><br></span>＃Keras ライブラリの中から、MNIST データセットをダウンロードするための <code>mnist</code> モジュールをインポートしています。MNIST データセットは<span class="marker-under">手書き数字画像データセット</span>であり、機械学習のベンチマークとして広く使用されています。<br><br><span class="bold-green"><code>from keras.layers import Dense, Flatten, Reshape</code><br></span>Keras ライブラリの中から、ニューラルネットワークの<span class="marker-under">層を定義するための <code><strong>Dense</strong></code></span>、データの<span class="marker-under">平坦化を行う <code><strong>Flatten</strong></code></span>、データの<span class="marker-under">形状を変更する <code><strong>Reshape</strong></code></span> 層をインポートしています。<br><br><span class="bold-green">from keras.layers import LeakyReLU<br></span>#LeakyReLU は、ニューラルネットワークの中間層や出力層に適用される非線形の活性化関数の一つです。LeakyReLU は、特に深層ニューラルネットワークや<span class="marker-under">生成モデルなどの多くの場面</span>で使用されます。<br><br><span class="bold-green"><code>from keras.models import Sequential</code><br></span>＃Keras ライブラリの中から、Sequential モデルを定義するための <code>Sequential</code> クラスをインポートしています。<strong>Sequential </strong>モデルは、層を<span class="marker-under">直線的に積み重ねて構築されるシンプルなモデル</span>です。<br><br><span class="bold-green"><code>from keras.optimizers import Adam</code><br></span>＃Keras ライブラリの中から、<span class="bold-red">Adam</span> 最適化アルゴリズムを定義するための <code>Adam</code> クラスをインポートしています。Adam は<span class="bold-red">勾配降下法</span>の一種であり、ニューラルネットワークの学習時に使用される<span class="marker-under">最適化アルゴリズム</span>の一つです。<br><br><span class="bold-green">import os</span><br>#ファイルシステムの操作を行うためのモジュールをインポートしています。</p>



<table border="0" cellpadding="0" cellspacing="0"><tr><td><div style="border:1px solid #95a5a6;border-radius:.75rem;background-color:#FFFFFF;width:280px;margin:0px;padding:5px;text-align:center;overflow:hidden;"><table><tr><td style="width:128px"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16782527%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;"><img decoding="async" src="https://hbb.afl.rakuten.co.jp/hgb/39414777.169c3d99.39414778.be6498e6/?me_id=1213310&#038;item_id=20390067&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F4642%2F9784798064642_1_2.jpg%3F_ex%3D128x128&#038;s=128x128&#038;t=picttext" border="0" style="margin:2px" alt="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]" title="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]"></a></td><td style="vertical-align:top;width:136px;display: block;"><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px;word-wrap:break-word"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16782527%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">物体検出とGAN、オートエンコーダー、画像処理入門　PyTorch/TensorFlow2による発展的・実装ディープラーニング [ チーム・カルポ ]</a><br><span >価格：3,520円（税込、送料無料)</span> <span style="color:#BBB">(2024/3/4時点)</span></p></td></tr></table></div><br><p style="color:#000000;font-size:12px;line-height:1.4em;margin:5px;word-wrap:break-word"></p></td></tr></table>



<h3 class="wp-block-heading"><span id="toc5">生成画像を定義</span></h3>



<p>ここでは、生成する画像の形状を定義します。今回はMNISTデータをもとに画像を生成するため、生成画像の形状をMNISTに合わせます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="width = 28
height = 28
channels = 1
shape = (width, height, channels)
noise_dim = 100" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">width </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">28</span></span>
<span class="line"><span style="color: #F8F8F2">height </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">28</span></span>
<span class="line"><span style="color: #F8F8F2">channels </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"><span style="color: #F8F8F2">shape </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> (width, height, channels)</span></span>
<span class="line"><span style="color: #F8F8F2">noise_dim </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">100</span></span></code></pre></div>



<p><span class="bold-green"><code>width=28</code>, <code>height=28</code>, <code>channels=1</code></span><br>＃これらの変数は、生成される画像の形状を定義します。MNIST データセットの画像サイズは 28&#215;28 ピクセルで、チャンネル数は 1 です。チャンネルのグレースケールは１、RGB画像は3です。<br><br><span class="bold-green"><code>shape=(</code>width,height,channels)</span><br>＃<code>shape</code> は生成される<span class="marker-under">画像の形状</span>を表すタプルです。</p>



<p><span class="bold-green"><code>noise_dim=</code>100<br></span>＃生成器の入力となる<span class="bold-red">潜在空間</span>の次元数を定義します。生成器のの入力はランダムなノイズから構成されるベクトルであり、その次元数を定義します。MNISTのような単純なデータセットでは、一般的には100次元の<span class="bold-red">ランダムノイズベクトル</span>でも十分な情報を持つことができます。<br><br>p.s.ちなみにdimはdimention（次元）の略です。</p>



<h3 class="wp-block-heading"><span id="toc6">生成器（ジェネレータ―）モデルを定義</span></h3>



<p>ここでは、画像を生成する機能を持つ関数を定義していきます。具体的には、ランダムな潜在空間のベクトルを入力として受け取り、それを MNIST のような手書き数字の画像に変換する役割をもつ関数を作っていきます。また、AIにおいてこのような関数を生成器、またはジェネレータと呼びます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def generator_model(shape, noise_dim):
    model = Sequential()
    model.add(Dense(128, input_dim=noise_dim))
    model.add(LeakyReLU(alpha=0.01))
    model.add(Dense(28 * 28 * 1, activation='tanh'))
    model.add(Reshape(shape))
    return model" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">generator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">shape</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">noise_dim</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_dim</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">activation</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;tanh&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Reshape(shape))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span></code></pre></div>



<p><span class="bold-green"><code>def <strong><code>generator_model</code></strong>(shape, noise_dim)</code>:<br></span><code>#</code>この関数は、Generator モデルを構築するために使用されます。引数として <code>shape</code>（生成される<span class="marker-under">画像の形状</span>）と noise_dim（<span class="bold-red">潜在空間</span>の次元数）を受け取ります。</p>



<p><span class="bold-green"><code>model=Sequential()</code><br></span>#<span class="marker-under"><code>Sequential</code>&nbsp;クラスのインスタンスを作成</span>し、<code>model</code>&nbsp;変数に代入しています。これにより、新しいSequentialモデルが作成されます。このモデルは、<span class="marker-under">層を順番に追加していくこと</span>で構築されます。<br><br><span class="bold-green"><code>model.add(Dense(128,input_dim=noise_dim))</code><br></span>#最初の層として、<span class="bold-red">全結合層（Dense）</span>を追加します。この層は、入力として潜在空間のベクトルを受け取り、128 個のニューロンを持ちます。<br>＃ニューロンは多いほど、より複雑な関数を学習することができますが、計算コストも高くなります。そのため<span class="marker-under">一般的な選択肢である128</span>を選択しました。<br><br><span class="bold-green"><code>model.add(LeakyReLU(alpha=0.01))</code><br></span>#<span class="bold-red">LeakyReLU 活性化関数</span>を追加します。LeakyReLU は、負の入力に対して微小な勾配を持ち、勾配消失問題を緩和する役割があります。<br>＃<code><strong>alpha=0.01</strong></code>は、Leaky ReLU（Rectified Linear Unit）関数の負の領域における勾配の傾きを制御するパラメータです。通常のReLU関数では、負の入力に対して勾配が0になりますが、Leaky ReLUでは<span class="marker-under">負の入力に対して小さな勾配を持ちます</span>。これにより、勾配が0になることを防ぎ、勾配消失問題を緩和します。<br>＃勾配の傾きを0.01に設定することは一般的な選択肢の一つであり、負の領域での<span class="marker-under">勾配がゼロになることを防ぎ</span>つつ、その影響を抑えるために小さな値が選ばれます。<br><br><span class="bold-green"><code>model.add(Dense(28*28*1,activation='tanh'))</code><br></span>#全結合層を追加します。Dense層は入力には１次元しか受け取れませんが、出力は何次元でもＯＫ。<br>＃<code><strong>28*28*1</strong></code>はMNISTデータセットの画像のサイズ（28&#215;28ピクセル）に合わせた<span class="marker-under">出力層のニューロン数</span>を表しています。<br>＃ <strong><span class="bold-red">tanh 関数</span></strong>は出力値を [-1, 1] の範囲にスケーリングします。GANではsigmoid(0~1)よりもtanhを使うことが一般的です。<br><br><span class="bold-green"><code>model.add(Reshape(shape))</code></span><br>＃Reshape 層を追加して、直前の全結合層の<span class="marker-under">出力を指定された画像形状に変形</span>します。これにより、画像の形状に合わせたデータ構造が得られます。<br><br><code><span class="bold-green">return model</span></code><br>#構築した Generator モデルを返します。</p>



<table border="0" cellpadding="0" cellspacing="0"><tr><td><div style="border:1px solid #95a5a6;border-radius:.75rem;background-color:#FFFFFF;width:280px;margin:0px;padding:5px;text-align:center;overflow:hidden;"><table><tr><td style="width:128px"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16191585%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;"><img decoding="async" src="https://hbb.afl.rakuten.co.jp/hgb/39414777.169c3d99.39414778.be6498e6/?me_id=1213310&#038;item_id=19903125&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F7710%2F9784839967710.jpg%3F_ex%3D128x128&#038;s=128x128&#038;t=picttext" border="0" style="margin:2px" alt="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]" title="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]"></a></td><td style="vertical-align:top;width:136px;display: block;"><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px;word-wrap:break-word"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16191585%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">実践GAN 敵対的生成ネットワークによる深層学習 （Compass Booksシリーズ） [ Jakub Langr ]</a><br><span >価格：4,048円（税込、送料無料)</span> <span style="color:#BBB">(2024/3/4時点)</span></p></td></tr></table></div><br><p style="color:#000000;font-size:12px;line-height:1.4em;margin:5px;word-wrap:break-word"></p></td></tr></table>



<h3 class="wp-block-heading"><span id="toc7">識別器（ディスクリミネーター）モデルを定義</span></h3>



<p>識別器というものを定義していきます。識別器とは、生成器 が生成した偽の画像と本物の画像を区別する役割を持ちます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def discriminator_model(shape):
    model = Sequential()
    model.add(Flatten(input_shape=shape))
    model.add(Dense(128))
    model.add(LeakyReLU(alpha=0.01))
    model.add(Dense(1, activation='sigmoid'))
    return model" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">discriminator_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">shape</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Flatten(</span><span style="color: #FD971F; font-style: italic">input_shape</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">shape))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(LeakyReLU(</span><span style="color: #FD971F; font-style: italic">alpha</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.01</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(Dense(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">activation</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;sigmoid&#39;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span></code></pre></div>



<p><span class="bold-green"><code>def discriminator_model(shape)</code>：<br></span><code>＃</code>この関数は、識別器モデルを構築するために使用されます。引数として <code>shape</code>（画像の形状）を受け取ります。<br><br><code><span class="bold-green">model=Sequential()</span></code><br>＃Sequential モデルを初期化します。モデル構築の開始合図だと思ってください。<br><br><span class="bold-green"><code>model.add(Flatten(input_shape=shape))</code><br></span>＃入力画像の形状を平滑化する Flatten 層を追加します。画像データは、2次元のグリッド（幅x高さ）なのでDesnse層に通すには１次元に直す必要がある。<br><br><span class="bold-green"><code>model.add(Dense(128))</code><br></span>＃全結合層を追加します。この層は、128 個のニューロンを持ちます。<br><br><span class="bold-green"><code>model.add(LeakyReLU(alpha=0.01))</code><br></span>＃生成器で説明済み<br><br><span class="bold-green"><code>model.add(Dense(1,activation='sigmoid'))</code><br></span>＃sigmoid関数は出力を0から1の範囲にマッピングするため、識別器の出力を確率として解釈することができます。出力が0に近いほど偽物である確率が高く、1に近いほど本物である確率が高いと解釈できます。<br>＃与えられた画像が本物か偽物かを判断することです。これが、生成器ではtanhを使い識別器ではsigmoidを使う理由です。生成器では出力を画像のピクセル値として解釈するためにtanh関数が使用されます。tanh関数は、出力を-1から1の範囲にマッピングするため、生成される画像の<span class="marker-under">ピクセル値を適切な範囲に収める</span>のに適しています。<br><br><span class="bold-green"><code>return model</code><br></span>＃構築した Discriminator モデルを返します。</p>



<h3 class="wp-block-heading"><span id="toc8">GANモデルの定義</span></h3>



<p>生成器（generator）と識別器（discriminator）を組み合わせて、GAN（Generative Adversarial Network）モデルを構築するための関数を作っていきましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def gan_model(generator, discriminator):
    model = Sequential()
    model.add(generator)
    model.add(discriminator)
    return model" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">gan_model</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">discriminator</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(generator)</span></span>
<span class="line"><span style="color: #F8F8F2">    model.add(discriminator)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> model</span></span></code></pre></div>



<p><span class="bold-green"><code>def gan_model(generator, discriminator)</code>：<br></span>＃この関数は、生成器と識別器を組み合わせて GAN モデルを構築するために使用されます。引数として 後に登場するgenerator=generator_model(shape,noise_dim)とdiscriminator=discriminator_model(shape)の値が入ります。<br><br><span class="bold-green"><code>model = Sequential()</code><br></span>＃Sequential モデルを初期化します。<br><br><span class="bold-green"><code>model.add(generator)</code><br></span>＃Generator モデルを追加します。Generator は偽の画像を生成する役割を持ちます。<br><br><span class="bold-green"><code>model.add(discriminator)</code><br></span>＃Discriminator モデルを追加します。Discriminator は生成された偽の画像と本物の画像を区別する役割を持ちます。<br><br><code><span class="bold-green">return model</span></code><br>＃構築した GAN モデルを返します。このモデルは、Generator と Discriminator を組み合わせています。</p>



<h3 class="wp-block-heading"><span id="toc9">モデルのコンパイル</span></h3>



<p>では、モデルをコンパイルしていきましょう。コンパイルとはモデルの損失関数、<span class="bold-red"><strong>最適化アルゴリズム</strong>、<strong>評価指標</strong></span>などを設定する作業のことです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="discriminator = discriminator_model(shape)
discriminator.compile(loss='binary_crossentropy', optimizer=Adam(), metrics=['accuracy'])
generator = generator_model(shape, noise_dim)
discriminator.trainable = False
gan = gan_model(generator, discriminator)
gan.compile(loss='binary_crossentropy', optimizer=Adam())" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">discriminator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> discriminator_model(shape)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam(), </span><span style="color: #FD971F; font-style: italic">metrics</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[</span><span style="color: #E6DB74">&#39;accuracy&#39;</span><span style="color: #F8F8F2">])</span></span>
<span class="line"><span style="color: #F8F8F2">generator </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator_model(shape, noise_dim)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.trainable </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">False</span></span>
<span class="line"><span style="color: #F8F8F2">gan </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> gan_model(generator, discriminator)</span></span>
<span class="line"><span style="color: #F8F8F2">gan.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;binary_crossentropy&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">Adam())</span></span></code></pre></div>



<p><span class="bold-green"><code>discriminator = </code>discriminator_model<code>(shape)</code><br></span>＃Discriminator モデルを構築します。discriminator_model 関数は、画像の形状 <code>shape</code> を引数として受け取り、それに基づいて Discriminator モデルを構築します。<br><br><span class="bold-green"><code>discriminator.compile(loss='binary_corssentropy', optimizer=Adam(), metrics=['accuracy'])</code><br></span>＃Discriminator モデルをコンパイルします。ここで、損失関数として binary_crossentropy を指定し、最適化アルゴリズムとして Adam を使用します。また、精度（accuracy）を評価指標として指定します。<br>＃<strong>binary_crossentropy</strong>は2つのクラス（本物または偽物）の確率分布間の距離を測定するための損失関数です。GANでは一般的な選択肢です。<br>＃<strong>Adam</strong>は高速な収束を実現するため、GANのような大規模かつ複雑なモデルのトレーニングに適しています。逆に小さなデータセットでは過剰適合のリスクが高くなってしまう。MNISTは60000枚の画像なので、Adamが適していると言える。<br>＃<strong>accuracy</strong>は二値分類のモデルの性能を簡潔に評価するための良い指標です。識別器は、本物のサンプルと生成されたサンプルの2つのクラスを分類するタスクを行うため適していると言えます。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1290/" title="【AI/座学編】AIの損失関数３選！" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790-160x90.png 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790-300x169.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790-1024x576.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790-768x432.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790-120x68.png 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790-320x180.png 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790.png 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/座学編】AIの損失関数３選！</div><div class="blogcard-snippet internal-blogcard-snippet">機械学習の初心者向けに解説。カテゴリカルクロスエントロピー＆バイナリクロスエントロピー＆平均二乗誤差について解説します。この次は、知識を使って、誰でもできる、実践編（プログラミング）を一緒にやっていきましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.04</div></div></div></div></a>
</div></figure>



<p><span class="bold-green"><code>generator = <strong><code>generator_model</code></strong>(shape, noise_dim)</code></span><br>＃Generator モデルを構築します。<code><strong><code>generator_model</code></strong></code> 関数は、画像の形状 <code>shape</code> と潜在空間の次元数 <code>noise_dim</code> を引数として受け取り、それに基づいて Generator モデルを構築します。<br><br><span class="bold-red"><code>discriminator.trainable = False</code><br></span>＃<code>trainable</code>属性を使用して、特定のモデルまたはレイヤーのトレーニング可能なパラメータを無効にする操作です。識別器のすべてのトレーニング可能なパラメータ（重み）を「フリーズ」することを意味します。つまり、この行以降で行われる識別器へのバックプロパゲーションによる更新は、識別器の重みには反映されません。この操作により、生成器のみが更新され、識別器の重みは固定された状態でトレーニングが行われます。<br><br><span class="bold-green"><code>gan = gan_model(generator, discriminator)</code><br></span>＃Generator と Discriminator を組み合わせて GAN モデルを構築します。<code>gan_model</code> 関数は、Generator モデルと Discriminator モデルを引数として受け取り、それらを組み合わせて GAN モデルを構築します。<br><br><span class="bold-green"><code>gan.compile(loss='binary_crossentropy', optimizer=Adam())</code></span><br>＃GAN モデルをコンパイルします。損失関数として binary_crossentropy を指定し、最適化アルゴリズムとして Adam を使用します。</p>



<p>p.s.識別機はコンパイルするのに、生成器はコンパイルしない理由は、GANの学習プロセスにおいて、生成器の更新はGANモデル全体で行われるためです。</p>



<h3 class="wp-block-heading"><span id="toc10">モデルの訓練</span></h3>



<p>指定した反復回数だけ 生成器 と 識別器 を訓練し、一定の間隔でサンプル画像を生成して訓練の進行状況を表示していく準備をしましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="losses=[]
accuracies=[]
iteration_checkpoints=[]

def train(iterations, batch_size,sample_interval):
    (X_train,_),(_,_)=mnist.load_data()

    X_train=X_train/127.5-1.0
    X_train=np.expand_dims(X_train,axis=3)

    real_label=np.ones((batch_size,1))

    fake_label=np.zeros((batch_size,1))
    for iteration in range(iterations):
        idx=np.random.randint(0,X_train.shape[0],batch_size)
        batch_images=X_train[idx]

        z=np.random.normal(0,1,(batch_size,noise_dim))
        gene_imgs=generator.predict(z)

        d_loss_real=discriminator.train_on_batch(batch_images,real_label)
        d_loss_fake=discriminator.train_on_batch(gene_imgs,fake_label)
        d_loss,accuracy=0.5*np.add(d_loss_real,d_loss_fake)

        z=np.random.normal(0,1,(batch_size,100))
        gene_imgs=generator.predict(z)

        g_loss=gan.train_on_batch(z,real_label)

        if(iteration+1)%sample_interval==0:

            losses.append((d_loss,g_loss))
            accuracies.append(100.0*accuracy)
            iteration_checkpoints.append(iteration+1)

            print(&quot;%d [D loss; %f, acc.; %.2f%%][G loss: %f]&quot;%
                  (iteration+1,d_loss,100.0*accuracy,g_loss))
            
            save_images(generator, iterations)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">losses</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[]</span></span>
<span class="line"><span style="color: #F8F8F2">accuracies</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[]</span></span>
<span class="line"><span style="color: #F8F8F2">iteration_checkpoints</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">train</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">iterations</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F8F8F2">,</span><span style="color: #FD971F; font-style: italic">sample_interval</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    (X_train,_),(_,_)</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">mnist.load_data()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    X_train</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">X_train</span><span style="color: #F92672">/</span><span style="color: #AE81FF">127.5</span><span style="color: #F92672">-</span><span style="color: #AE81FF">1.0</span></span>
<span class="line"><span style="color: #F8F8F2">    X_train</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">np.expand_dims(X_train,</span><span style="color: #FD971F; font-style: italic">axis</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    real_label</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">np.ones((batch_size,</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    fake_label</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">np.zeros((batch_size,</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> iteration </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(iterations):</span></span>
<span class="line"><span style="color: #F8F8F2">        idx</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">np.random.randint(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">,X_train.shape[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">],batch_size)</span></span>
<span class="line"><span style="color: #F8F8F2">        batch_images</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">X_train[idx]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        z</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">,(batch_size,noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">        gene_imgs</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">generator.predict(z)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_real</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">discriminator.train_on_batch(batch_images,real_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss_fake</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">discriminator.train_on_batch(gene_imgs,fake_label)</span></span>
<span class="line"><span style="color: #F8F8F2">        d_loss,accuracy</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.5</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">np.add(d_loss_real,d_loss_fake)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        z</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">,(batch_size,</span><span style="color: #AE81FF">100</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">        gene_imgs</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">generator.predict(z)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        g_loss</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">gan.train_on_batch(z,real_label)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">if</span><span style="color: #F8F8F2">(iteration</span><span style="color: #F92672">+</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">sample_interval</span><span style="color: #F92672">==</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">:</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            losses.append((d_loss,g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            accuracies.append(</span><span style="color: #AE81FF">100.0</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">accuracy)</span></span>
<span class="line"><span style="color: #F8F8F2">            iteration_checkpoints.append(iteration</span><span style="color: #F92672">+</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">%d</span><span style="color: #E6DB74"> [D loss; </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">, acc.; </span><span style="color: #AE81FF">%.2f%%</span><span style="color: #E6DB74">][G loss: </span><span style="color: #AE81FF">%f</span><span style="color: #E6DB74">]&quot;</span><span style="color: #F92672">%</span></span>
<span class="line"><span style="color: #F8F8F2">                  (iteration</span><span style="color: #F92672">+</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">,d_loss,</span><span style="color: #AE81FF">100.0</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">accuracy,g_loss))</span></span>
<span class="line"><span style="color: #F8F8F2">            </span></span>
<span class="line"><span style="color: #F8F8F2">            save_images(generator, iterations)</span></span></code></pre></div>



<p><span class="bold-green"><code>losses=[]</code>, <code>accuracies=[]</code>, <code>iteration_checkpoints=[]</code><br></span>＃損失と精度の履歴を保存するための空のリストを定義します。</p>



<p><span class="bold-green"><code>train(iterations, batch_size, sample_interval)</code><br></span>＃<code><strong>iterations</strong></code>: 1つのイテレーションは、生成器と識別器の両方が1度ずつトレーニングされるサイクル<br>＃<code><strong>batch_size</strong></code>: バッチサイズ<br>＃<code><strong>sample_interval</strong></code>: 何イテレーションごとに損失と精度が記録されるかを示します。この間隔に基づいて、トレーニング中の進行状況が監視され、結果が記録されます。<br><br><span class="bold-green"><code>(X_train,_),(_,_)=mnist.load_data()</code><br></span>＃ mnistデータセットからトレーニング用の画像データをロードします。<code>mnist.load_data()</code>は、トレーニング用とテスト用の画像データを返しますが、ここではトレーニング用のデータのみを利用しています。ロードされたデータは<code>X_train</code>に格納されます。<code>(_, _)</code>は、ラベルデータは使用しないことを示します。<br><br><span class="bold-green"><code>X_train=X_train/<span class="bold-red">127.5-1.0</span></code><br></span>＃画像のピクセル値を[-1, 1]の範囲に正規化します。確認してみると、255÷127.5-1.0=<strong>1</strong>になり0.000001(≒0)÷127.5-1=-0.99999~(≒<strong>-1</strong>)になりますよね。<br>＃データセットの平均を0にすることで、モデルの学習を安定化させ、収束を高速化することが期待できます。<br><br><span class="bold-green"><code>np.expand_dims(X_train, axis=3)</code></span><br>＃画像データの次元を変更します。元々の画像データは<code>(<code>num_samples</code>, width, height)</code>の形状をしていますが、これを<code>(num_samples, width, height, channels)</code>の形状に変更します。ここで<code>channels</code>は画像のチャンネル数で、グレースケール画像の場合は1です。<span class="bold-green"><br></span>＃要するに画像データの次元を<span class="marker-under">画像の情報を保持したまま</span>拡張しています。<br>＃ニューラルネットワークは<span class="marker-under">画像を入力する際には、チャンネルの情報が必要</span>です。しかし、画像データはチャンネル数を持ちません。そのため、次元を追加します。ニューラルネットワークは入力データの次元数からチャンネル数を判断するので、次元を増やせばチャンネルを表現できるのです。これは、グレースケール画像に限らず、RGB画像でも同じことです。<br><br>p.s.　<code><code>num_samples</code></code>は枚数を表しているよ！</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="例えば、
＃２ｘ２のグレースケール画像
[[[10, 20],
  [30, 40]],

これだとチャンネル数を表現できないので、

[[[[10],
   [20]],

  [[30],
   [40]]],
   
このように次元を増やすことが、ニューラルネットワークのチャンネル数の判断に使われるのです。


＃RGBでも同様で3x3のRGB画像の場合は
[[[255, 0, 0], [0, 255, 0], [0, 0, 255]],
 [[255, 255, 0], [255, 0, 255], [0, 255, 255]],
 [[128, 128, 128], [0, 0, 0], [255, 255, 255]]]
 
 次元数を増やして、ニューラルネットワークにチャンネル数の判断材料を与えてあげる。
 
 [[[[255], [0], [0]], [[0], [255], [0]], [[0], [0], [255]]],
 [[[255], [255], [0]], [[255], [0], [255]], [[0], [255], [255]]],
 [[[128], [128], [128]], [[0], [0], [0]], [[255], [255], [255]]]]
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">例えば、</span></span>
<span class="line"><span style="color: #F8F8F2">＃２ｘ２のグレースケール画像</span></span>
<span class="line"><span style="color: #F8F8F2">[[[</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">20</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">  [</span><span style="color: #AE81FF">30</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">40</span><span style="color: #F8F8F2">]],</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">これだとチャンネル数を表現できないので、</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">[[[[</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">   [</span><span style="color: #AE81FF">20</span><span style="color: #F8F8F2">]],</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  [[</span><span style="color: #AE81FF">30</span><span style="color: #F8F8F2">],</span></span>
<span class="line"><span style="color: #F8F8F2">   [</span><span style="color: #AE81FF">40</span><span style="color: #F8F8F2">]]],</span></span>
<span class="line"><span style="color: #F8F8F2">   </span></span>
<span class="line"><span style="color: #F8F8F2">このように次元を増やすことが、ニューラルネットワークのチャンネル数の判断に使われるのです。</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">＃RGBでも同様で3x3のRGB画像の場合は</span></span>
<span class="line"><span style="color: #F8F8F2">[[[</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">]],</span></span>
<span class="line"><span style="color: #F8F8F2"> [[</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">]],</span></span>
<span class="line"><span style="color: #F8F8F2"> [[</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">]]]</span></span>
<span class="line"><span style="color: #F8F8F2"> </span></span>
<span class="line"><span style="color: #F8F8F2"> 次元数を増やして、ニューラルネットワークにチャンネル数の判断材料を与えてあげる。</span></span>
<span class="line"><span style="color: #F8F8F2"> </span></span>
<span class="line"><span style="color: #F8F8F2"> [[[[</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">]], [[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">]], [[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">]]],</span></span>
<span class="line"><span style="color: #F8F8F2"> [[[</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">]], [[</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">]], [[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">]]],</span></span>
<span class="line"><span style="color: #F8F8F2"> [[[</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">128</span><span style="color: #F8F8F2">]], [[</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">]], [[</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">], [</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">]]]]</span></span>
<span class="line"></span></code></pre></div>



<p><span class="bold-green"><code>real_label=np.ones((batch_size,1))</code></span><br>#指定されたサイズの要素が全て1の配列を生成しています。具体的には、<code>real</code>はバッチサイズ分の要素を持つ列ベクトルで、各要素が1です。<br>＃識別器が本物の画像と偽物の画像を区別するために使用されます。ここで生成された<code>real</code>_labelは、識別器に対して<span class="marker-under">本物の画像を表すためのラベル</span>として使用されます。<br>＃要するに<span class="marker-under">本物の画像に対するラベルを作成</span>しています。本物の画像に対しては1を、偽の画像に対しては0を表すラベルをGANでは用います。<br><br><span class="bold-green"><code>fake_label=np.zeros((batch_size,1))</code><br></span>＃指定されたサイズの要素が全て0の配列を生成しています。具体的には、<code>fake</code>_labelはバッチサイズ分の要素を持つ列ベクトルで、各要素が0です。<br>＃ここで生成された<code>fake</code>_labelは、識別器に対して<span class="marker-under">偽の画像を表すラベル</span>として使用されます。<br>＃要するに<span class="marker-under">偽の画像に対するラベルを作成</span>しています。本物の画像に対しては1を、偽の画像に対しては0を表すラベルをGANでは用います。<br><br><span class="bold-green"><code>for iteration in range(iterations)</code>:<br></span>＃指定されたイテレーション数（学習の反復回数）の範囲でループを開始します。これにより、モデルは複数回の学習を行います。<br><br><span class="bold-green"><code>idx=np.random.randint(0,X_train.shape[0],batch_size)</code><br></span>＃ランダムに<code>X_train</code>からバッチサイズ分の<span class="marker-under">インデックスを選択</span>します。<br>＃np.random.randint(下限値、上限値、取得数）を表すから、０以上X_trainの枚数未満の中からbatch_sizeの数だけランダムにとりだす。<br>＃要するにトレーニングデータから<span class="marker-under">ランダムにバッチを取得</span>します。<br><br><span class="bold-green"><code>batch_images=X_train[idx]</code></span><br>＃上のコードで、選択されたインデックスを使用して、<code>X_train</code>から対応する本物の画像のバッチを取得します。<br><br><span class="bold-green"><code>z=np.random.normal(0,1,(batch_size,noise_dim))</code></span><br>＃平均が0で標準偏差が1の正規分布（<strong>標準正規分布</strong>）からランダムな値を持つ<span class="bold-red">ノイズベクトル</span>を生成しています。生成されたノイズベクトルの形状は<code>(batch_size, noise_dim)</code>であり、<code>batch_size</code>は1つのバッチ内のノイズベクトルの数を表し、noise_dimは1つのノイズベクトルの次元数を表します。<br>＃<strong>標準正規分布</strong>は最も一般的で汎用的な確率分布の1つであり、さまざまなデータセットや問題に適用できます。また、パラメータが少なく単純な形をしており、扱いやすいです。そして、ランダムなノイズが標準正規分布に従うことで、生成される画像の多様性が確保されるという特性を持ちます。<br>＃要するに正規分布からランダムなノイズを生成しています。で、このノイズは生成器に入力され、<span class="marker-under">偽の画像を生成する際に使用</span>されます。<br><br><span class="bold-green"><code>gene_imgs=generator.predict(z)</code></span><br>＃生成器にノイズベクトル <code>z</code> を入力として与え、生成器がその入力を元に<span class="marker-under">偽の画像を生成する</span>操作を行います。<br><br><span class="bold-green"><code>d_loss_real=discriminator.train_on_batch(batch_images,real_label)</code></span><br>#識別器モデルを1バッチ分の実際の画像データ batch_images とそれに対応する正解ラベル <code>real</code>_label でトレーニングする操作を行います。<br>＃<strong>train_on_batch</strong>における<span class="marker-under">第一引数は入力データ</span>のバッチです。Numpy配列またはリストの形式で指定します。<span class="marker-under">第二引数は入力データに対応する目標（正解ラベル）</span>のバッチです。Numpy配列またはリストの形式で指定します。通常、教師あり学習の場合に使用されます。<br>＃要するに、識別器を使用して、本物の画像のバッチに対する損失と精度を計算しています。<code><strong>train_on_batch</strong></code>メソッドは、入力データ（batch_images）と正解ラベル(real_lbel)を使用して、1つのバッチに対する損失と精度を計算しています。そして、<code>d_loss_real</code>にはこのトレーニングの結果得られる損失が格納されます。<br><br><span class="bold-green"><code>d_loss_fake=discriminator.train_on_batch(<span class="bold-green"><code>gene_imgs</code></span>,fake_label)</code></span><br>＃上のコードと同様の流れで、識別器を使用して、生成された偽の画像のバッチに対する損失と精度を計算します。そして、<code>d_loss_fake</code>にはこのトレーニングの結果得られる損失が格納されます。<br><br><span class="bold-green"><code>d_loss, accuracy=0.5*np.add(d_loss_real, d_loss_fake)</code></span><br>＃<code><strong>np.add(d_loss_real, d_loss_fake)</strong></code>は、本物の画像と偽の画像の損失を要素ごとに加算します。つまり、各バッチでの本物の画像と偽の画像に関する損失を合計します。<br>＃<code><strong>0.5 * np.add(d_loss_real, d_loss_fake)</strong></code>は、合計された損失を<span class="bold-red">0.5倍</span>しています。これは、本物の画像と偽の画像の損失を等しく重み付けするためです。GANのトレーニングでは、識別器の目標は本物の画像と偽の画像を区別することであり、両方のタスクが均等に重要であるため、損失を均等に重み付けすることが一般的です。<br>#要するに本物の画像と偽の画像の両方に対する損失と精度を組み合わせて、<span class="marker-under">識別器の全体的な損失と精度を計算</span>します。<br><br><span class="bold-red">discriminator.trainable = False</span><br>＃生成器の訓練を行うため、識別器の訓練を<span class="bold-red">一時停止</span>します。これにより、生成器が訓練される間、<span class="marker-under">識別器の重みが固定</span>されます。<span class="bold-red"><br>g_loss = gan.train_on_batch(z, real_label)</span><br>＃生成器の訓練を行います。生成器は、生成された偽の画像を本物と見なすように学習します。<span class="bold-red"><br>discriminator.trainable = True</span><br>＃生成器の訓練が終了した後、識別器の訓練を再開します。これにより、識別器のパラメータが更新され、次のイテレーションで使用されます。<br><br><span class="bold-red"><span class="bold-green"><code>if(iteration+1)%sample_interval==0</code>：</span></span><br>＃イテレーション数が<code>sample_interval</code>の倍数の場合に、以下の処理を実行します。つまり、指定された間隔ごとにこのブロックの中の処理が実行されます。<br>＃iterationは0から始まるので１を足しています。<br><br><span class="bold-green">losses.append((d_loss,g_loss))</span><br>＃識別器と生成器の損失を<code>losses</code>リストに追加します。これにより、各イテレーションでの損失の推移を記録することができます。<span class="bold-green"><br></span>＃このようにして、トレーニング中に損失を記録することで、モデルの収束やトレーニングの安定性を評価したり、後で損失の推移を可視化することができます。<br><span class="bold-green"><br>accuracies.append(100.0*accuracy)</span><br>＃識別器の精度を<code>accuracies</code>リストに追加します。この精度はパーセンテージで表され、<span class="marker-under">識別器が正確に本物と偽物を区別できる割合</span>を示します。<span class="bold-green"><br><br>iteration_checkpoints.append(iteration+1)</span><br>＃現在のイテレーション数を<code>iteration_checkpoints</code>リストに追加します。これにより、どのイテレーションで何が行われたかを追跡することができます。イテレーション数に1を加えているのは、イテレーション数が０から始まるためです。<br><span class="bold-green"><br>print(&#8220;%d [D loss; %f, acc.; %.2f%%][G loss: %f]&#8221;<span class="bold-red">%</span>( iteration+ 1 ,d _ loss , 100.0* accuracy,g_loss))</span><br>＃現在のイテレーション数、識別器の損失と精度、生成器の損失を表示します。これにより、コンソールに学習の進行状況が表示されます。<br>＃ <code>%d</code> と <code>%f</code>とかは文字列フォーマットです。<br>・<code>%d</code> : 整数を埋め込むための指定子です。この場合、<code>iteration + 1</code> の値が整数として挿入されます。<br>・<code>%f</code> : 浮動小数点数を埋め込むための指定子です。この場合、<code>d_loss</code>、<code>accuracy</code>、<code>g_loss</code> の値が浮動小数点数として挿入されます。<br>・<code>%.2f</code> のように <code>.2</code> のような小数点以下の桁数を指定することもできます。これにより、表示される浮動小数点数の桁数が制限できます。<br><br><span class="bold-green">save_images(generator, iterations+1)<br></span>＃生成器を使用して、指定されたイテレーションでの生成された画像を保存します。これにより、生成された画像の品質を確認することができます。<br>＃save_images関数は以下で定義します。</p>



<table border="0" cellpadding="0" cellspacing="0"><tr><td><div style="border:1px solid #95a5a6;border-radius:.75rem;background-color:#FFFFFF;width:280px;margin:0px;padding:5px;text-align:center;overflow:hidden;"><table><tr><td style="width:128px"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/3a19e183.08365096.3a19e184.6a2b305f/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Frakutenkobo-ebooks%2F225d6d5f84ff3e30b07fb873e3b2c161%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;"><img decoding="async" src="https://hbb.afl.rakuten.co.jp/hgb/3a19e183.08365096.3a19e184.6a2b305f/?me_id=1278256&#038;item_id=21845319&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Frakutenkobo-ebooks%2Fcabinet%2F5327%2F2000012285327.jpg%3F_ex%3D128x128&#038;s=128x128&#038;t=picttext" border="0" style="margin:2px" alt="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]" title="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]"></a></td><td style="vertical-align:top;width:136px;display: block;"><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px;word-wrap:break-word"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/3a19e183.08365096.3a19e184.6a2b305f/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Frakutenkobo-ebooks%2F225d6d5f84ff3e30b07fb873e3b2c161%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">図解即戦力　AIのしくみと活用がこれ1冊でしっかりわかる教科書【電子書籍】[ 高橋海渡 ]</a><br><span >価格：2,200円</span> <span style="color:#BBB">(2024/3/4時点)</span></p></td></tr></table></div><br><p style="color:#000000;font-size:12px;line-height:1.4em;margin:5px;word-wrap:break-word"></p></td></tr></table>



<h3 class="wp-block-heading"><span id="toc11">生成画像の保存</span></h3>



<p>Generator を使用して生成された画像を指定されたサイズのグリッドに保存していきます。デフォルトでは、4&#215;4 のグリッドに画像が配置されます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="def save_images(generator, iteration, directory='gan_images', image_grid_rows=4, image_grid_columns=4):
    if not os.path.exists(directory):
        os.makedirs(directory)

    for i in range(iterations):
        z = np.random.normal(0, 1, (image_grid_rows * image_grid_columns, noise_dim))
        gene_imgs = generator.predict(z)
        gene_imgs = 0.5 * gene_imgs + 0.5
        fig, axs = plt.subplots(image_grid_rows, image_grid_columns, figsize=(4, 4), sharey=True, sharex=True)
        cnt = 0
        for row in range(image_grid_rows):
            for col in range(image_grid_columns):
                axs[row, col].imshow(gene_imgs[cnt, :, :, 0], cmap='gray')
                axs[row, col].axis('off')
                cnt += 1

        plt.savefig(f&quot;{directory}/gan_generated_image_{i}.png&quot;)
        plt.close()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">save_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">generator</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">iteration</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">directory</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;gan_images&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_rows</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">image_grid_columns</span><span style="color: #F92672">=</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> os.path.exists(directory):</span></span>
<span class="line"><span style="color: #F8F8F2">        os.makedirs(directory)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> i </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(iterations):</span></span>
<span class="line"><span style="color: #F8F8F2">        z </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.random.normal(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, (image_grid_rows </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> image_grid_columns, noise_dim))</span></span>
<span class="line"><span style="color: #F8F8F2">        gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> generator.predict(z)</span></span>
<span class="line"><span style="color: #F8F8F2">        gene_imgs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">*</span><span style="color: #F8F8F2"> gene_imgs </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0.5</span></span>
<span class="line"><span style="color: #F8F8F2">        fig, axs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> plt.subplots(image_grid_rows, image_grid_columns, </span><span style="color: #FD971F; font-style: italic">figsize</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">4</span><span style="color: #F8F8F2">), </span><span style="color: #FD971F; font-style: italic">sharey</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">sharex</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        cnt </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> row </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_rows):</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> col </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(image_grid_columns):</span></span>
<span class="line"><span style="color: #F8F8F2">                axs[row, col].imshow(gene_imgs[cnt, :, :, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">], </span><span style="color: #FD971F; font-style: italic">cmap</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;gray&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">                axs[row, col].axis(</span><span style="color: #E6DB74">&#39;off&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">                cnt </span><span style="color: #F92672">+=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        plt.savefig(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">directory</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">/gan_generated_image_</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">i</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">.png&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        plt.close()</span></span></code></pre></div>



<p><code><span class="bold-green">def save_images(generator, iteration, directory='gan_images', image_grid_rows=4, image_grid_columns=4):</span></code><br>＃<code>generator</code> は、画像を生成するために使用される Generator モデルです。<br>＃<code>iterations</code> は、保存される画像の数を決定します。各イテレーションごとに1つの画像が保存されます。<br>＃<code>directory</code>＝ は、画像が保存されるディレクトリのパスを指定します。デフォルトは &#8216;gan_images&#8217; 。お好きな名前でどうぞ！<br>＃<code>image_grid_rows</code> は、保存される画像のグリッドの行数を決定します。デフォルトは 4 です。<br>＃<code>image_grid_columns</code> は、保存される画像のグリッドの列数を決定します。デフォルトは 4 です。<br><br><span class="bold-green"><code>if not os.path.exists(directory)</code>:<br>　<code>os.makedirs(directory)</code></span><br>#指定されたディレクトリが存在しない場合は、デフォルトで設定したディレクトリを作成します。このディレクトリは、生成された画像が保存される場所です。<br><br><code><span class="bold-green">z = np.random.normal(0, 1, (image_grid_rows * image_grid_columns, noise_dim))</span></code><br>#<code>0</code>：正規分布の平均を指定します。<br>＃<code>1</code>：正規分布の標準偏差を指定します。<br>＃正規分布から<span class="marker-under">ランダムなノイズを生成</span>します。これは、生成器に入力する際に、画像を生成する際のランダム性を与えます。<br><br><span class="bold-green"><code><span class="bold-green"><code>gene_imgs</code></span> = generator.predict(z)</code><br></span>＃生成器にノイズを入力し、画像を生成します。<br><br><span class="bold-green"><code><span class="bold-green"><code>gene_imgs</code></span> = 0.5 * <span class="bold-green"><code>gene_imgs</code></span> + 0.5</code><br></span>＃生成された画像のピクセル値を[-1, 1]から[0, 1]に変換します。これにより、画像が正規化されます。<br>＃以下で用いるmatplotlib の<span class="marker-under"> imshow 関数を使用する場合、ピクセル値が [0, 1] の範囲</span>にあることが前提とされます。<br><br><code><span class="bold-green">fig, axs = plt.subplots(image_grid_rows, image_grid_columns, figsize=(4, 4), sharey=True, sharex=True)</span></code><br>＃画像を表示するための図（figure）と軸（axes）を作成します。<br>＃<code><strong>plt.subplots()</strong></code> 関数は、指定された行数と列数のグリッド状の図を作成します。<br>＃<code><strong>image_grid_rows</strong></code>：グリッドの<span class="marker-under">行数を指定</span>します。これは画像のグリッドの縦のセル数を表します。<br>＃<code><strong>image_grid_columns</strong></code>：グリッドの<span class="marker-under">列数を指定</span>します。これは画像のグリッドの横のセル数を表します。<br>＃<code><strong>figsize=(4, 4)</strong></code>：生成される図のサイズを指定します。ここでは、幅と高さがともに 4 インチの正方形に設定されています。<br>＃<code><strong>sharey=True</strong></code>：すべてのサブプロットが縦軸を共有するように設定します。つまり、すべてのサブプロットが同じ縦軸のスケールを持ちます。複数のサブプロット間でデータを比較したり、パターンを識別したりする場合に便利です。<br>＃<code><strong>sharex=True</strong></code>：すべてのサブプロットが横軸を共有するように設定します。あとは、shareyと同じ。<br>＃<code><strong>fig, axs</strong></code>：<code>plt.subplots()</code> 関数は、作成された図とそれに含まれるすべてのサブプロットを返します。このコードでは、<code>fig</code> は図全体を表し、<code>axs</code> はすべてのサブプロットを含む配列です。<br>＃要するにこの行の結果として、<code>fig</code> には指定されたサイズと行数・列数に基づいてグリッド状に配置されたサブプロットが含まれ、<code>axs</code> にはそれらのサブプロットへの参照が格納されます。これらのサブプロットは、後で画像を描画するために使用されます。<br><br><br><span class="bold-green">cnt=0</span><br>＃表示する画像の<span class="bold-red">カウンターを初期化</span>します。<span class="bold-green"><br></span>#この行は、サブプロットのインデックスを追跡するための変数 <code>cnt</code> を初期化しています。通常、画像のグリッドなどの複数のサブプロットを配置する場合、各サブプロットに対してループを行い、それぞれのサブプロットに対して特定の操作を行います。この変数 <code>cnt</code> は、そのようなループ内で<span class="marker-under">各サブプロットのインデックスを追跡するため</span>に使用されます。各サブプロットのインデックスを <code>cnt</code> で表現することで、そのインデックスに基づいてサブプロットに対する操作を行うことができます。<br><br><span class="bold-green"><code>for row in range(image_grid_rows): </code><br>　<code>for col in range(image_grid_columns):</code></span><br>　<span class="bold-green"><code>axs[row, col].imshow(<span class="bold-green"><code>gene_imgs</code></span>[cnt, :, :, 0], cmap='gray')</code></span><br><span class="bold-green">　axs[row, col].axis(&#8216;off&#8217;)</span><br><span class="bold-green">　cnt += 1</span><br>＃ループを使用して、生成された画像をグリッド状に表示します。<code>imshow</code>メソッドを使用して画像を表示し、<code>axis('off')</code>を使用して軸を非表示にします。<span class="bold-green"><br></span>＃<code>row</code> と <code>col</code> のインデックスを使用して、指定された行と列の位置にあるサブプロットに画像を表示するために <code>imshow()</code> 関数を呼び出しています。<br>#<code><strong>axs[row, col]</strong></code>：<code>axs</code> は <code>plt.subplots()</code> 関数で生成されたサブプロットの配列です。<code>row</code> と <code>col</code> のインデックスを使用して、特定の行と列の位置にあるサブプロットにアクセスしています。<br>#<code><strong>.imshow(gene_imgs[cnt, :, :, 0], cmap='gray')</strong></code>：<code>imshow()</code> 関数は、<span class="marker-under">画像を表示するため</span>の Matplotlib の関数です。指定された画像をサブプロットに表示します。<br>#<code><strong>gene_imgs[cnt, :, :, 0]</strong></code>：<code>gene_imgs</code> は生成された画像の行列です。<code>cnt</code> は、現在の画像のインデックスを表します。<code>:, :, :, 0</code> は、RGB チャンネルがある場合でも、最初のチャンネル（グレースケール画像の場合は唯一のチャンネル）を取得します。<br>#<code><strong>cmap='gray'</strong></code>：画像のカラーマップを指定します。<code>'gray'</code> は、グレースケールの画像を表示するためのカラーマップです。<br>#Matplotlib の <code>axis()</code> 関数は、軸の表示を制御するために使用されます。<code>'off'</code> を指定することで、軸を非表示にします。これにより、画像が表示されるだけで、周囲に軸が表示されなくなります。一般的に、<span class="marker-under">画像を表示する際には軸を非表示にする</span>ことが多いため、この設定が使用されます。<br>#<strong>cnt += 1</strong>：サブプロット内で処理される画像のインデックスを更新するために、<code>cnt</code> 変数に 1 を加算しています。これにより、画像が正しい順序でグリッドに配置されることが保証されます。<br><br><span class="bold-green">fig.savefig(f&#8221;{directory}/iteration_{iteration}.png&#8221;)<br></span>＃生成された図を指定されたディレクトリに保存します。イテレーション番号が含まれたファイル名で保存されます。<br>＃<code>savefig()</code> 関数は、現在の図を指定されたファイル名で保存します。<br><br><span class="bold-green">plt.close(fig)<br></span>＃生成した図を閉じます。これにより、メモリの使用量が減少し、プログラムが効率的に実行されます。<span class="bold-green"><br></span>＃<code>close()</code> 関数は、現在の図を閉じてメモリを解放します。図を閉じることで、プログラムがメモリを効率的に管理し、リソースの無駄な使用を防ぎます。→<span class="marker-under">メモリリークを防ぐ</span></p>



<p>p.s.メモリリークとは使い終わった不要なメモリを開放しないことで、メモリの使用量が増加し続ける現象を指します。</p>



<table border="0" cellpadding="0" cellspacing="0"><tr><td><div style="border:1px solid #95a5a6;border-radius:.75rem;background-color:#FFFFFF;width:280px;margin:0px;padding:5px;text-align:center;overflow:hidden;"><table><tr><td style="width:128px"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/3a127533.2c06dfe0.3a127534.35333603/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fhmvjapan%2F9531400%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;"><img decoding="async" src="https://hbb.afl.rakuten.co.jp/hgb/3a127533.2c06dfe0.3a127534.35333603/?me_id=1251035&#038;item_id=25124632&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fhmvjapan%2Fcabinet%2F9532000%2F9531400.jpg%3F_ex%3D128x128&#038;s=128x128&#038;t=picttext" border="0" style="margin:2px" alt="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]" title="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]"></a></td><td style="vertical-align:top;width:136px;display: block;"><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px;word-wrap:break-word"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/3a127533.2c06dfe0.3a127534.35333603/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fhmvjapan%2F9531400%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">Pythonで機械学習入門 深層学習から敵対的生成ネットワークまで / 大関真之 【本】</a><br><span >価格：2,640円（税込、送料別)</span> <span style="color:#BBB">(2024/3/4時点)</span></p></td></tr></table></div><br><p style="color:#000000;font-size:12px;line-height:1.4em;margin:5px;word-wrap:break-word"></p></td></tr></table>



<h3 class="wp-block-heading"><span id="toc12">モデルの実行</span></h3>



<p>GANモデルは時間がかかります。自分の時間と相談しながら、パラメーターを設定してください。<br><br>p.s.以下の設定だと１０時間以上はかかります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="iterations = 20000
batch_size = 128
sample_interval = 1000
train(iterations, batch_size, sample_interval)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">iterations </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">20000</span></span>
<span class="line"><span style="color: #F8F8F2">batch_size </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">128</span></span>
<span class="line"><span style="color: #F8F8F2">sample_interval </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">1000</span></span>
<span class="line"><span style="color: #F8F8F2">train(iterations, batch_size, sample_interval)</span></span></code></pre></div>



<p><span class="bold-green">iterations=20000</span><br>＃訓練のイテレーション数を指定します。生成モデルと識別モデルの訓練プロセスが <code>20000</code> 回の反復で行われることを示しています。</p>



<p><span class="bold-green">batch_size=256</span><br>＃バッチサイズを指定します。一度にモデルに渡される訓練サンプルの数です。<br>＃GPUを使用する場合はバッチサイズの選択肢は、32、64、128、256などの2の冪乗にするのが一般的です。CPUの場合はあまり関係ありません。（この実践はCPUでやっています。）</p>



<p><span class="bold-green">sample_interval=1000</span><br>＃進捗を表示するために、途中経過を確認する頻度を示しています。何回のイテレーションごとに進捗を表示するかを示します。<br>＃この場合、1000イテレーションごとに損失と精度を記録し、画像を保存します。</p>



<p><span class="bold-green">train(iterations,batch_size,sample_interval)</span><br>＃<code>train</code>関数を呼び出して、GANの訓練を開始します。指定された反復回数（<code>iterations</code>）、バッチサイズ（<code>batch_size</code>）、サンプル間隔（<code>sample_interval</code>）で訓練が行われます。</p>



<h3 class="wp-block-heading"><span id="toc13">モデルの保存とロード方法</span></h3>



<p>それでは、モデルを保存しましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="generator.save('gene_mod.keras')
discriminator.save('disc_mod.keras')
gan.save('gan_model.keras')" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">generator.save(</span><span style="color: #E6DB74">&#39;gene_mod.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">discriminator.save(</span><span style="color: #E6DB74">&#39;disc_mod.keras&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">gan.save(</span><span style="color: #E6DB74">&#39;gan_model.keras&#39;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p><span class="bold-green">generator.save(&#8216;gene_mod.keras&#8217;)</span><br>＃訓練が完了した後、生成器のモデルをファイルに保存します。ここでは、gene_mod.kerasという名前で保存されます。<span class="bold-green"><br>discriminator.save(&#8216;disc_mod.keras&#8217;)</span><br>#訓練が完了した後、識別器のモデルをファイルに保存します。ここでは、disc_mod.kerasという名前で保存されます。<span class="bold-green"><br>gan.save(&#8216;gan_mode.keras&#8217;)</span><br>＃訓練が完了した後、GANモデル全体をファイルに保存します。ここでは、<code>gan_model_りおちゃん.keras</code>という名前で保存されます。<br><br>p.s.前回まではh5を使っていましたがKeras 形式を使用すると、モデルの保存とロードがより柔軟で効率的になることが判明したのでこうしました。<br>＃HDF5 形式では、モデルのアーキテクチャ、重み、トレーニング設定などが単一のファイルに保存されます。</p>



<table border="0" cellpadding="0" cellspacing="0"><tr><td><div style="border:1px solid #95a5a6;border-radius:.75rem;background-color:#FFFFFF;width:280px;margin:0px;padding:5px;text-align:center;overflow:hidden;"><table><tr><td style="width:128px"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16403875%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;"><img decoding="async" src="https://hbb.afl.rakuten.co.jp/hgb/39414777.169c3d99.39414778.be6498e6/?me_id=1213310&#038;item_id=20083321&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F9205%2F9784873119205.jpg%3F_ex%3D128x128&#038;s=128x128&#038;t=picttext" border="0" style="margin:2px" alt="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]" title="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]"></a></td><td style="vertical-align:top;width:136px;display: block;"><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px;word-wrap:break-word"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16403875%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">生成 Deep Learning 絵を描き、物語や音楽を作り、ゲームをプレイする [ David Foster ]</a><br><span >価格：4,180円（税込、送料無料)</span> <span style="color:#BBB">(2024/3/4時点)</span></p></td></tr></table></div><br><p style="color:#000000;font-size:12px;line-height:1.4em;margin:5px;word-wrap:break-word"></p></td></tr></table>



<h6 class="wp-block-heading"><span id="toc14">モデルのロード</span></h6>



<p>モデルをロードする時はh5と同じ流れです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="  from keras.models import load_model
  
  # 保存されたモデルをロード
  loaded_model = load_model('generator_model.keras')" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">  </span><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> load_model</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #88846F"># 保存されたモデルをロード</span></span>
<span class="line"><span style="color: #F8F8F2">  loaded_model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> load_model(</span><span style="color: #E6DB74">&#39;generator_model.keras&#39;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p>これで、学習したモデルを再利用できます。</p>



<h2 class="wp-block-heading"><span id="toc15">おわりに</span></h2>



<p>ふーっ。やっと終わりました。ちょっと長かったですね。<br><br>偽画像が生成されるのは感動したけど、思ったより精度は高くなかったですよね。</p>



<p>次回はこの課題を克服していきます。層を少しだけ変えてやるだけで精度を劇的に高められます。また、そこ以外は今回と同じコードを使用するので、労力は少ないです。今日頑張ったので次回は楽に実装していきましょう！</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1074/" title="【AI/実践編】DCGANで高画質化【衝撃簡単⑤】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/4acf5a89043e4ae1f9418f77c3b4de49.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】DCGANで高画質化【衝撃簡単⑤】</div><div class="blogcard-snippet internal-blogcard-snippet">衝撃簡単です。DCGANを使ってフェイク画像を作っていきましょう！ディープフェイクにも使われている技術を誰でも、簡単にできるようにまとめました。AI学習は座学よりも実践あるのみです！DCGANを体験していきましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.02</div></div></div></div></a>
</div><figcaption class="wp-element-caption">本物と見分けがつかない偽物をつくろう！</figcaption></figure>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【AI/実践編】WebカメラとAIを連携【衝撃簡単③】</title>
		<link>https://ascend-beyond.com/study/855/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Sun, 25 Feb 2024 08:00:33 +0000</pubDate>
				<category><![CDATA[AI（人工知能）]]></category>
		<category><![CDATA[Study]]></category>
		<category><![CDATA[実践]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[独学]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=855</guid>

					<description><![CDATA[目次 対象読者今日のゴール今日使うコードカメラ入力の設定カメラを起動させるキャプチャ機能を追加無限ループ対策を追加対象領域をカメラ内に表示画像データの前処理入力サイズの変形モデルをロード前回のモデルがない場合おわりに 対 [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">対象読者</a><ol><ol><ol><li><a href="#toc2" tabindex="0">今日のゴール</a></li></ol></li></ol></li><li><a href="#toc3" tabindex="0">今日使うコード</a></li><li><a href="#toc4" tabindex="0">カメラ入力の設定</a><ol><ol><li><a href="#toc5" tabindex="0">カメラを起動させる</a></li><li><a href="#toc6" tabindex="0">キャプチャ機能を追加</a></li><li><a href="#toc7" tabindex="0">無限ループ対策を追加</a></li><li><a href="#toc8" tabindex="0">対象領域をカメラ内に表示</a></li><li><a href="#toc9" tabindex="0">画像データの前処理</a></li><li><a href="#toc10" tabindex="0">入力サイズの変形</a></li></ol></li></ol></li><li><a href="#toc11" tabindex="0">モデルをロード</a></li><li><a href="#toc12" tabindex="0">前回のモデルがない場合</a></li></ol></li><li><a href="#toc13" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">対象読者</span></h2>



<p>AIで何をつくっていいかわからない。そんな人に『衝撃簡単シリーズ』はおすすめです。今回はその３回目です。<br><br>前回はCNNを使ってよりディープラーニングらしいものを作りました。今回はそこから少しだけレベルアップして<strong>リアルタイムでカメラに映し出された画像データを分析する</strong>ということをやっていきます。</p>



<p>もし分からないところがあっても、そのうち絶対分かるので気長に気楽にやっていきましょう！</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/797/" title="【AI/実践編】MNISTでAIを体験【衝撃簡単①】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】MNISTでAIを体験【衝撃簡単①】</div><div class="blogcard-snippet internal-blogcard-snippet">AIの深い原理が分からなくても作れます！MNISTを使ったとっても簡単な実装をやっていきます。AIの概要は学んだけど何から作ればいいんだろう。という悩みをお持ちのあなたにピッタリのタスクです。また、始めたばかりで100％の理解を求める必要はありません。50%理解できたらいいや程度の軽い気持ちで学習を進めましょう。その方が挫折することなく長期間続けられ、結果的にいつか50%の理解が90%以上の理解になる時がきます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.24</div></div></div></div></a>
</div><figcaption class="wp-element-caption">前前回↑</figcaption></figure>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/other/851/" title="【AI/実践編】CNNを構築【衝撃簡単②】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】CNNを構築【衝撃簡単②】</div><div class="blogcard-snippet internal-blogcard-snippet">CNNを簡単に構築していきましょう！ＡＩ実装初心者にとても適した内容となっています。AIの概要は学んだけど何から作ればいいんだろう。という悩みをお持ちの方にピッタリです。今回はＣＮＮ（畳み込みニューラルネットワーク）を構築していきます。今日も気楽にやっていきましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.24</div></div></div></div></a>
</div><figcaption class="wp-element-caption">前回↑</figcaption></figure>



<h5 class="wp-block-heading"><span id="toc2">今日のゴール</span></h5>



<p>今日はカメラで数字を認識させて、その数字を学習したモデルに通して数字を当てさせるところをゴールとしてやっていきます。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="952" height="748" src="https://ascend-beyond.com/wp-content/uploads/2024/02/a417c91f74f70dae1b35427086582fed.jpg" alt="カメラ分析" class="wp-image-967" style="width:839px;height:auto" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/a417c91f74f70dae1b35427086582fed.jpg 952w, https://ascend-beyond.com/wp-content/uploads/2024/02/a417c91f74f70dae1b35427086582fed-300x236.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/a417c91f74f70dae1b35427086582fed-768x603.jpg 768w" sizes="(max-width: 952px) 100vw, 952px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="101" src="https://ascend-beyond.com/wp-content/uploads/2024/02/dbe1f477b54a6a0f6ec3e30dd5ed3737-1024x101.png" alt="CMD" class="wp-image-968" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/dbe1f477b54a6a0f6ec3e30dd5ed3737-1024x101.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/dbe1f477b54a6a0f6ec3e30dd5ed3737-300x30.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/dbe1f477b54a6a0f6ec3e30dd5ed3737-768x76.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/dbe1f477b54a6a0f6ec3e30dd5ed3737.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>また、今回もこちらのサイト（<a rel="nofollow noopener" href="https://qiita.com/Ka-k/items/b9da86a3dfaac104aa02" target="_blank">https://qiita.com/Ka-k/items/b9da86a3dfaac104aa02</a>）を参考に進めさせてもらいます。こちらはAI初心者にはとても参考になるサイトですが、少し古い部分があったりします。なので、本ページでは今風にアレンジしつつ誰でも実装できるように解説していきます。</p>



<h3 class="wp-block-heading"><span id="toc3">今日使うコード</span></h3>



<p>これが今日の全コードです。理解のために、コードと説明の順番が上下するので、もし迷ったらこちらを参考にしてください。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import cv2
from keras.models import load_model
import numpy as np

cap = cv2.VideoCapture(0)

while(True):
    ret, frame = cap.read()

    h, w, _ = frame.shape[:3] 

    w_center = w//2 
    h_center = h//2 

    cv2.rectangle(frame, (w_center-71, h_center-71),  
                 (w_center+71, h_center+71),(255, 0, 0)) 
    cv2.imshow(&quot;frame&quot;,frame) 

    k =  cv2.waitKey(1) &amp; 0xFF
    prop_val = cv2.getWindowProperty(&quot;frame&quot;, cv2.WND_PROP_ASPECT_RATIO)

    if k == ord(&quot;q&quot;) or (prop_val &lt; 0):
        break
    elif k == ord(&quot;s&quot;):
        im = frame[h_center-70:h_center+70, w_center-70:w_center+70] 
        im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) 

        _, th = cv2.threshold(im, 0, 255, cv2.THRESH_OTSU) 
        th = cv2.bitwise_not(th)
        th = cv2.GaussianBlur(th,(9,9), 0) 
        cv2.imwrite(&quot;capture.jpg&quot;, th)
        break

cap.release()
cv2.destroyAllWindows()


#-----------------------------------------


Xt = []
img = cv2.imread(&quot;capture.jpg&quot;, 0)
img = cv2.resize(img,(28, 28), cv2.INTER_CUBIC)

Xt.append(img)
Xt = np.array(Xt)/255




model = load_model(&quot;ai-third.h5&quot;)

result = model.predict(Xt)#モデルの予測を抽出
top3_probs = np.sort(result, axis=1)[:, ::-1][:, :3]
top3_classes = np.argsort(result, axis=1)[:, ::-1][:, :3]

# 結果を出力
for i in range(len(top3_probs)):
    print(f&quot;サンプル {i+1} の上位3つのクラスと確率:&quot;)
    for j in range(3):
        print(f&quot;クラス {top3_classes[i][j]}: 確率 {top3_probs[i][j]}&quot;)
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> cv2</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> load_model</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">cap </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.VideoCapture(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">while</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    ret, frame </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cap.read()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    h, w, _ </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> frame.shape[:</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">] </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    w_center </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> w</span><span style="color: #F92672">//</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2"> </span></span>
<span class="line"><span style="color: #F8F8F2">    h_center </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> h</span><span style="color: #F92672">//</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2"> </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    cv2.rectangle(frame, (w_center</span><span style="color: #F92672">-</span><span style="color: #AE81FF">71</span><span style="color: #F8F8F2">, h_center</span><span style="color: #F92672">-</span><span style="color: #AE81FF">71</span><span style="color: #F8F8F2">),  </span></span>
<span class="line"><span style="color: #F8F8F2">                 (w_center</span><span style="color: #F92672">+</span><span style="color: #AE81FF">71</span><span style="color: #F8F8F2">, h_center</span><span style="color: #F92672">+</span><span style="color: #AE81FF">71</span><span style="color: #F8F8F2">),(</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">)) </span></span>
<span class="line"><span style="color: #F8F8F2">    cv2.imshow(</span><span style="color: #E6DB74">&quot;frame&quot;</span><span style="color: #F8F8F2">,frame) </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    k </span><span style="color: #F92672">=</span><span style="color: #F8F8F2">  cv2.waitKey(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">&amp;</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">0x</span><span style="color: #AE81FF">FF</span></span>
<span class="line"><span style="color: #F8F8F2">    prop_val </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.getWindowProperty(</span><span style="color: #E6DB74">&quot;frame&quot;</span><span style="color: #F8F8F2">, cv2.</span><span style="color: #AE81FF">WND_PROP_ASPECT_RATIO</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> k </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">ord</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;q&quot;</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">or</span><span style="color: #F8F8F2"> (prop_val </span><span style="color: #F92672">&lt;</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">break</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">elif</span><span style="color: #F8F8F2"> k </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">ord</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;s&quot;</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        im </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> frame[h_center</span><span style="color: #F92672">-</span><span style="color: #AE81FF">70</span><span style="color: #F8F8F2">:h_center</span><span style="color: #F92672">+</span><span style="color: #AE81FF">70</span><span style="color: #F8F8F2">, w_center</span><span style="color: #F92672">-</span><span style="color: #AE81FF">70</span><span style="color: #F8F8F2">:w_center</span><span style="color: #F92672">+</span><span style="color: #AE81FF">70</span><span style="color: #F8F8F2">] </span></span>
<span class="line"><span style="color: #F8F8F2">        im </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.cvtColor(im, cv2.</span><span style="color: #AE81FF">COLOR_BGR2GRAY</span><span style="color: #F8F8F2">) </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        _, th </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.threshold(im, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">, cv2.</span><span style="color: #AE81FF">THRESH_OTSU</span><span style="color: #F8F8F2">) </span></span>
<span class="line"><span style="color: #F8F8F2">        th </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.bitwise_not(th)</span></span>
<span class="line"><span style="color: #F8F8F2">        th </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.GaussianBlur(th,(</span><span style="color: #AE81FF">9</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">9</span><span style="color: #F8F8F2">), </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">) </span></span>
<span class="line"><span style="color: #F8F8F2">        cv2.imwrite(</span><span style="color: #E6DB74">&quot;capture.jpg&quot;</span><span style="color: #F8F8F2">, th)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">break</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">cap.release()</span></span>
<span class="line"><span style="color: #F8F8F2">cv2.destroyAllWindows()</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#-----------------------------------------</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">Xt </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.imread(</span><span style="color: #E6DB74">&quot;capture.jpg&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.resize(img,(</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">), cv2.</span><span style="color: #AE81FF">INTER_CUBIC</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">Xt.append(img)</span></span>
<span class="line"><span style="color: #F8F8F2">Xt </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.array(Xt)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> load_model(</span><span style="color: #E6DB74">&quot;ai-third.h5&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">result </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.predict(Xt)</span><span style="color: #88846F">#モデルの予測を抽出</span></span>
<span class="line"><span style="color: #F8F8F2">top3_probs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.sort(result, </span><span style="color: #FD971F; font-style: italic">axis</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)[:, ::</span><span style="color: #F92672">-</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">][:, :</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">top3_classes </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.argsort(result, </span><span style="color: #FD971F; font-style: italic">axis</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)[:, ::</span><span style="color: #F92672">-</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">][:, :</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># 結果を出力</span></span>
<span class="line"><span style="color: #F92672">for</span><span style="color: #F8F8F2"> i </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(top3_probs)):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;サンプル </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">i</span><span style="color: #F92672">+</span><span style="color: #AE81FF">1}</span><span style="color: #E6DB74"> の上位3つのクラスと確率:&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> j </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;クラス </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">top3_classes[i][j]</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">: 確率 </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">top3_probs[i][j]</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc4">カメラ入力の設定</span></h3>



<p>前提として、今回はMNISTデータで学習したモデルを使います。そのため、学習モデルを適応するには<strong>入力をMNISTと同じ形式にする必要</strong>があります。ということで、MNISTの形式に直しつつ、カメラの入力設定をやっていきたいと思います。</p>



<p>カメラの映像を映し出す</p>



<ul class="wp-block-list">
<li>映し出した映像に正方形の領域を描画する</li>



<li>描画した領域内に手書きの数字を映す</li>



<li>撮影する</li>



<li>撮影した画像の正方形部分(数字が映ってる部分)だけを切り取る</li>



<li>切り取った画像を白黒にする</li>



<li>白黒にした画像の白と黒を反転させる(黒背景に白文字にする)</li>



<li>28×28サイズに圧縮する</li>
</ul>



<h5 class="wp-block-heading"><span id="toc5">カメラを起動させる</span></h5>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="import cv2

cap = cv2.VideoCapture(0) 

while(True):
    ret, frame = cap.read()

    cv2.imshow(&quot;frame&quot;,frame)

    k =  cv2.waitKey(100) &amp; 0xFF

    if k == ord(&quot;q&quot;): #qを押したら終了
        break

cap.release()
cv2.destroyAllWindows()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> cv2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">cap </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.VideoCapture(</span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">) </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">while</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">True</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    ret, frame </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cap.read()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    cv2.imshow(</span><span style="color: #E6DB74">&quot;frame&quot;</span><span style="color: #F8F8F2">,frame)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    k </span><span style="color: #F92672">=</span><span style="color: #F8F8F2">  cv2.waitKey(</span><span style="color: #AE81FF">100</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">&amp;</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">0x</span><span style="color: #AE81FF">FF</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> k </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">ord</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;q&quot;</span><span style="color: #F8F8F2">): </span><span style="color: #88846F">#qを押したら終了</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">break</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">cap.release()</span></span>
<span class="line"><span style="color: #F8F8F2">cv2.destroyAllWindows()</span></span></code></pre></div>



<p>このコードは、OpenCVを使用してウェブカメラからビデオをキャプチャし、フレームをリアルタイムで表示するプログラムです。以下に、コードの各部分の解説をします。<br><span class="bold-green"><code>import cv2</code><br></span>＃OpenCVライブラリを<code>cv2</code>という名前でインポートします。<br><br><span class="bold-green"><code>cap = cv2.VideoCapture(0)</code></span><br>＃<code>VideoCapture</code>クラスを使用して、ウェブカメラからのビデオキャプチャを開始します。引数の0は、デフォルトのカメラデバイスを指定しています。複数のカメラが接続されている場合は、0以外の番号を指定して切り替えることができます。<br><br><span class="bold-green"><code>while(True):</code></span><br>＃無限ループを開始します。<br><br><span class="bold-green"><code>ret, frame = cap.read()</code></span><br>＃<code>cap.read()</code>メソッドを使用して、カメラから1フレームをキャプチャします。<code>ret</code>は、フレームの取得が成功したかどうかを示すブール値です。<code>frame</code>は、キャプチャされたフレームの画像データです。<br><br><span class="bold-green"><code>cv2.imshow("frame", frame)</code></span><br>＃<code>imshow()</code>関数を使用して、キャプチャされたフレームをウィンドウに表示します。第1引数はウィンドウの名前を指定し、第2引数には表示する画像データを指定します。<br><br><span class="bold-green"><code>k = cv2.waitKey(100) &amp; 0xFF</code></span><br>＃<code>waitKey()</code>関数を使用して、ユーザーからのキーボード入力を待ちます。引数は、入力を待つ時間（ミリ秒）です。ここでは100ミリ秒です。<code>&amp; 0xFF</code>は、64ビットマシンでの処理のために追加されたビットマスクです。<br><br><code><span class="bold-green">if k == ord("q"):</span></code><br>＃ユーザーがキーボードの<span class="marker-under">qを押すと、無限ループを抜けてプログラムを終了</span>します。ｑキーを押さないと閉じれないので、しっかりと<span class="bold">ｑキーを押しましょう</span>！<br><br><span class="bold-green"><code>cap.release()</code><br></span>＃カメラリソースを解放します。<br><br><span class="bold-green"><code>cv2.destroyAllWindows()</code><br></span>＃すべてのOpenCVウィンドウを閉じます。</p>



<table border="0" cellpadding="0" cellspacing="0"><tr><td><div style="border:1px solid #95a5a6;border-radius:.75rem;background-color:#FFFFFF;width:280px;margin:0px;padding:5px;text-align:center;overflow:hidden;"><table><tr><td style="width:128px"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16263180%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;"><img decoding="async" src="https://hbb.afl.rakuten.co.jp/hgb/39414777.169c3d99.39414778.be6498e6/?me_id=1213310&#038;item_id=19964056&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F5468%2F9784274225468.jpg%3F_ex%3D128x128&#038;s=128x128&#038;t=picttext" border="0" style="margin:2px" alt="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]" title="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]"></a></td><td style="vertical-align:top;width:136px;display: block;"><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px;word-wrap:break-word"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16263180%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">Pythonによる医用画像処理入門 （医療AIとディープラーニングシリーズ） [ 藤田 広志 ]</a><br><span >価格：3,740円（税込、送料無料)</span> <span style="color:#BBB">(2024/3/4時点)</span></p></td></tr></table></div><br><p style="color:#000000;font-size:12px;line-height:1.4em;margin:5px;word-wrap:break-word"></p></td></tr></table>



<h5 class="wp-block-heading"><span id="toc6">キャプチャ機能を追加</span></h5>



<p>sキーを押すと現在のフレームが保存されてプログラムが終了するようにしましょう。<br><br>p.s.コメント(#)は既に書いたコードを表します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="# import cv2

# cap = cv2.VideoCapture(0) 
# while(True):
#     ret, frame = cap.read()
#     cv2.imshow(&quot;frame&quot;,frame)
#     k =  cv2.waitKey(100) &amp; 0xFF 

#    if k == ord(&quot;q&quot;):
#      break
    elif k == ord(&quot;s&quot;): 
        cv2.imwrite(&quot;./frame.jpg&quot;, frame) 
        break 

# cap.release()
# cv2.destroyAllWindows()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F"># import cv2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># cap = cv2.VideoCapture(0) </span></span>
<span class="line"><span style="color: #88846F"># while(True):</span></span>
<span class="line"><span style="color: #88846F">#     ret, frame = cap.read()</span></span>
<span class="line"><span style="color: #88846F">#     cv2.imshow(&quot;frame&quot;,frame)</span></span>
<span class="line"><span style="color: #88846F">#     k =  cv2.waitKey(100) &amp; 0xFF </span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#    if k == ord(&quot;q&quot;):</span></span>
<span class="line"><span style="color: #88846F">#      break</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">elif</span><span style="color: #F8F8F2"> k </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">ord</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;s&quot;</span><span style="color: #F8F8F2">): </span></span>
<span class="line"><span style="color: #F8F8F2">        cv2.imwrite(</span><span style="color: #E6DB74">&quot;./frame.jpg&quot;</span><span style="color: #F8F8F2">, frame) </span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">break</span><span style="color: #F8F8F2"> </span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># cap.release()</span></span>
<span class="line"><span style="color: #88846F"># cv2.destroyAllWindows()</span></span></code></pre></div>



<p><span class="bold-green"><code>elif k == ord("s"): </code><br>　<code>cv2.imwrite("./frame.jpg", frame) </code><br>　<code>break</code></span><br>＃もしsキーが押されたら、フレームを保存し、ループを抜けてプログラムを終了します。保存するファイル名は&#8221;frame.jpg&#8221;です。</p>



<h5 class="wp-block-heading"><span id="toc7">無限ループ対策を追加</span></h5>



<p>プログラム内で無限ループを使用するときは、しっかりとした終了操作も追加しておく必要があります。これをしないと、コンピュータに過度な負荷がかかってしまいます。<br><br>カメラからの映像をリアルタイムで表示し、qを押すかウィンドウのアスペクト比が変更された場合に終了できるようにします。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="# import cv2

# cap = cv2.VideoCapture(1) 

# while(True):
#     ret, frame = cap.read()
#     cv2.imshow(&quot;frame&quot;,frame)
#     k =  cv2.waitKey(100) &amp; 0xFF
    　prop_val = cv2.getWindowProperty(&quot;frame&quot;, cv2.WND_PROP_ASPECT_RATIO)

     　if k == ord(&quot;q&quot;) or (prop_val &lt; 0):
#         break
#     elif k == ord(&quot;s&quot;): 
#         cv2.imwrite(&quot;frame.jpg&quot;, frame)
#         break
# cap.release()
# cv2.destroyAllWindows()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F"># import cv2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># cap = cv2.VideoCapture(1) </span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># while(True):</span></span>
<span class="line"><span style="color: #88846F">#     ret, frame = cap.read()</span></span>
<span class="line"><span style="color: #88846F">#     cv2.imshow(&quot;frame&quot;,frame)</span></span>
<span class="line"><span style="color: #88846F">#     k =  cv2.waitKey(100) &amp; 0xFF</span></span>
<span class="line"><span style="color: #F8F8F2">    　prop_val </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.getWindowProperty(</span><span style="color: #E6DB74">&quot;frame&quot;</span><span style="color: #F8F8F2">, cv2.</span><span style="color: #AE81FF">WND_PROP_ASPECT_RATIO</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">     　</span><span style="color: #F92672">if</span><span style="color: #F8F8F2"> k </span><span style="color: #F92672">==</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">ord</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;q&quot;</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">or</span><span style="color: #F8F8F2"> (prop_val </span><span style="color: #F92672">&lt;</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #88846F">#         break</span></span>
<span class="line"><span style="color: #88846F">#     elif k == ord(&quot;s&quot;): </span></span>
<span class="line"><span style="color: #88846F">#         cv2.imwrite(&quot;frame.jpg&quot;, frame)</span></span>
<span class="line"><span style="color: #88846F">#         break</span></span>
<span class="line"><span style="color: #88846F"># cap.release()</span></span>
<span class="line"><span style="color: #88846F"># cv2.destroyAllWindows()</span></span></code></pre></div>



<p><span class="bold-green"><code>prop_val = cv2.getWindowProperty("frame", cv2.WND_PROP_ASPECT_RATIO)</code><br></span>＃ウィンドウの<span class="bold-red">アスペクト比</span>を取得します。ウィンドウを閉じると-1が返される。<br><br><code><span class="bold-green">if k == ord("q") or (prop_val &lt; 0):</span></code><br>#もしqが押されたか、ウィンドウのアスペクト比が負の値になった場合に、無限ループを抜けてプログラムを終了します。</p>



<h5 class="wp-block-heading"><span id="toc8">対象領域をカメラ内に表示</span></h5>



<p>フレームの中心に青い矩形を描画して、数字を読み込むための対象領域を明確化しましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="# import cv2

# cap = cv2.VideoCapture(0) 


# while(True):
#   ret, frame = cap.read()
    h, w, _ = frame.shape[:3]
    w_center = w//2
    h_center = h//2
    cv2.rectangle(frame, (w_center-71, h_center-71), (w_center+71, h_center+71),(255, 0, 0))
    cv2.imshow(&quot;frame&quot;,frame)

#     k =  cv2.waitKey(100) &amp; 0xFF 
#     prop_val = cv2.getWindowProperty(&quot;frame&quot;, cv2.WND_PROP_ASPECT_RATIO)

#     if k == ord(&quot;q&quot;) or (prop_val &lt; 0):
#         break
#     elif k == ord(&quot;s&quot;): 
#         cv2.imwrite(&quot;frame.jpg&quot;, frame)
#         break

# cap.release()
# cv2.destroyAllWindows()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F"># import cv2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># cap = cv2.VideoCapture(0) </span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># while(True):</span></span>
<span class="line"><span style="color: #88846F">#   ret, frame = cap.read()</span></span>
<span class="line"><span style="color: #F8F8F2">    h, w, _ </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> frame.shape[:</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">    w_center </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> w</span><span style="color: #F92672">//</span><span style="color: #AE81FF">2</span></span>
<span class="line"><span style="color: #F8F8F2">    h_center </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> h</span><span style="color: #F92672">//</span><span style="color: #AE81FF">2</span></span>
<span class="line"><span style="color: #F8F8F2">    cv2.rectangle(frame, (w_center</span><span style="color: #F92672">-</span><span style="color: #AE81FF">71</span><span style="color: #F8F8F2">, h_center</span><span style="color: #F92672">-</span><span style="color: #AE81FF">71</span><span style="color: #F8F8F2">), (w_center</span><span style="color: #F92672">+</span><span style="color: #AE81FF">71</span><span style="color: #F8F8F2">, h_center</span><span style="color: #F92672">+</span><span style="color: #AE81FF">71</span><span style="color: #F8F8F2">),(</span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">    cv2.imshow(</span><span style="color: #E6DB74">&quot;frame&quot;</span><span style="color: #F8F8F2">,frame)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#     k =  cv2.waitKey(100) &amp; 0xFF </span></span>
<span class="line"><span style="color: #88846F">#     prop_val = cv2.getWindowProperty(&quot;frame&quot;, cv2.WND_PROP_ASPECT_RATIO)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#     if k == ord(&quot;q&quot;) or (prop_val &lt; 0):</span></span>
<span class="line"><span style="color: #88846F">#         break</span></span>
<span class="line"><span style="color: #88846F">#     elif k == ord(&quot;s&quot;): </span></span>
<span class="line"><span style="color: #88846F">#         cv2.imwrite(&quot;frame.jpg&quot;, frame)</span></span>
<span class="line"><span style="color: #88846F">#         break</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># cap.release()</span></span>
<span class="line"><span style="color: #88846F"># cv2.destroyAllWindows()</span></span></code></pre></div>



<p><span class="bold-green"><code>h, w, _ = frame.shape[:3]</code><br></span>＃フレームの高さと幅を取得します。OpenCVの<code>shape</code>メソッドは、画像の高さ、幅、チャンネル数などの情報を返します。ここでは、高さと幅のみを取得しています。<br><br><code><span class="green"><span class="bold-green">w_center = w//2</span></span></code><br>＃フレームの中心の横座標を計算します。<br><br><span class="bold-green"><code>h_center = h//2</code><br></span>＃フレームの中心の縦座標を計算します。<br><br><span class="bold-green"><code>cv2.rectangle(frame, (w_center-71, h_center-71), (w_center+71, h_center+71), (255, 0, 0))</code><br></span>＃<code><strong>cv2.rectangle()</strong></code>関数を使用して、フレームに矩形を描画します。矩形の左上の座標と右下の座標を指定し、色を指定します。ここでは青色((255, 0, 0))の矩形を描画しています。順番は（青,緑,赤）を表します。<br><br><span class="bold-green"><code>cv2.imshow("frame", frame)</code><br></span>＃キャプチャされたフレームをウィンドウに表示します。</p>



<h5 class="wp-block-heading"><span id="toc9">画像データの前処理</span></h5>



<p>では、画像データの前処理をしていきましょう。</p>



<p>ここではキャプチャされたフレームに描画された短形を<strong>切り取って</strong>、<strong>白黒反転</strong>させた後、<strong>二値化</strong>と<strong>ガウシアンブラー</strong>を適用していきます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="# import cv2

# cap = cv2.VideoCapture(0) 


# while(True):
#     ret, frame = cap.read()

#     h, w, _ = frame.shape[:3]
#     w_center = w//2
#     h_center = h//2
#     cv2.rectangle(frame, (w_center-71, h_center-71), (w_center+71, h_center+71),(255, 0, 0))


#     cv2.imshow(&quot;frame&quot;,frame)

#     k =  cv2.waitKey(100) &amp; 0xFF
#     prop_val = cv2.getWindowProperty(&quot;frame&quot;, cv2.WND_PROP_ASPECT_RATIO)

#     if k == ord(&quot;q&quot;) or (prop_val &lt; 0):
#         break
#     elif k == ord(&quot;s&quot;): 
        im = frame[h_center-70:h_center+70, w_center-70:w_center+70]
        im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) 
        _, th = cv2.threshold(im, 0, 255, cv2.THRESH_OTSU)
        th = cv2.bitwise_not(th)
        th = cv2.GaussianBlur(th,(9,9), 0)
        cv2.imwrite(&quot;capture.jpg&quot;, th)
#         break

# cap.release()
# cv2.destroyAllWindows()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F"># import cv2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># cap = cv2.VideoCapture(0) </span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># while(True):</span></span>
<span class="line"><span style="color: #88846F">#     ret, frame = cap.read()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#     h, w, _ = frame.shape[:3]</span></span>
<span class="line"><span style="color: #88846F">#     w_center = w//2</span></span>
<span class="line"><span style="color: #88846F">#     h_center = h//2</span></span>
<span class="line"><span style="color: #88846F">#     cv2.rectangle(frame, (w_center-71, h_center-71), (w_center+71, h_center+71),(255, 0, 0))</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#     cv2.imshow(&quot;frame&quot;,frame)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#     k =  cv2.waitKey(100) &amp; 0xFF</span></span>
<span class="line"><span style="color: #88846F">#     prop_val = cv2.getWindowProperty(&quot;frame&quot;, cv2.WND_PROP_ASPECT_RATIO)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#     if k == ord(&quot;q&quot;) or (prop_val &lt; 0):</span></span>
<span class="line"><span style="color: #88846F">#         break</span></span>
<span class="line"><span style="color: #88846F">#     elif k == ord(&quot;s&quot;): </span></span>
<span class="line"><span style="color: #F8F8F2">        im </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> frame[h_center</span><span style="color: #F92672">-</span><span style="color: #AE81FF">70</span><span style="color: #F8F8F2">:h_center</span><span style="color: #F92672">+</span><span style="color: #AE81FF">70</span><span style="color: #F8F8F2">, w_center</span><span style="color: #F92672">-</span><span style="color: #AE81FF">70</span><span style="color: #F8F8F2">:w_center</span><span style="color: #F92672">+</span><span style="color: #AE81FF">70</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">        im </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.cvtColor(im, cv2.</span><span style="color: #AE81FF">COLOR_BGR2GRAY</span><span style="color: #F8F8F2">) </span></span>
<span class="line"><span style="color: #F8F8F2">        _, th </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.threshold(im, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">255</span><span style="color: #F8F8F2">, cv2.</span><span style="color: #AE81FF">THRESH_OTSU</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        th </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.bitwise_not(th)</span></span>
<span class="line"><span style="color: #F8F8F2">        th </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.GaussianBlur(th,(</span><span style="color: #AE81FF">9</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">9</span><span style="color: #F8F8F2">), </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        cv2.imwrite(</span><span style="color: #E6DB74">&quot;capture.jpg&quot;</span><span style="color: #F8F8F2">, th)</span></span>
<span class="line"><span style="color: #88846F">#         break</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># cap.release()</span></span>
<span class="line"><span style="color: #88846F"># cv2.destroyAllWindows()</span></span></code></pre></div>



<p><code><span class="bold-green">im = frame[h_center-70:h_center+70, w_center-70:w_center+70]</span></code><br>＃<code>frame</code>から、縦方向には中央から±70ピクセル、横方向には中央から±70ピクセルの領域を<strong>切り取り</strong>ます。<code>h_center</code>と<code>w_center</code>は、フレームの高さと幅の中心座標です。<br><br><span class="bold-green"><code>im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)</code><br></span>＃切り取られた領域をカラーからグレースケールに変換します。グレースケールに変換することで、画像の明るさ情報のみを残します。<br><br><span class="bold-green"><code>_, th = cv2.threshold(im, 0, 255, cv2.THRESH_OTSU)</code></span><br>＃<span class="bold-red">大津の二値化法</span>を使用して、画像を<strong>二値化</strong>します。大津の二値化法は、画像の輝度ヒストグラムから自動的に適切な閾値を計算し、画像を黒と白の二値画像に変換します。この関数の返り値は、使用された閾値と二値化された画像ですが、このコードでは<code>_</code>に代入しているため、閾値は使用されません。<br><br><code><span class="bold-green">th = cv2.bitwise_not(th)</span></code><br>＃二値化された画像を反転させます。つまり、黒い部分と白い部分が入れ替わります。<br><br><span class="bold-green"><code>th = cv2.GaussianBlur(th, (9,9), 0)</code></span><br>#二値化された画像にガウシアンフィルタを適用します。ガウシアンフィルタは、画像のノイズを軽減するために使用され、画像の平滑化を行います。<code>(9,9)</code>はカーネルサイズを示し、それぞれの次元におけるフィルタの幅と高さを指定します。<code>0</code>はX軸方向の標準偏差を示しています。0の場合、カーネルサイズから自動的に計算されます。<br><br><span class="bold-green">cv2.imwrite(&#8220;capture.jpg&#8221;, th)</span><br>#もろもろの処理を施した、thをcapture.jpgとして保存します。</p>



<h5 class="wp-block-heading"><span id="toc10">入力サイズの変形</span></h5>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="# import cv2
import numpy as np

# cap = cv2.VideoCapture(0) 
# while(True):
#     ret, frame = cap.read()

#     h, w, _ = frame.shape[:3]
#     w_center = w//2
#     h_center = h//2
#     cv2.rectangle(frame, (w_center-71, h_center-71), (w_center+71, h_center+71),(255, 0, 0))

#     cv2.imshow(&quot;frame&quot;,frame)

#     k =  cv2.waitKey(100) &amp; 0xFF
#     prop_val = cv2.getWindowProperty(&quot;frame&quot;, cv2.WND_PROP_ASPECT_RATIO)

#     if k == ord(&quot;q&quot;) or (prop_val &lt; 0):
#         break
#     elif k == ord(&quot;s&quot;): 
#         im = frame[h_center-70:h_center+70, w_center-70:w_center+70]
#         im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)

#         _, th = cv2.threshold(im, 0, 255, cv2.THRESH_OTSU)
#         th = cv2.bitwise_not(th) 
#         th = cv2.GaussianBlur(th,(9,9), 0) 
#         cv2.imwrite(&quot;./capture.jpg&quot;, th)
#         break

# cap.release()
# cv2.destroyAllWindows()

Xt = []
img = cv2.imread(&quot;capture.jpg&quot;, 0)
img = cv2.resize(img,(28, 28), cv2.INTER_CUBIC)

Xt.append(img)
Xt = np.array(Xt)/255" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F"># import cv2</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># cap = cv2.VideoCapture(0) </span></span>
<span class="line"><span style="color: #88846F"># while(True):</span></span>
<span class="line"><span style="color: #88846F">#     ret, frame = cap.read()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#     h, w, _ = frame.shape[:3]</span></span>
<span class="line"><span style="color: #88846F">#     w_center = w//2</span></span>
<span class="line"><span style="color: #88846F">#     h_center = h//2</span></span>
<span class="line"><span style="color: #88846F">#     cv2.rectangle(frame, (w_center-71, h_center-71), (w_center+71, h_center+71),(255, 0, 0))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#     cv2.imshow(&quot;frame&quot;,frame)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#     k =  cv2.waitKey(100) &amp; 0xFF</span></span>
<span class="line"><span style="color: #88846F">#     prop_val = cv2.getWindowProperty(&quot;frame&quot;, cv2.WND_PROP_ASPECT_RATIO)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#     if k == ord(&quot;q&quot;) or (prop_val &lt; 0):</span></span>
<span class="line"><span style="color: #88846F">#         break</span></span>
<span class="line"><span style="color: #88846F">#     elif k == ord(&quot;s&quot;): </span></span>
<span class="line"><span style="color: #88846F">#         im = frame[h_center-70:h_center+70, w_center-70:w_center+70]</span></span>
<span class="line"><span style="color: #88846F">#         im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#         _, th = cv2.threshold(im, 0, 255, cv2.THRESH_OTSU)</span></span>
<span class="line"><span style="color: #88846F">#         th = cv2.bitwise_not(th) </span></span>
<span class="line"><span style="color: #88846F">#         th = cv2.GaussianBlur(th,(9,9), 0) </span></span>
<span class="line"><span style="color: #88846F">#         cv2.imwrite(&quot;./capture.jpg&quot;, th)</span></span>
<span class="line"><span style="color: #88846F">#         break</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># cap.release()</span></span>
<span class="line"><span style="color: #88846F"># cv2.destroyAllWindows()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">Xt </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #F8F8F2">img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.imread(</span><span style="color: #E6DB74">&quot;capture.jpg&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">0</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.resize(img,(</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">), cv2.</span><span style="color: #AE81FF">INTER_CUBIC</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">Xt.append(img)</span></span>
<span class="line"><span style="color: #F8F8F2">Xt </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.array(Xt)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span></code></pre></div>



<p><span class="bold-green">import numpy as np</span><br>＃NumPyライブラリを<code>np</code>としてインポートします。NumPyはPythonで数値計算を行うための基本的なライブラリです。<br><br><span class="bold-green"><code>Xt = []</code><br></span>: 画像データを格納するための空のリスト<code>Xt</code>を作成します。<br><br><span class="bold-green"><code>img = cv2.imread("capture.jpg", 0)</code><br></span>＃&#8221;capture.jpg&#8221;というファイルをグレースケールで読み込みます。<code>cv2.imread()</code>関数は、指定したファイルから画像を読み込みます。2番目の引数で0を指定することで、グレースケールとして読み込みます。<br><br><span class="bold-green"><code>img = cv2.resize(img, (28, 28), cv2.INTER_CUBIC)</code><br></span>＃読み込んだ画像を28&#215;28ピクセル（MNISTのサイズ）にリサイズします。<code>cv2.resize()</code>関数は、画像を指定したサイズにリサイズします。<code><strong>cv2.INTER_CUBIC</strong></code>は、リサイズ時の補間方法を指定します。<br><br><code><span class="bold-green">Xt.append(img)</span></code><br>＃リサイズされた画像をリスト<code>Xt</code>に追加します。<br><br><span class="bold-green"><code>Xt = np.array(Xt) / 255</code></span><br>＃リスト<code>Xt</code>をNumPy配列に変換し、それぞれの要素を0から1の範囲に正規化します。画像のピクセル値は通常、0から255の範囲になりますが、ニューラルネットワークに入力する際には0から1の範囲に正規化することが一般的です。</p>



<table border="0" cellpadding="0" cellspacing="0"><tr><td><div style="border:1px solid #95a5a6;border-radius:.75rem;background-color:#FFFFFF;width:280px;margin:0px;padding:5px;text-align:center;overflow:hidden;"><table><tr><td style="width:128px"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15816191%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;"><img decoding="async" src="https://hbb.afl.rakuten.co.jp/hgb/39414777.169c3d99.39414778.be6498e6/?me_id=1213310&#038;item_id=19512959&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F8727%2F9784873118727.jpg%3F_ex%3D128x128&#038;s=128x128&#038;t=picttext" border="0" style="margin:2px" alt="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]" title="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]"></a></td><td style="vertical-align:top;width:136px;display: block;"><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px;word-wrap:break-word"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15816191%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">PythonによるAIプログラミング入門 ディープラーニングを始める前に身につけておくべき15の基礎技術 [ Prateek Joshi ]</a><br><span >価格：3,740円（税込、送料無料)</span> <span style="color:#BBB">(2024/3/4時点)</span></p></td></tr></table></div><br><p style="color:#000000;font-size:12px;line-height:1.4em;margin:5px;word-wrap:break-word"></p></td></tr></table>



<h3 class="wp-block-heading"><span id="toc11">モデルをロード</span></h3>



<p>前回作って保存したモデルのニューラルネットワークモデルロードして、使用して画像データの<strong>予測</strong>を行い、<strong>上位3つのクラスとその確率を出力</strong>します。</p>



<p>p.s.前回のモデルがない場合は、ここを一旦飛ばして次の「前回のモデルがない場合」のコードを実行してください。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="
# import cv2
# import numpy as np
from keras.models import load_model

# cap = cv2.VideoCapture(0)

# while(True):
#     ret, frame = cap.read()

#     h, w, _ = frame.shape[:3] 

#     w_center = w//2 
#     h_center = h//2 

#     cv2.rectangle(frame, (w_center-71, h_center-71),  
#                  (w_center+71, h_center+71),(255, 0, 0)) 
#     cv2.imshow(&quot;frame&quot;,frame) 

#     k =  cv2.waitKey(1) &amp; 0xFF
#     prop_val = cv2.getWindowProperty(&quot;frame&quot;, cv2.WND_PROP_ASPECT_RATIO)

#     if k == ord(&quot;q&quot;) or (prop_val &lt; 0):
#         break
#     elif k == ord(&quot;s&quot;):
#         im = frame[h_center-70:h_center+70, w_center-70:w_center+70] 
#         im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) 

#         _, th = cv2.threshold(im, 0, 255, cv2.THRESH_OTSU) 
#         th = cv2.bitwise_not(th)
#         th = cv2.GaussianBlur(th,(9,9), 0) 
#         cv2.imwrite(&quot;capture.jpg&quot;, th)
#         break

# cap.release()
# cv2.destroyAllWindows()

# Xt = []
# img = cv2.imread(&quot;capture.jpg&quot;, 0)
# img = cv2.resize(img,(28, 28), cv2.INTER_CUBIC)

# Xt.append(img)
# Xt = np.array(Xt)/255

model = load_model(&quot;ai-third.h5&quot;)

result = model.predict(Xt)#モデルの予測を抽出

#ここ↓はお好みでどうぞ。面倒くさかったらprint(result[0])だけでも出力できます。
top3_probs = np.sort(result, axis=1)[:, ::-1][:, :3]
top3_classes = np.argsort(result, axis=1)[:, ::-1][:, :3]
for i in range(len(top3_probs)):
    print(f&quot;サンプル {i+1} の上位3つのクラスと確率:&quot;)
    for j in range(3):
        print(f&quot;位 {top3_classes[i][j]}: 確率 {top3_probs[i][j]}&quot;)
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color: #88846F"># import cv2</span></span>
<span class="line"><span style="color: #88846F"># import numpy as np</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> load_model</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># cap = cv2.VideoCapture(0)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># while(True):</span></span>
<span class="line"><span style="color: #88846F">#     ret, frame = cap.read()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#     h, w, _ = frame.shape[:3] </span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#     w_center = w//2 </span></span>
<span class="line"><span style="color: #88846F">#     h_center = h//2 </span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#     cv2.rectangle(frame, (w_center-71, h_center-71),  </span></span>
<span class="line"><span style="color: #88846F">#                  (w_center+71, h_center+71),(255, 0, 0)) </span></span>
<span class="line"><span style="color: #88846F">#     cv2.imshow(&quot;frame&quot;,frame) </span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#     k =  cv2.waitKey(1) &amp; 0xFF</span></span>
<span class="line"><span style="color: #88846F">#     prop_val = cv2.getWindowProperty(&quot;frame&quot;, cv2.WND_PROP_ASPECT_RATIO)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#     if k == ord(&quot;q&quot;) or (prop_val &lt; 0):</span></span>
<span class="line"><span style="color: #88846F">#         break</span></span>
<span class="line"><span style="color: #88846F">#     elif k == ord(&quot;s&quot;):</span></span>
<span class="line"><span style="color: #88846F">#         im = frame[h_center-70:h_center+70, w_center-70:w_center+70] </span></span>
<span class="line"><span style="color: #88846F">#         im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) </span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#         _, th = cv2.threshold(im, 0, 255, cv2.THRESH_OTSU) </span></span>
<span class="line"><span style="color: #88846F">#         th = cv2.bitwise_not(th)</span></span>
<span class="line"><span style="color: #88846F">#         th = cv2.GaussianBlur(th,(9,9), 0) </span></span>
<span class="line"><span style="color: #88846F">#         cv2.imwrite(&quot;capture.jpg&quot;, th)</span></span>
<span class="line"><span style="color: #88846F">#         break</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># cap.release()</span></span>
<span class="line"><span style="color: #88846F"># cv2.destroyAllWindows()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># Xt = []</span></span>
<span class="line"><span style="color: #88846F"># img = cv2.imread(&quot;capture.jpg&quot;, 0)</span></span>
<span class="line"><span style="color: #88846F"># img = cv2.resize(img,(28, 28), cv2.INTER_CUBIC)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># Xt.append(img)</span></span>
<span class="line"><span style="color: #88846F"># Xt = np.array(Xt)/255</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> load_model(</span><span style="color: #E6DB74">&quot;ai-third.h5&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">result </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.predict(Xt)</span><span style="color: #88846F">#モデルの予測を抽出</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#ここ↓はお好みでどうぞ。面倒くさかったらprint(result[0])だけでも出力できます。</span></span>
<span class="line"><span style="color: #F8F8F2">top3_probs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.sort(result, </span><span style="color: #FD971F; font-style: italic">axis</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)[:, ::</span><span style="color: #F92672">-</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">][:, :</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">top3_classes </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.argsort(result, </span><span style="color: #FD971F; font-style: italic">axis</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)[:, ::</span><span style="color: #F92672">-</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">][:, :</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F92672">for</span><span style="color: #F8F8F2"> i </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF">len</span><span style="color: #F8F8F2">(top3_probs)):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;サンプル </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">i</span><span style="color: #F92672">+</span><span style="color: #AE81FF">1}</span><span style="color: #E6DB74"> の上位3つのクラスと確率:&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> j </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">range</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;位 </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">top3_classes[i][j]</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">: 確率 </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">top3_probs[i][j]</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span></code></pre></div>



<p><span class="bold-green"><code>model = load_model("ai-third.h5")</code><br></span><code>＃<strong>load_model()</strong></code>関数を使用して、指定されたファイル（&#8221;ai-third.h5&#8243;）から事前にトレーニングされたモデルをロードします。このファイルは、Kerasで保存されたモデルの重みやアーキテクチャなどの情報を含んでいます。<br><br><span class="bold-green"><code>result = model.predict(Xt)</code></span><br>＃<code><strong>model.predict()</strong></code>メソッドを使用して、ロードしたモデルを使って<strong>入力データ <code>Xt</code></strong> の予測を行います。このメソッドは、<span class="marker-under">入力データをモデルに渡し</span>、各クラスに属する確率の配列を返します。<br><br><code><span class="bold-green">top3_probs = np.sort(result, axis=1)[:, ::-1][:, :3]</span></code><br>＃<code><strong>np.sort()</strong></code>関数を使用して、各サンプルのクラスに属する確率をソートします。<br>＃<code><strong>axis=1</strong></code>は行方向（各サンプル）に対してソートを行うことを意味し、<br>＃<code><strong>:,-1</strong></code>は降順でソートすることを示します。<br>＃<code><strong>:,:3</strong></code>で各サンプルの上位3つの確率を取得します。<br><br><code><span class="bold-green">top3_classes = np.argsort(result, axis=1)[:, ::-1][:, :3]</span></code><br>＃<code><strong>np.argsort()</strong></code>関数を使用して、各サンプルのクラスに属する確率のインデックスをソートします。<br>＃<code><strong>axis=1</strong></code>は行方向（各サンプル）に対してソートを行うことを意味します。<br>＃<code><strong>:,-1</strong></code>は降順でソートすることを示します。<br>＃<code><strong>:,:3</strong></code>で各サンプルの上位3つのクラスのインデックスを取得します。<br><br><code>for</code>ループを使用して、各サンプルの上位3つのクラスと確率を出力します。各サンプルに対して、上位から3つのクラスとそれに対応する確率が出力されます。</p>



<p>p.s.正解率が良くなかったら、前回のモデルのエポック数を調整してみてください。</p>



<h3 class="wp-block-heading"><span id="toc12">前回のモデルがない場合</span></h3>



<p>このコードを実行することでai-third.h5にモデルの訓練データが格納されます。<br>これが実行し終わったら、上の『モデルをロードする』のコードを実行してください。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten
from keras.layers import Conv2D,Reshape, MaxPooling2D,Dropout

from keras.datasets import mnist
from keras.utils import to_categorical
import numpy as np

(X_train, y_train), (X_test, y_test) = mnist.load_data()

X_train = np.array(X_train)/255
X_test = np.array(X_test)/255

y_train = to_categorical(y_train)
y_test = to_categorical(y_test)



model = Sequential()

model.add(Reshape((28,28,1), input_shape=(28,28)))
model.add(Conv2D(32,(3,3)))
model.add(Activation(&quot;relu&quot;))

model.add(Conv2D(32,(3,3)))
model.add(Activation(&quot;relu&quot;))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.5))

model.add(Conv2D(16,(3,3)))
model.add(Activation(&quot;relu&quot;))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.5))

model.add(Flatten())
model.add(Dense(784))
model.add(Activation(&quot;relu&quot;))
model.add(Dropout(0.5))

model.add(Dense(10))
model.add(Activation(&quot;softmax&quot;))


model.compile(loss=&quot;categorical_crossentropy&quot;, optimizer=&quot;sgd&quot;, metrics=[&quot;accuracy&quot;])


hist = model.fit(X_train, y_train, batch_size=200, verbose=1, 
                 epochs=15, validation_split=0.1)

score = model.evaluate(X_test, y_test, verbose=1)

model.save(&quot;./ai-third.h5&quot;)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Dense, Activation, Flatten</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Conv2D,Reshape, MaxPooling2D,Dropout</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.datasets </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> mnist</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.utils </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> to_categorical</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">(X_train, y_train), (X_test, y_test) </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> mnist.load_data()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.array(X_train)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span>
<span class="line"><span style="color: #F8F8F2">X_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.array(X_test)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">y_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_train)</span></span>
<span class="line"><span style="color: #F8F8F2">y_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_test)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Reshape((</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">), </span><span style="color: #FD971F; font-style: italic">input_shape</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Conv2D(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">,(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Conv2D(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">,(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(MaxPooling2D((</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dropout(</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Conv2D(</span><span style="color: #AE81FF">16</span><span style="color: #F8F8F2">,(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(MaxPooling2D((</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dropout(</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Flatten())</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dropout(</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;softmax&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;categorical_crossentropy&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;sgd&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">metrics</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[</span><span style="color: #E6DB74">&quot;accuracy&quot;</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">hist </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.fit(X_train, y_train, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">200</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span></span>
<span class="line"><span style="color: #F8F8F2">                 </span><span style="color: #FD971F; font-style: italic">epochs</span><span style="color: #F92672">=</span><span style="color: #AE81FF">15</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">validation_split</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">score </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.evaluate(X_test, y_test, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.save(</span><span style="color: #E6DB74">&quot;./ai-third.h5&quot;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<h2 class="wp-block-heading"><span id="toc13">おわりに</span></h2>



<p>これで、今回の学習は終わりです。参考書でせっせこやるよりも、やっぱり実践的に手を動かした方が楽しいですよね。</p>



<p>また、今回で最初の１歩シリーズは完成になります。意外と、自分でも作れるんだと思ってもらえたら幸いです。</p>



<p>これからも、誰でも簡単に作れるAIをモットーにどんどん記事を更新していくので、AIで何か作ってみたい場合は是非、当サイトを利用してみてください。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1002/" title="【AI/実践編】生成AI-GANを実装【衝撃簡単④】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】生成AI-GANを実装【衝撃簡単④】</div><div class="blogcard-snippet internal-blogcard-snippet">AIの深い原理が分からなくても作れます！今日はそんなAI技術を実践していきます。GANと呼ばれる画像生成AIを構築していきます。深い原理や、複雑な数学的思考は必要ありません。いまや、AIはパズル間隔でできる技術になっています。原理が分からなくても、実践でどんどん原理なんて補ってやりましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.27</div></div></div></div></a>
</div><figcaption class="wp-element-caption">次回</figcaption></figure>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/797/" title="【AI/実践編】MNISTでAIを体験【衝撃簡単①】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】MNISTでAIを体験【衝撃簡単①】</div><div class="blogcard-snippet internal-blogcard-snippet">AIの深い原理が分からなくても作れます！MNISTを使ったとっても簡単な実装をやっていきます。AIの概要は学んだけど何から作ればいいんだろう。という悩みをお持ちのあなたにピッタリのタスクです。また、始めたばかりで100％の理解を求める必要はありません。50%理解できたらいいや程度の軽い気持ちで学習を進めましょう。その方が挫折することなく長期間続けられ、結果的にいつか50%の理解が90%以上の理解になる時がきます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.24</div></div></div></div></a>
</div><figcaption class="wp-element-caption">最初の１歩　①</figcaption></figure>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/other/851/" title="【AI/実践編】CNNを構築【衝撃簡単②】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】CNNを構築【衝撃簡単②】</div><div class="blogcard-snippet internal-blogcard-snippet">CNNを簡単に構築していきましょう！ＡＩ実装初心者にとても適した内容となっています。AIの概要は学んだけど何から作ればいいんだろう。という悩みをお持ちの方にピッタリです。今回はＣＮＮ（畳み込みニューラルネットワーク）を構築していきます。今日も気楽にやっていきましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.24</div></div></div></div></a>
</div><figcaption class="wp-element-caption">最初の1歩　②</figcaption></figure>



<p><br></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【AI/実践編】CNNを構築【衝撃簡単②】</title>
		<link>https://ascend-beyond.com/study/851/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Sat, 24 Feb 2024 12:58:21 +0000</pubDate>
				<category><![CDATA[AI（人工知能）]]></category>
		<category><![CDATA[Study]]></category>
		<category><![CDATA[実践]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[独学]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=851</guid>

					<description><![CDATA[目次 対象読者今日のゴール今日使うコード基本モデルの構築畳み込み層を追加Conv2DのルールConv２D入力編Conv2D出力編MNISTデータを読み込むモデルをコンパイルモデルの訓練モデルの評価学習の実行モデルの保存保 [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">対象読者</a><ol><ol><ol><li><a href="#toc2" tabindex="0">今日のゴール</a></li></ol></li></ol></li><li><a href="#toc3" tabindex="0">今日使うコード</a></li><li><a href="#toc4" tabindex="0">基本モデルの構築</a></li><li><a href="#toc5" tabindex="0">畳み込み層を追加</a></li><li><a href="#toc6" tabindex="0">Conv2Dのルール</a><ol><ol><li><a href="#toc7" tabindex="0">Conv２D入力編</a></li><li><a href="#toc8" tabindex="0">Conv2D出力編</a></li></ol></li></ol></li><li><a href="#toc9" tabindex="0">MNISTデータを読み込む</a></li><li><a href="#toc10" tabindex="0">モデルをコンパイル</a></li><li><a href="#toc11" tabindex="0">モデルの訓練</a></li><li><a href="#toc12" tabindex="0">モデルの評価</a></li><li><a href="#toc13" tabindex="0">学習の実行</a></li><li><a href="#toc14" tabindex="0">モデルの保存</a></li><li><a href="#toc15" tabindex="0">保存したモデルを使うには</a></li></ol></li><li><a href="#toc16" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">対象読者</span></h2>



<p>AIの概要は学んだけど何から作ればいいんだろう。という悩みをお持ちではありませんか？<br><br>この記事はそんな悩みにピッタリなものになっています。AI初心者でも簡単に形あるものを作ることを目標にしています。<br><br>前回はMNISTを使って簡単に正解率を導出しました。今回やることは、そこから少しだけレベルアップしてＣＮＮ（畳み込みニューラルネットワーク）を構築していきましょう。前回に引き続き、ＡＩ実装初心者にとても適した内容となっています。</p>



<p>今回も気楽にやっていきましょう！</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/797/" title="【AI/実践編】MNISTでAIを体験【衝撃簡単①】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/d4098bdd09c64be01d60fa85264aab0d.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】MNISTでAIを体験【衝撃簡単①】</div><div class="blogcard-snippet internal-blogcard-snippet">AIの深い原理が分からなくても作れます！MNISTを使ったとっても簡単な実装をやっていきます。AIの概要は学んだけど何から作ればいいんだろう。という悩みをお持ちのあなたにピッタリのタスクです。また、始めたばかりで100％の理解を求める必要はありません。50%理解できたらいいや程度の軽い気持ちで学習を進めましょう。その方が挫折することなく長期間続けられ、結果的にいつか50%の理解が90%以上の理解になる時がきます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.24</div></div></div></div></a>
</div><figcaption class="wp-element-caption">前回</figcaption></figure>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/other/855/" title="【AI/実践編】WebカメラとAIを連携【衝撃簡単③】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】WebカメラとAIを連携【衝撃簡単③】</div><div class="blogcard-snippet internal-blogcard-snippet">AIの深い原理が分からなくても作れます！今回は、AI素人でも実装可能なWebカメラを使ったニューラルネットワークを構築していきます。リアルタイムで画像を読み込み、それをMNISTデータで判別できるようにしましょう。AI初心者はとりあえず、実践あるのみですからね。机上の空論より、手を動かしていきましょう！それがAsend-Beyond式です！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.25</div></div></div></div></a>
</div><figcaption class="wp-element-caption">次回</figcaption></figure>



<h5 class="wp-block-heading"><span id="toc2">今日のゴール</span></h5>



<p>CNNをモデルに追加して、よりディープラーニングらしくしていきましょう。そもそもCNNとは全結合層の欠点を補える技術です。<br><br><strong>全結合層</strong><br>・空間的な構造や局所的なパターンを考慮できない→画像分析には不向き<br>・その代わり、言語処理や時系列データなどの系列データのパターン分析に向いている<br><br><strong>CNN</strong><br>・位置的な情報を保持したまま学習を進められる→画像分析に向く</p>



<p>また、今回もこちらのサイト（<a rel="nofollow noopener" href="https://qiita.com/Ka-k/items/deb59b20f3e622028455" target="_blank">https://qiita.com/Ka-k/items/deb59b20f3e622028455</a>）を参考に進めさせてもらいます。こちらはAI初心者にはとても参考になるサイトですが、少し古い部分があったりします。なので、本ページでは今風にアレンジしつつ誰でも実装できるように解説していきます。</p>



<h3 class="wp-block-heading"><span id="toc3">今日使うコード</span></h3>



<p>これが今日の全コードです。理解のために、コードと説明の順番が上下するので、もし迷ったらこちらを参考にしてください。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten
from keras.layers import Conv2D,Reshape, MaxPooling2D,Dropout

from keras.datasets import mnist
from keras.utils import to_categorical
import numpy as np

(X_train, y_train), (X_test, y_test) = mnist.load_data()

X_train = np.array(X_train)/255
X_test = np.array(X_test)/255

y_train = to_categorical(y_train)
y_test = to_categorical(y_test)



model = Sequential()

model.add(Reshape((28,28,1), input_shape=(28,28)))
model.add(Conv2D(32,(3,3)))
model.add(Activation(&quot;relu&quot;))

model.add(Conv2D(32,(3,3)))
model.add(Activation(&quot;relu&quot;))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.5))

model.add(Conv2D(16,(3,3)))
model.add(Activation(&quot;relu&quot;))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.5))

model.add(Flatten())
model.add(Dense(784))
model.add(Activation(&quot;relu&quot;))
model.add(Dropout(0.5))

model.add(Dense(10))
model.add(Activation(&quot;softmax&quot;))


model.compile(loss=&quot;categorical_crossentropy&quot;, optimizer=&quot;sgd&quot;, metrics=[&quot;accuracy&quot;])


hist = model.fit(X_train, y_train, batch_size=200, verbose=1, 
                 epochs=15, validation_split=0.1)

score = model.evaluate(X_test, y_test, verbose=1)

model.save(&quot;./ai-first.h5&quot;)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Dense, Activation, Flatten</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Conv2D,Reshape, MaxPooling2D,Dropout</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.datasets </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> mnist</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.utils </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> to_categorical</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">(X_train, y_train), (X_test, y_test) </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> mnist.load_data()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.array(X_train)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span>
<span class="line"><span style="color: #F8F8F2">X_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.array(X_test)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">y_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_train)</span></span>
<span class="line"><span style="color: #F8F8F2">y_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_test)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Reshape((</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">), </span><span style="color: #FD971F; font-style: italic">input_shape</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Conv2D(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">,(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Conv2D(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">,(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(MaxPooling2D((</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dropout(</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Conv2D(</span><span style="color: #AE81FF">16</span><span style="color: #F8F8F2">,(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(MaxPooling2D((</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dropout(</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Flatten())</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dropout(</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;softmax&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;categorical_crossentropy&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;sgd&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">metrics</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[</span><span style="color: #E6DB74">&quot;accuracy&quot;</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">hist </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.fit(X_train, y_train, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">200</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span></span>
<span class="line"><span style="color: #F8F8F2">                 </span><span style="color: #FD971F; font-style: italic">epochs</span><span style="color: #F92672">=</span><span style="color: #AE81FF">15</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">validation_split</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">score </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.evaluate(X_test, y_test, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.save(</span><span style="color: #E6DB74">&quot;./ai-first.h5&quot;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc4">基本モデルの構築</span></h3>



<p>まずは、全結合層のみでニューラルネットワークモデルを構築しましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential()

model.add(Dense(784))
model.add(Activation(&quot;relu&quot;))
model.add(Dropout(0.5))

model.add(Dense(10))
model.add(Activation(&quot;softmax&quot;))
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Dense, Activation</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dropout(</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;softmax&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span></code></pre></div>



<p><span class="bold-green"><strong>from keras.models import Sequential</strong></span><br>＃Kerasの<code>Sequential</code>モデルクラスをインポートします。<code>Sequential</code>モデルは、レイヤーを順番に重ねてモデルを定義するためのものです。<br><span class="bold-green"><br></span><strong><span class="bold-green">from keras.layers import Dense, Activation</span></strong><br>＃Dense層とActivation層を含む必要なモジュールをインポートします。Dense層は、<span class="bold-red">全結合層</span>を表し、Activation層は活性化関数を適用するために使用されます。<br><br><span class="bold-green">from keras.layers import Dropout</span><br>#過学習を防ぐために使用される正則化手法の1つである<code>Dropout</code>をインポートしています。<br><br><span class="bold-green">model = Sequential()</span><br>＃Sequentialモデルのインスタンスを作成します。これは、ニューラルネットワークモデルを構築するための土台となるものです。<br><br><strong><span class="bold-green">model.add(Dense(784))</span><br></strong>＃<strong><strong><span class="bold-red">全結合層</span></strong></strong>(Dense層)を追加します。この層は784個(28&#215;28)のユニット（ニューロン）を持ち、画像データの特徴を抽出し、平坦化します。</p>



<p><strong><span class="bold-green">model.add(Activation(&#8220;relu&#8221;))<br></span></strong>#ReLU(Rectified Linear Unit)活性化関数を適用します。これにより、非線形性が導入されます。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/808/" title="【AI/座学編】高頻出な活性化関数まとめ" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-160x90.png 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-300x169.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-1024x576.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-768x432.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-120x68.png 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-320x180.png 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5.png 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/座学編】高頻出な活性化関数まとめ</div><div class="blogcard-snippet internal-blogcard-snippet">ここでは、AIを実装する上で使用頻度の高い活性化関数を解説します。また、解説はAscendBeyond式にのっとり、複雑な概念理解には重きを置かず実装に必要な最低限の重要な知識のみを提供しています。座学で時間を浪費していては、AIを作るという本来の目的から離れるばかりですからね。やはり、座学よりも実践に時間を多く費やしてほしいので、座学は軽く頭に入れる程度にしてどんどん実践を積んでください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.22</div></div></div></div></a>
</div><figcaption class="wp-element-caption">ReLUについて知りたい方はどうぞ</figcaption></figure>



<p><span class="bold-green">model.add(Dropout(0.5))</span><br>＃Dropout率が0.5であるDropoutレイヤーを追加しています。ここでのDropout率0.5は、ランダムに選択された50%のニューロンを無効にし、それ以外のニューロンを活性化させることを意味します。</p>



<p><strong><span class="bold-green">model.add(Dense(10))</span><br></strong>#出力層として<strong><span class="bold-red">全結合層</span></strong>を追加します。この層は、モデルが10クラスの分類を行うことを示します。</p>



<p><strong><span class="bold-green">model.add(Activation(&#8220;softmax&#8221;))</span></strong><br>#最後に、ソフトマックス活性化関数を適用します。これにより、出力は各クラスに属する確率として解釈されます。softmax関数は、クラス分類問題において一般的に使用されます。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1177/" title="【AI/座学】GANパラメーター調整のコツ・極意書" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-160x90.png 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-300x169.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-1024x576.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-768x432.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-120x68.png 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1-320x180.png 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/76767daf7222e2ba0d566170348beca1.png 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/座学】GANパラメーター調整のコツ・極意書</div><div class="blogcard-snippet internal-blogcard-snippet">GANモデルは学習が不安定になりがちです。それを見ると、私の心も不安定(なんちゃって)。ここでは、そんな学習も心も不安定になってしまった人に向けての、GANモデルパラメーター調整のコツを紹介します。私の過去からの経験から【これは効果あった】や一般論をまとめています。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.02</div></div></div></div></a>
</div><figcaption class="wp-element-caption">Dropoutなどのパラメータの特徴をまとめられています</figcaption></figure>



<h3 class="wp-block-heading"><span id="toc5">畳み込み層を追加</span></h3>



<p>では、実際に畳み込み層を追加していきましょう。コード量が多く感じるかもしれませんが、実質は同じメソッドを使いまわしているだけなので、恐れることはありません。<br><br>p.s.コメント部分は既に書いたコードを表しています。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="#from keras.models import Sequential
#from keras.layers import Dense, Activation
#from keras.layers import Dropout
from keras.layers import Conv2D,MaxPooling2D

#model = Sequential()

model.add(Conv2D(32,(3,3)))
model.add(Activation(&quot;relu&quot;))

model.add(Conv2D(32,(3,3)))
model.add(Activation(&quot;relu&quot;))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.5))

model.add(Conv2D(16,(3,3)))
model.add(Activation(&quot;relu&quot;))
model.add(MaxPooling2D((2,2)))
model.add(Dropout(0.5))

#model.add(Dense(784))
#model.add(Activation(&quot;relu&quot;))
#model.add(Dropout(0.5))
#model.add(Dense(10))
#model.add(Activation(&quot;softmax&quot;))
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F">#from keras.models import Sequential</span></span>
<span class="line"><span style="color: #88846F">#from keras.layers import Dense, Activation</span></span>
<span class="line"><span style="color: #88846F">#from keras.layers import Dropout</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Conv2D,MaxPooling2D</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#model = Sequential()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Conv2D(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">,(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Conv2D(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">,(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(MaxPooling2D((</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dropout(</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Conv2D(</span><span style="color: #AE81FF">16</span><span style="color: #F8F8F2">,(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(MaxPooling2D((</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dropout(</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#model.add(Dense(784))</span></span>
<span class="line"><span style="color: #88846F">#model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"><span style="color: #88846F">#model.add(Dropout(0.5))</span></span>
<span class="line"><span style="color: #88846F">#model.add(Dense(10))</span></span>
<span class="line"><span style="color: #88846F">#model.add(Activation(&quot;softmax&quot;))</span></span>
<span class="line"></span></code></pre></div>



<p><strong><span class="bold-green">from keras.layers import Conv2D</span></strong><br>＃2次元<span class="bold-red">畳み込み層</span>(Convolutional Layer)を使用するためのモジュールをインポートします。<br><br><span class="bold-green">from keras.layers import MaxPooling2D<br></span>＃畳み込みニューラルネットワーク（CNN）内で使用される<span class="bold-red">プーリング層</span>の1つであるMaxPooling2Dをインポートしています。<br></p>



<p><span class="bold-green"><code>model.add(Conv2D(32,(3,3)))</code></span><br>＃32個の3&#215;3のフィルタを持つ畳み込み層を追加しています。この層は、画像データの特徴を抽出します。<br><br><span class="bold-green"><code>model.add(Activation("relu"))</code></span><br>＃ReLU(Rectified Linear Unit)活性化関数を適用します。これにより、非線形性が導入されます。<br><br><code><span class="bold-green">model.add(Conv2D(32,(3,3)))</span></code><br>＃32個の3&#215;3のフィルタを持つ畳み込み層を追加しています。この層も、画像データの特徴を抽出します。<br><br><code><span class="bold-green">model.add(Activation("relu"))</span></code><br>＃再びReLU活性化関数を適用します。<br><br><span class="bold-green"><code>model.add(MaxPooling2D((2,2)))</code></span><br>＃MaxPooling2D層を追加します。2&#215;2のウィンドウ内の最大値を取得し、画像を圧縮します。これにより、特徴マップのサイズが削減されます。<br><br><span class="bold-green"><code>model.add(Dropout(0.5))</code></span><br>＃Dropoutレイヤーを追加します。50%のドロップアウト率で、ランダムに一部のニューロンを無効にします。過学習を防止するために使用されます。<br><br>以上のプロセスを繰り返し、さらに畳み込み層とプーリング層、Dropoutレイヤーを追加しています。3つ目の畳み込み層は16個の3&#215;3のフィルタを持ち、その後にReLU活性化関数が適用され、MaxPooling2Dで画像が圧縮され、最後にDropoutが適用されます。</p>



<table border="0" cellpadding="0" cellspacing="0"><tr><td><div style="border:1px solid #95a5a6;border-radius:.75rem;background-color:#FFFFFF;width:280px;margin:0px;padding:5px;text-align:center;overflow:hidden;"><table><tr><td style="width:128px"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15333368%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;"><img decoding="async" src="https://hbb.afl.rakuten.co.jp/hgb/39414777.169c3d99.39414778.be6498e6/?me_id=1213310&#038;item_id=18983783&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F8260%2F9784873118260.jpg%3F_ex%3D128x128&#038;s=128x128&#038;t=picttext" border="0" style="margin:2px" alt="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]" title="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]"></a></td><td style="vertical-align:top;width:136px;display: block;"><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px;word-wrap:break-word"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15333368%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">直感 Deep Learning Python×Kerasでアイデアを形にするレシピ [ Antonio Gulli ]</a><br><span >価格：3,740円（税込、送料無料)</span> <span style="color:#BBB">(2024/3/4時点)</span></p></td></tr></table></div><br><p style="color:#000000;font-size:12px;line-height:1.4em;margin:5px;word-wrap:break-word"></p></td></tr></table>



<h3 class="wp-block-heading"><span id="toc6">Conv2Dのルール</span></h3>



<p>Conv２Dを使用するためにはいくつかのルールがあります。そのルールに従わないと学習を進めることができません。そのため、ここでは上のコードをConv２Dに合うように必要なコードを追加していきます。</p>



<h5 class="wp-block-heading"><span id="toc7">Conv２D入力編</span></h5>



<p><code>Conv2D()</code>の入力は３次元(width,height,channel)でなけらばなりません。しかし、今回入力とするMNISTはチャンネルを持たない２次元です。なので、この入力を３次元に変換していきましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="# from keras.models import Sequential
# from keras.layers import Dense, Activation
# from keras.layers import Conv2D,MaxPooling2D,Dropout
from keras.layers import Reshape

#model = Sequential()

model.add(Reshape((28,28,1), input_shape=(28,28)))
# model.add(Conv2D(32,(3,3)))
# model.add(Activation(&quot;relu&quot;))

# model.add(Conv2D(32,(3,3)))
# model.add(Activation(&quot;relu&quot;))
# model.add(MaxPooling2D((2,2)))
# model.add(Dropout(0.5))

# model.add(Conv2D(16,(3,3)))
# model.add(Activation(&quot;relu&quot;))
# model.add(MaxPooling2D((2,2)))
# model.add(Dropout(0.5))

# model.add(Dense(784))
# model.add(Activation(&quot;relu&quot;))
# model.add(Dropout(0.5))
# model.add(Dense(10))
# model.add(Activation(&quot;softmax&quot;))" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F"># from keras.models import Sequential</span></span>
<span class="line"><span style="color: #88846F"># from keras.layers import Dense, Activation</span></span>
<span class="line"><span style="color: #88846F"># from keras.layers import Conv2D,MaxPooling2D,Dropout</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Reshape</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#model = Sequential()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Reshape((</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">), </span><span style="color: #FD971F; font-style: italic">input_shape</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Conv2D(32,(3,3)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># model.add(Conv2D(32,(3,3)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"><span style="color: #88846F"># model.add(MaxPooling2D((2,2)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dropout(0.5))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># model.add(Conv2D(16,(3,3)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"><span style="color: #88846F"># model.add(MaxPooling2D((2,2)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dropout(0.5))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># model.add(Dense(784))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dropout(0.5))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dense(10))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;softmax&quot;))</span></span></code></pre></div>



<p><span class="bold-green"><code>from keras.layers import Reshape</code><br></span>＃Reshapeレイヤーを使用するために必要なモジュールをインポートします。Reshapeレイヤーは、入力データの<span class="marker-under">形状を変更するため</span>に使用されます。<br><br><span class="bold-green">model.add(Reshape((28,28,1), input_shape=(28,28))) </span><br>＃Reshapeレイヤーを追加します。このレイヤーは、入力データの形状を変更します。具体的には、入力データの形状を <code>(28, 28)</code> から <code>(28, 28, 1)</code> に変更します。これは、入力データがグレースケールの画像であり、1つのチャンネル（色）のみを持つことを示しています。このような形状のデータは、通常、畳み込みニューラルネットワーク（CNN）の入力として多々使用されています。</p>



<h5 class="wp-block-heading"><span id="toc8">Conv2D出力編</span></h5>



<p>Conv2Dで出力されたデータは<span class="bold">２次元配列です。</span>しかし、それと結合する全結合層は１次元配列しか受け付けません。そのため、全結合層(Dense)に渡す前には２次元配列を１次元に変形する必要があります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="# from keras.models import Sequential
# from keras.layers import Dense, Activation
# from keras.layers import Conv2D,MaxPooling2D,Dropout
#from keras.layers import Reshape
from keras.layers import Flatten

#model = Sequential()
# model.add(Reshape((28,28,1), input_shape=(28,28)))
# model.add(Conv2D(32,(3,3)))
# model.add(Activation(&quot;relu&quot;))

# model.add(Conv2D(32,(3,3)))
# model.add(Activation(&quot;relu&quot;))
# model.add(MaxPooling2D((2,2)))
# model.add(Dropout(0.5))

# model.add(Conv2D(16,(3,3)))
# model.add(Activation(&quot;relu&quot;))
# model.add(MaxPooling2D((2,2)))
# model.add(Dropout(0.5))

model.add(Flatten())

# model.add(Dense(784))
# model.add(Activation(&quot;relu&quot;))
# model.add(Dropout(0.5))
# model.add(Dense(10))
# model.add(Activation(&quot;softmax&quot;))" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F"># from keras.models import Sequential</span></span>
<span class="line"><span style="color: #88846F"># from keras.layers import Dense, Activation</span></span>
<span class="line"><span style="color: #88846F"># from keras.layers import Conv2D,MaxPooling2D,Dropout</span></span>
<span class="line"><span style="color: #88846F">#from keras.layers import Reshape</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Flatten</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#model = Sequential()</span></span>
<span class="line"><span style="color: #88846F"># model.add(Reshape((28,28,1), input_shape=(28,28)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Conv2D(32,(3,3)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># model.add(Conv2D(32,(3,3)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"><span style="color: #88846F"># model.add(MaxPooling2D((2,2)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dropout(0.5))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># model.add(Conv2D(16,(3,3)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"><span style="color: #88846F"># model.add(MaxPooling2D((2,2)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dropout(0.5))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Flatten())</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># model.add(Dense(784))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dropout(0.5))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dense(10))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;softmax&quot;))</span></span></code></pre></div>



<p><span class="bold-green">from keras.layers import Flatten</span><br>#<code>Flatten</code>をインポートしています。Flattenレイヤーは入力を平滑化するために使用されます。<span class="bold-green"><br></span><br><span class="bold-green">model.add(Flatten())<br></span>＃畳み込み層やプーリング層などで処理された2次元の特徴マップを、その後の全結合層に入力するために、<span class="marker-under">１次元に変換するため</span>にFlatten()レイヤーが使います。<strong><span class="bold-green"><br></span></strong></p>



<h3 class="wp-block-heading"><span id="toc9">MNISTデータを読み込む</span></h3>



<p>前回同様、今回もMNISTを使って分析していきます。MNISTデータセットを読み込み、画像データとラベルデータを前処理してニューラルネットワークのトレーニングに適した形式に変換していきましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="#~~~省略~~~~~~~~~~~~~~~~~~~~~~~
from keras.datasets import mnist
from keras.utils import to_categorical
import numpy as np

(X_train, y_train), (X_test, y_test) = mnist.load_data()

X_train = np.array(X_train)/255
X_test = np.array(X_test)/255

y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

#~~~省略~~~~~~~~~~~~~~~~~~~~~~~" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F">#~~~省略~~~~~~~~~~~~~~~~~~~~~~~</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.datasets </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> mnist</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.utils </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> to_categorical</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">(X_train, y_train), (X_test, y_test) </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> mnist.load_data()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.array(X_train)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span>
<span class="line"><span style="color: #F8F8F2">X_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.array(X_test)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">y_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_train)</span></span>
<span class="line"><span style="color: #F8F8F2">y_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_test)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#~~~省略~~~~~~~~~~~~~~~~~~~~~~~</span></span></code></pre></div>



<p><span class="bold-green"><code>from keras.datasets import mnist</code><br></span>＃Kerasの<code>mnist</code>モジュールからMNISTデータセットを読み込むためのモジュールをインポートします。MNISTデータセットは、手書き数字（0から9までの数字）の画像データセットです。</p>



<p><span class="bold-green"><code>from keras.utils import to_categorical</code><br></span>＃Kerasの<code>to_categorical</code>関数を使用するためのモジュールをインポートします。この関数は、クラスラベルを<span class="bold-red">one-hotエンコーディング</span>形式に変換するのに使用されます。<br><br><code><span class="bold-green">import numpy as np</span></code><br>＃NumPyライブラリを<code>np</code>としてインポートします。NumPyはPythonで数値計算を行うための基本的なライブラリです。<br><br><span class="bold-green"><code>(X_train, y_train), (X_test, y_test) = mnist.load_data()</code><br></span>＃ <code>mnist.load_data()</code>関数を使用してMNISTデータセットを読み込みます。この関数は、トレーニング用の画像データとラベル、テスト用の画像データとラベルを返します。それぞれを<code>(X_train, y_train)</code>と<code>(X_test, y_test)</code>に代入します。<br><br><span class="bold-green"><code>X_train = np.array(X_train)/255</code></span><br><span class="bold-green"><code>X_test = np.array(X_test)/255</code><br></span>＃トレーニング用とテスト用の画像データをNumPy配列に変換し、値を0から1の範囲に正規化します。これは、画像のピクセル値を0から255の範囲から0から1の範囲にスケーリングすることで、ニューラルネットワークの学習を効率的に行うためです。<br><br><span class="bold-green"><code>y_train = to_categorical(y_train)</code><br><code>y_test = to_categorical(y_test)</code></span><br>＃トレーニング用とテスト用のラベルデータをone-hotエンコーディング形式に変換します。これにより、各サンプルのラベルがクラスの数だけの次元を持つベクトルに変換されます。例えば、数字3の場合、[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]となります。これは、多クラス分類のタスクにおいて、出力層でソフトマックス活性化関数を使用するために必要です。</p>



<h3 class="wp-block-heading"><span id="toc10">モデルをコンパイル</span></h3>



<p>モデルが学習するための損失関数や最適化アルゴリズム、および評価指標を設定していきましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="#~~~省略~~~~~~~~~~~~~~~~~~~~~~~
model.compile(loss=&quot;categorical_crossentropy&quot;, optimizer=&quot;sgd&quot;, metrics=[&quot;accuracy&quot;])
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F">#~~~省略~~~~~~~~~~~~~~~~~~~~~~~</span></span>
<span class="line"><span style="color: #F8F8F2">model.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;categorical_crossentropy&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;sgd&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">metrics</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[</span><span style="color: #E6DB74">&quot;accuracy&quot;</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span></code></pre></div>



<p><code><span class="bold-green">model.compile</span></code><br>＃モデルをコンパイルします。このメソッドを使用して、モデルの学習プロセスを設定します。<br><br><span class="bold-green"><code>loss="categorical_crossentropy"</code><br></span>＃損失関数(loss function)として、カテゴリカルクロスエントロピーを指定しています。カテゴリカルクロスエントロピーは、<span class="red">多クラス分類問題</span>において使用される損失関数であり、モデルの予測と真のラベルの間の差異を評価します。<br><br><code>optimizer="sgd"</code><br>＃<span class="bold-red">オプティマイザ</span>(optimizer)として、<span class="bold-red">確率的勾配降下法</span>（Stochastic Gradient Descent、SGD）を指定しています。SGDは、ミニバッチごとに勾配を計算し、モデルのパラメータを更新する際に使用される最適化アルゴリズムです。<br><br><span class="bold-green"><code>metrics=["accuracy"]</code><br></span>＃モデルの性能評価指標(metrics)として、正解率(accuracy)を指定しています。正解率は、モデルが正しく分類したサンプルの割合を示します。訓練や評価の際に、この指標を監視することでモデルの性能を評価することができます。</p>



<table border="0" cellpadding="0" cellspacing="0"><tr><td><div style="border:1px solid #95a5a6;border-radius:.75rem;background-color:#FFFFFF;width:280px;margin:0px;padding:5px;text-align:center;overflow:hidden;"><table><tr><td style="width:128px"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/3a19e183.08365096.3a19e184.6a2b305f/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Frakutenkobo-ebooks%2F75c648fa60493563a5048e69a76ecd2f%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;"><img decoding="async" src="https://hbb.afl.rakuten.co.jp/hgb/3a19e183.08365096.3a19e184.6a2b305f/?me_id=1278256&#038;item_id=19942034&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Frakutenkobo-ebooks%2Fcabinet%2F7491%2F2000009507491.jpg%3F_ex%3D128x128&#038;s=128x128&#038;t=picttext" border="0" style="margin:2px" alt="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]" title="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]"></a></td><td style="vertical-align:top;width:136px;display: block;"><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px;word-wrap:break-word"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/3a19e183.08365096.3a19e184.6a2b305f/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Frakutenkobo-ebooks%2F75c648fa60493563a5048e69a76ecd2f%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">TensorFlow2 TensorFlow＆Keras対応 プログラミング実装ハンドブック【電子書籍】[ チーム・カルポ ]</a><br><span >価格：2,772円</span> <span style="color:#BBB">(2024/3/4時点)</span></p></td></tr></table></div><br><p style="color:#000000;font-size:12px;line-height:1.4em;margin:5px;word-wrap:break-word"></p></td></tr></table>



<h3 class="wp-block-heading"><span id="toc11">モデルの訓練</span></h3>



<p>訓練が開始されると、各エポックごとに訓練データと検証データの損失と評価指標が計算され、<code>hist</code> オブジェクトに保存されるようにします。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="#~~~省略~~~~~~~~~~~~~~~~~~~~~~~
hist = model.fit(X_train, y_train, batch_size=200, verbose=1, 
                 epochs=1, validation_split=0.1)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F">#~~~省略~~~~~~~~~~~~~~~~~~~~~~~</span></span>
<span class="line"><span style="color: #F8F8F2">hist </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.fit(X_train, y_train, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">200</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span></span>
<span class="line"><span style="color: #F8F8F2">                 </span><span style="color: #FD971F; font-style: italic">epochs</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">validation_split</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.1</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p><strong><span class="bold-green">hist = model.fit(X_train, y_train, batch_size=200, verbose=1,<br>epochs=10, validation_split=0.1)</span></strong><br><br>＃<code><strong>hist = model.fit</strong></code>　<br>: モデルの訓練を開始するためのメソッドです。<code>model</code> は訓練するニューラルネットワークモデルを指します<br><br>＃<code><strong>X_train, y_train</strong></code>　<br>: 訓練用の入力データ <code>X_train</code> とそのラベルデータ <code>y_train</code> を指定しています。このデータはモデルの学習に使用されます。<br><br>＃<code><strong>batch_size=200</strong></code>　<br>: ミニバッチのサイズを指定しています。ミニバッチ学習では、全データセットを小さなバッチに分割し、各バッチごとにモデルのパラメータを更新します。<code>batch_size</code> は1回のパラメータ更新に使用するデータのサンプル数を指定します。<br><br>＃<code><strong>verbose=1</strong></code>　<br>: 訓練中にログメッセージを表示するかどうかを制御します。<code>verbose=1</code> の場合、進捗バーが表示されます。表示した方がカッコいいですよ。（笑）<br><br>＃<code><strong>epochs=</strong></code><strong>3</strong>　<br>: エポック数を指定しています。1つのエポックとは、全ての訓練データを1回学習することを指します。<code>epochs</code> パラメータは、モデルが訓練データを何回反復して学習するかを指定します。<br><br>#<code><strong>validation_split=0.1</strong></code>　<br>：検証データの割合を指定しています。訓練データの一部を検証に使用します。この場合、訓練データの10%が検証に使用されます。訓練中にモデルの性能を監視し、過学習を防ぐために使用されます</p>



<h3 class="wp-block-heading"><span id="toc12">モデルの評価</span></h3>



<p>先ほど訓練したモデルをテストデータを使って評価していきます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="#~~~省略~~~~~~~~~~~~~~~~~~~~~~~

score = model.evaluate(X_test, y_test, verbose=1)
print(&quot;正解率(acc)：&quot;, score[1])" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F">#~~~省略~~~~~~~~~~~~~~~~~~~~~~~</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">score </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.evaluate(X_test, y_test, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;正解率(acc)：&quot;</span><span style="color: #F8F8F2">, score[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">])</span></span></code></pre></div>



<p><span class="bold-green"><strong>score = model.evaluate(X_test, y_test, verbose=1) </strong></span><br>＃<strong><code>evaluate()</code> </strong>　：モデルの性能を評価するためのメソッドです。<strong>evaluatte()</strong>メソッドは、指定されたデータセットで<span class="marker-under">モデルを評価し、損失と評価指標（ここでは正解率）を返し</span>ます。<br>＃引数<strong> <code>X_test</code> </strong>はテストデータの入力、<code><strong>y_test</strong></code> はテストデータの出力（正解ラベル）を表します。<br>＃<code><strong>verbose=1</strong></code> は評価の進捗状況を表示する設定です。<br><br><span class="bold-green"><strong>print(&#8220;正解率(acc)：&#8221;, score[1])</strong><br></span>＃テストデータでの評価結果を出力しています。<code>score[1]</code> は、<code>evaluate</code> メソッドが返す評価指標のうち、正解率（accuracy）に対応する値を取得しています。この値は、モデルがテストデータで<span class="marker-under">正確に予測できた割合</span>を示します。</p>



<h3 class="wp-block-heading"><span id="toc13">学習の実行</span></h3>



<p>では、実行していきましょう。実行方法は人それぞれですが、私の場合はCMDでファイル名を入力することで実行しています。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="ファイル名.py" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">ファイル名.py</span></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc14">モデルの保存</span></h3>



<p>訓練されたニューラルネットワークモデルを&#8221;MNIST.h5&#8243; という名前のファイルに保存しましょう。このファイルを後で読み込むことで、モデルを再利用したり、別のプログラムで使用したりすることができます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="#~~~省略~~~~~~~~~~~~~~~~~~~~~~~

model.save(&quot;MNIST.h5&quot;)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F">#~~~省略~~~~~~~~~~~~~~~~~~~~~~~</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.save(</span><span style="color: #E6DB74">&quot;MNIST.h5&quot;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p><strong><span class="bold-green">model.save(&#8220;MNIST.h5&#8221;)<br></span></strong>＃<code><strong>model</strong></code> は保存するKerasモデルを指します。<br>＃<code><strong>.save()</strong></code> メソッドは、指定されたファイル名でモデルを保存します。ここでは、&#8221;MNIST.h5&#8243; という名前のファイルにモデルが保存されます。拡張子 <code>.h5</code> は、HDF5形式で保存されることを示しています。</p>



<h3 class="wp-block-heading"><span id="toc15">保存したモデルを使うには</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="from keras.models import load_model 

model = load_model(&quot;MNIST.h5&quot;)

hist = model.fit(X_train, y_train, batch_size=200, verbose=1, 
                 epochs=3, validation_split=0.1)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> load_model </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> load_model(</span><span style="color: #E6DB74">&quot;MNIST.h5&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">hist </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.fit(X_train, y_train, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">200</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span></span>
<span class="line"><span style="color: #F8F8F2">                 </span><span style="color: #FD971F; font-style: italic">epochs</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">validation_split</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.1</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p><span class="bold-green"><strong>from keras.models import load_model </strong><br></span>＃Kerasの <code>models</code> モジュールから <code>load_model</code> 関数をインポートしています。<span class="marker-under"><code>load_model</code> 関数は、保存されたモデルを読み込むために使用</span>されます。<br><br><span class="bold-green"><strong>model = load_model(&#8220;MNIST.h5&#8221;)</strong><br></span>＃<code>load_model</code> 関数を使って、&#8221;MNIST.h5&#8243; というファイルからモデルを読み込んでいます。読み込まれたモデルは、<code>model</code> 変数に格納されます。<br><br><span class="bold-green">hist = model.fit(X_train, y_train, batch_size=200, verbose=1,<br>                 epochs=3, validation_split=0.1)</span><br>＃<span class="marker-under">続きから学習を再開</span>することができます。<br>＃先ほどのコードと同じなので細かい説明は割愛します。</p>



<table border="0" cellpadding="0" cellspacing="0"><tr><td><div style="border:1px solid #95a5a6;border-radius:.75rem;background-color:#FFFFFF;width:280px;margin:0px;padding:5px;text-align:center;overflow:hidden;"><table><tr><td style="width:128px"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15374717%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;"><img decoding="async" src="https://hbb.afl.rakuten.co.jp/hgb/39414777.169c3d99.39414778.be6498e6/?me_id=1213310&#038;item_id=19028377&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F4121%2F9784798154121.jpg%3F_ex%3D128x128&#038;s=128x128&#038;t=picttext" border="0" style="margin:2px" alt="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]" title="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]"></a></td><td style="vertical-align:top;width:136px;display: block;"><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px;word-wrap:break-word"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15374717%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">現場で使える！TensorFlow開発入門 Kerasによる深層学習モデル構築手法 （AI &amp; TECHNOLOGY） [ 太田 満久 ]</a><br><span >価格：2,948円（税込、送料無料)</span> <span style="color:#BBB">(2024/3/4時点)</span></p></td></tr></table></div><br><p style="color:#000000;font-size:12px;line-height:1.4em;margin:5px;word-wrap:break-word"></p></td></tr></table>



<h2 class="wp-block-heading"><span id="toc16">まとめ</span></h2>



<p>しゅうりょーー。お疲れさまでした。書籍で原理を学ぶよりも、やっぱり動かしながら学んだ方が楽しいし、頭に入りますよね。</p>



<p>ということで、これからもどんどん実践を積んでいきましょう！</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/855/" title="【AI/実践編】WebカメラとAIを連携【衝撃簡単③】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】WebカメラとAIを連携【衝撃簡単③】</div><div class="blogcard-snippet internal-blogcard-snippet">AIの深い原理が分からなくても作れます！今回は、AI素人でも実装可能なWebカメラを使ったニューラルネットワークを構築していきます。リアルタイムで画像を読み込み、それをMNISTデータで判別できるようにしましょう。AI初心者はとりあえず、実践あるのみですからね。机上の空論より、手を動かしていきましょう！それがAsend-Beyond式です！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.25</div></div></div></div></a>
</div><figcaption class="wp-element-caption">次回</figcaption></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【AI/実践編】MNISTでAIを体験【衝撃簡単①】</title>
		<link>https://ascend-beyond.com/study/797/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Fri, 23 Feb 2024 15:05:44 +0000</pubDate>
				<category><![CDATA[AI（人工知能）]]></category>
		<category><![CDATA[Study]]></category>
		<category><![CDATA[実践]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[独学]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=797</guid>

					<description><![CDATA[目次 対象読者今日のゴール今日使うコード仮想環境の構築ライブラリのインストールMNISTを読み込むモデルの準備モデルの構築モデルをコンパイルMNISTの前処理正規化ラベルの修正モデルの訓練モデルの評価学習の実行/中断学習 [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18" checked><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">対象読者</a><ol><ol><ol><li><a href="#toc2" tabindex="0">今日のゴール</a></li></ol></li></ol></li><li><a href="#toc3" tabindex="0">今日使うコード</a></li><li><a href="#toc4" tabindex="0">仮想環境の構築</a></li><li><a href="#toc5" tabindex="0">ライブラリのインストール</a></li><li><a href="#toc6" tabindex="0">MNISTを読み込む</a></li><li><a href="#toc7" tabindex="0">モデルの準備</a></li><li><a href="#toc8" tabindex="0">モデルの構築</a></li><li><a href="#toc9" tabindex="0">モデルをコンパイル</a></li><li><a href="#toc10" tabindex="0">MNISTの前処理</a><ol><ol><li><a href="#toc11" tabindex="0">正規化</a></li><li><a href="#toc12" tabindex="0">ラベルの修正</a></li></ol></li></ol></li><li><a href="#toc13" tabindex="0">モデルの訓練</a></li><li><a href="#toc14" tabindex="0">モデルの評価</a></li><li><a href="#toc15" tabindex="0">学習の実行/中断</a></li><li><a href="#toc16" tabindex="0">学習済みモデルの保存</a></li><li><a href="#toc17" tabindex="0">保存したモデルを使うには</a></li></ol></li><li><a href="#toc18" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">対象読者</span></h2>



<p>AIの<span class="red">概要は学んだけど何から作ればいいんだろう</span>。という悩みをお持ちではありませんか？<br><br>今日はそんなあなたにピッタリのタスクを紹介します。コーディング自体は数分で終わります。</p>



<p>また、始めたばかりで100％の理解を求める必要はありません。AIはとても深い分野なので、50%理解できたらいいや程度の軽い気持ちで学習を進めましょう。その方が挫折することなく長期間続けられ、結果的にいつか50%の理解が90%以上の理解になる時がきます。</p>



<p>今日は気楽にやっていきましょう！</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/other/851/" title="【AI/実践編】CNNを構築【衝撃簡単②】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】CNNを構築【衝撃簡単②】</div><div class="blogcard-snippet internal-blogcard-snippet">CNNを簡単に構築していきましょう！ＡＩ実装初心者にとても適した内容となっています。AIの概要は学んだけど何から作ればいいんだろう。という悩みをお持ちの方にピッタリです。今回はＣＮＮ（畳み込みニューラルネットワーク）を構築していきます。今日も気楽にやっていきましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.24</div></div></div></div></a>
</div><figcaption class="wp-element-caption">次回</figcaption></figure>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/other/855/" title="【AI/実践編】WebカメラとAIを連携【衝撃簡単③】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】WebカメラとAIを連携【衝撃簡単③】</div><div class="blogcard-snippet internal-blogcard-snippet">AIの深い原理が分からなくても作れます！今回は、AI素人でも実装可能なWebカメラを使ったニューラルネットワークを構築していきます。リアルタイムで画像を読み込み、それをMNISTデータで判別できるようにしましょう。AI初心者はとりあえず、実践あるのみですからね。机上の空論より、手を動かしていきましょう！それがAsend-Beyond式です！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.25</div></div></div></div></a>
</div><figcaption class="wp-element-caption">次々回</figcaption></figure>



<h5 class="wp-block-heading"><span id="toc2">今日のゴール</span></h5>



<p>今日のゴールは下の写真のようにMNISTデータを使って、実際に正解率を出すところまでやっていきます。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="126" src="https://ascend-beyond.com/wp-content/uploads/2024/02/10a409b62952ff98699128a593e88c03-1024x126.png" alt="ｃｍｄ" class="wp-image-904" style="width:840px;height:auto" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/10a409b62952ff98699128a593e88c03-1024x126.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/10a409b62952ff98699128a593e88c03-300x37.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/10a409b62952ff98699128a593e88c03-768x95.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/10a409b62952ff98699128a593e88c03-1536x190.png 1536w, https://ascend-beyond.com/wp-content/uploads/2024/02/10a409b62952ff98699128a593e88c03.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>また、当ページは<a rel="nofollow noopener" href="https://qiita.com/Ka-k" target="_blank">@Ka-k(KAI Kenzo)</a>という方の<a rel="nofollow noopener" href="https://qiita.com/Ka-k/items/2cd6f86b6aa00bf5e72b" target="_blank">環境構築</a>と<a rel="nofollow noopener" href="https://qiita.com/Ka-k/items/2cd6f86b6aa00bf5e72b" target="_blank">MNISTチュートリアル</a>の２ページを参考に書きました。KAIさんは初心者にとても良質な教材を提供されている方です。しかし、結構前に書かれているということもあり、コードが少しだけ古くなっています。<br><br>なので、今日はこのサイトを参考にしつつも今風にアレンジしつつ誰でも実装できるように解説していきます。<br>p.s.赤太字は当サイトで座学として解説済み&amp;解説予定のワードです。</p>



<h3 class="wp-block-heading"><span id="toc3">今日使うコード</span></h3>



<p>これが今日の全コードです。理解のために、コードと説明の順番が上下するので、もし迷ったらこちらを参考にしてください。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.utils import to_categorical

(X_train, y_train), (X_test, y_test) = mnist.load_data()

model = Sequential()

model.add(Dense(512, input_dim=(784)))
model.add(Activation(&quot;relu&quot;))

model.add(Dense(10))
model.add(Activation(&quot;softmax&quot;))


model.compile(loss=&quot;categorical_crossentropy&quot;, optimizer=&quot;sgd&quot;, metrics=[&quot;accuracy&quot;])

X_train = X_train.reshape(60000, 784)/255
X_test = X_test.reshape(10000, 784)/255



y_train = to_categorical(y_train)
y_test = to_categorical(y_test)


hist = model.fit(X_train, y_train, batch_size=200, verbose=1, 
                 epochs=10, validation_split=0.1)　#epoch数はお好みで

score = model.evaluate(X_test, y_test, verbose=1)
print(&quot;正解率(acc)：&quot;, score[1])

model.save(&quot;./ai-first.h5&quot;)
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.datasets </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> mnist</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Dense, Activation</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.utils </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> to_categorical</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">(X_train, y_train), (X_test, y_test) </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> mnist.load_data()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">512</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_dim</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;softmax&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;categorical_crossentropy&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;sgd&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">metrics</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[</span><span style="color: #E6DB74">&quot;accuracy&quot;</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train.reshape(</span><span style="color: #AE81FF">60000</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span>
<span class="line"><span style="color: #F8F8F2">X_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_test.reshape(</span><span style="color: #AE81FF">10000</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">y_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_train)</span></span>
<span class="line"><span style="color: #F8F8F2">y_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_test)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">hist </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.fit(X_train, y_train, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">200</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span></span>
<span class="line"><span style="color: #F8F8F2">                 </span><span style="color: #FD971F; font-style: italic">epochs</span><span style="color: #F92672">=</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">validation_split</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.1</span><span style="color: #F8F8F2">)　</span><span style="color: #88846F">#epoch数はお好みで</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">score </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.evaluate(X_test, y_test, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;正解率(acc)：&quot;</span><span style="color: #F8F8F2">, score[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.save(</span><span style="color: #E6DB74">&quot;./ai-first.h5&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc4">仮想環境の構築</span></h3>



<p>まずは仮想環境を作っていきましょう。作れればなんでもいいので、お好みのやり方でやってください。今回、私はコマンドプロンプト（cmd）から作る方法でやっていきます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="python -m venv 仮想環境名　#仮想環境の作成

仮想環境名/Scripts/activate #仮想環境の有効化(Windows version)
source 仮想環境名/bin/activate #仮想環境の有効化(Mac/Linux　version)

cd 仮想環境名/Scripts #Scriptsディレクトリまで移動

echo. &gt; ファイル名.py #Pythonファイルを作成

code . #vsCodeを開く" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">python </span><span style="color: #F92672">-</span><span style="color: #F8F8F2">m venv 仮想環境名　</span><span style="color: #88846F">#仮想環境の作成</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">仮想環境名</span><span style="color: #F92672">/</span><span style="color: #F8F8F2">Scripts</span><span style="color: #F92672">/</span><span style="color: #F8F8F2">activate </span><span style="color: #88846F">#仮想環境の有効化(Windows version)</span></span>
<span class="line"><span style="color: #F8F8F2">source 仮想環境名</span><span style="color: #F92672">/</span><span style="color: #F8F8F2">bin</span><span style="color: #F92672">/</span><span style="color: #F8F8F2">activate </span><span style="color: #88846F">#仮想環境の有効化(Mac/Linux　version)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">cd 仮想環境名</span><span style="color: #F92672">/</span><span style="color: #F8F8F2">Scripts </span><span style="color: #88846F">#Scriptsディレクトリまで移動</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">echo. </span><span style="color: #F92672">&gt;</span><span style="color: #F8F8F2"> ファイル名.py </span><span style="color: #88846F">#Pythonファイルを作成</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">code </span><span style="color: #F92672">.</span><span style="color: #F8F8F2"> </span><span style="color: #88846F">#vsCodeを開く</span></span></code></pre></div>



<p>pythonファイルを作成する場所はactivate.batやactivateと同じディレクトリにしましょう。</p>



<p>仮想環境には以下のメリットがあります。</p>



<ul class="wp-block-list">
<li>プロジェクトごとの環境の分離</li>



<li>クリーンアップの容易化</li>
</ul>



<h3 class="wp-block-heading"><span id="toc5">ライブラリのインストール</span></h3>



<p>では、次に必要なライブラリをインストールしていきましょう。これもcmdでやっていきます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="＃ニューラルネットワークやディープラーニングモデルの構築やトレーニングに使用されるライブラリ
pip install tensorflow

＃大規模なデータセットを使うときに用いるパッケージ
pip install h5py

＃モデルの構築、トレーニング、評価、デプロイメントなどを簡素化するライブラリ
pip install keras

＃画像やビデオのキャプチャ、変換、フィルタリング、特徴抽出、物体検出、画像の編集などに使う
pip install opencv-python" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">＃ニューラルネットワークやディープラーニングモデルの構築やトレーニングに使用されるライブラリ</span></span>
<span class="line"><span style="color: #F8F8F2">pip install tensorflow</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">＃大規模なデータセットを使うときに用いるパッケージ</span></span>
<span class="line"><span style="color: #F8F8F2">pip install h5py</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">＃モデルの構築、トレーニング、評価、デプロイメントなどを簡素化するライブラリ</span></span>
<span class="line"><span style="color: #F8F8F2">pip install keras</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">＃画像やビデオのキャプチャ、変換、フィルタリング、特徴抽出、物体検出、画像の編集などに使う</span></span>
<span class="line"><span style="color: #F8F8F2">pip install opencv</span><span style="color: #F92672">-</span><span style="color: #F8F8F2">python</span></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc6">MNISTを読み込む</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="from keras.datasets import mnist

(X_train, y_train), (X_test, y_test) = mnist.load_data()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.datasets </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> mnist</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">(X_train, y_train), (X_test, y_test) </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> mnist.load_data()</span></span></code></pre></div>



<p><br><strong><span class="bold-green">from keras.datasets import mnist</span></strong>  <br>＃Kerasライブラリの datasets モジュールから mnist データセットをインポートする<br><br><strong><span class="bold-green">(X_train, y_train), (X_test, y_test) = mnist.load_data()</span></strong> <br>＃<code>mnist</code> データセットから<span class="marker-under">訓練用データとテスト用データを読み込む</span><br>＃<ruby><code><strong>load_data()</strong></code></ruby> メソッドは、MNISTデータセットを読み込み、訓練用の画像データとラベル、テスト用の画像データとラベルをそれぞれ返す<br>＃訓練用の画像データは <code>X_train</code> に、訓練用のラベルは <code>y_train</code> に、テスト用の画像データは <code>X_test</code> に、テスト用のラベルは <code>y_test</code> にそれぞれ代入される</p>



<h3 class="wp-block-heading"><span id="toc7">モデルの準備</span></h3>



<p>空のSequentialモデルを作成して、後で層を追加してニューラルネットワークモデルを構築するための準備を整えます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="from keras.models import Sequential

model = Sequential()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span></code></pre></div>



<p><strong><span class="bold-green">from keras.models import Sequential</span></strong><br>＃Kerasライブラリの <code>models</code> モジュールから <code>Sequential</code> クラスをインポートしています。<code><strong>Sequential</strong></code> クラスは、ニューラルネットワークモデルを作成するためのクラスであり、<span class="marker-under">層を直線的に積み重ねて構築されるシンプルなモデル</span>です。<br><br><strong><span class="bold-green">model = Sequential()</span></strong><br>＃<code>Sequential</code> クラスのインスタンスを作成し、<code>model</code> 変数に代入しています。これにより、新しいSequentialモデルが作成されます。このモデルは、層を順番に追加していくことで構築されます。</p>



<table border="0" cellpadding="0" cellspacing="0"><tr><td><div style="border:1px solid #95a5a6;border-radius:.75rem;background-color:#FFFFFF;width:280px;margin:0px;padding:5px;text-align:center;overflow:hidden;"><table><tr><td style="width:128px"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16879483%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;"><img decoding="async" src="https://hbb.afl.rakuten.co.jp/hgb/39414777.169c3d99.39414778.be6498e6/?me_id=1213310&#038;item_id=20463208&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F8080%2F9784065238080_1_3.jpg%3F_ex%3D128x128&#038;s=128x128&#038;t=picttext" border="0" style="margin:2px" alt="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]" title="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]"></a></td><td style="vertical-align:top;width:136px;display: block;"><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px;word-wrap:break-word"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16879483%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">ディープラーニング　学習する機械　ヤン・ルカン、人工知能を語る （KS科学一般書） [ ヤン・ルカン ]</a><br><span >価格：2,750円（税込、送料無料)</span> <span style="color:#BBB">(2024/3/4時点)</span></p></td></tr></table></div><br><p style="color:#000000;font-size:12px;line-height:1.4em;margin:5px;word-wrap:break-word"></p></td></tr></table>



<h3 class="wp-block-heading"><span id="toc8">モデルの構築</span></h3>



<p>3層のニューラルネットワークモデルを構築しています。入力層から隠れ層（<span class="bold-red"><a href="https://ascend-beyond.com/study/808/" target="_blank">ReLU</a></span>）への接続、隠れ層から出力層（<span class="bold-red"><a href="https://ascend-beyond.com/study/808/" target="_blank">Softmax</a></span>）への接続があります。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/808/" title="【AI/座学編】高頻出な活性化関数まとめ" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-160x90.png 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-300x169.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-1024x576.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-768x432.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-120x68.png 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-320x180.png 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5.png 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/座学編】高頻出な活性化関数まとめ</div><div class="blogcard-snippet internal-blogcard-snippet">ここでは、AIを実装する上で使用頻度の高い活性化関数を解説します。また、解説はAscendBeyond式にのっとり、複雑な概念理解には重きを置かず実装に必要な最低限の重要な知識のみを提供しています。座学で時間を浪費していては、AIを作るという本来の目的から離れるばかりですからね。やはり、座学よりも実践に時間を多く費やしてほしいので、座学は軽く頭に入れる程度にしてどんどん実践を積んでください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.22</div></div></div></div></a>
</div></figure>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="from keras.layers import Dense, Activation

model.add(Dense(512, input_dim=(784)))
model.add(Activation(&quot;relu&quot;))

model.add(Dense(10))
model.add(Activation(&quot;softmax&quot;))" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Dense, Activation</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">512</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_dim</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;softmax&quot;</span><span style="color: #F8F8F2">))</span></span></code></pre></div>



<p><strong><span class="bold-green">from keras.layers.core import Dense, Activation </span></strong><br>＃Kerasの <code>layers</code> モジュールから <code>Dense</code> クラスと <code>Activation</code> クラスをインポートしています。<span class="marker-under"><code><strong>Dense</strong></code> クラスは<span class="bold-red">全結合層</span></span>（密な層）を定義するためのクラスであり、<span class="marker-under"><code><strong>Activation</strong></code> クラスは活性化関数を適用</span>するためのクラスです。<br><br><strong><span class="bold-green">model.add(Dense(512, input_dim=(784))) </span></strong><br>＃<code>Dense</code> クラスのインスタンスを作成し、モデルに追加しています。この層は、<span class="bold-red">512個</span>のニューロン（ユニット）を持つ全結合層です。<code><strong>input_dim</strong></code> パラメータは入力の次元を指定しており、<span class="bold-red">784次元</span>の入力を受け取ることを示しています。<br><br><strong><span class="bold-green">model.add(Activation(&#8220;relu&#8221;)) </span></strong><br>＃活性化関数としてReLU（Rectified Linear Unit）関数を適用する層をモデルに追加しています。ReLU関数は、入力が0未満の場合は0を、それ以外の場合は入力をそのまま出力する関数であり、非線形性を導入するためによく使用されます。<br><br><strong><span class="bold-green">model.add(Dense(10)) </span></strong><br>＃2つ目の全結合層を追加しています。この層は10個のニューロンを持ち、出力層として機能します。入力次元は前の層から自動的に推定されるため、<code>input_dim</code> パラメータは省略されています。<br><br><strong><span class="bold-green">model.add(Activation(&#8220;softmax&#8221;))</span></strong><br>＃出力層にSoftmax活性化関数を適用する層を追加しています。Softmax関数は、クラス分類問題で各クラスに対する確率分布を生成するために使用されます。softmax関数によって、モデルの出力が各クラスに対する確率として解釈できるようになります。</p>



<h3 class="wp-block-heading"><span id="toc9">モデルをコンパイル</span></h3>



<p>モデルの損失関数として<strong>カテゴリカルクロスエントロピー</strong>、<span class="bold-red">最適化アルゴリズム</span>として<span class="bold-red">SGD</span>、<span class="bold-red">評価指標</span>として<span class="bold-red">正解率</span>を設定していきます。（これらの設定作業をコンパイルといいます）</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1290/" title="【AI/座学編】AIの損失関数３選！" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790-160x90.png 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790-300x169.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790-1024x576.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790-768x432.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790-120x68.png 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790-320x180.png 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/b7a5f0f10ddd4a6ac841aab616405790.png 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/座学編】AIの損失関数３選！</div><div class="blogcard-snippet internal-blogcard-snippet">機械学習の初心者向けに解説。カテゴリカルクロスエントロピー＆バイナリクロスエントロピー＆平均二乗誤差について解説します。この次は、知識を使って、誰でもできる、実践編（プログラミング）を一緒にやっていきましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.04</div></div></div></div></a>
</div></figure>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="model.compile(loss=&quot;categorical_crossentropy&quot;, optimizer=&quot;sgd&quot;, metrics=[&quot;accuracy&quot;])" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">model.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;categorical_crossentropy&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;sgd&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">metrics</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[</span><span style="color: #E6DB74">&quot;accuracy&quot;</span><span style="color: #F8F8F2">])</span></span></code></pre></div>



<p><strong><span class="bold-green">model.compile(loss=&#8221;categorical_crossentropy&#8221;, optimizer=&#8221;sgd&#8221;, metrics=[&#8220;accuracy&#8221;])</span></strong><br><br>＃<code><strong>model.compile</strong></code>　<br>: モデルをコンパイルするメソッドです。モデルをコンパイルすることで、損失関数や<span class="bold-red">最適化アルゴリズム</span>などの設定が確定されます。<br><br>＃<code><strong>loss="categorical_crossentropy"</strong></code>　<br>: 損失関数を設定しています。この場合、カテゴリカルクロスエントロピー（categorical crossentropy）が損失関数として指定されています。カテゴリカルクロスエントロピーは、<span class="red">多クラス分類問題</span>で使用される一般的な損失関数であり、予測と真のラベルの間の差異を測定します。<br><br>＃<code><strong>optimizer="sgd"</strong></code>　<br>：<span class="bold-red">最適化アルゴリズム</span>を指定しています。この場合、<span class="bold-red">確率的勾配降下法</span>（Stochastic Gradient Descent, SGD）が最適化アルゴリズムとして指定されています。SGDは、勾配を使ってモデルのパラメータを更新し、<span class="marker-under">損失関数を最小化する</span>ことを目指します。<br><br>＃<code><strong>metrics=["accuracy"]</strong></code>　<br>: モデルの<span class="bold-red">評価指標</span>を指定しています。この場合、<span class="bold-red">正解率</span>（accuracy）が指定されています。<span class="marker-under">精度は、モデルが正確に予測した割合</span>を示す指標です。</p>



<h3 class="wp-block-heading"><span id="toc10">MNISTの前処理</span></h3>



<h5 class="wp-block-heading"><span id="toc11">正規化</span></h5>



<p>Kerasでは0.0～1.0までの、float型の配列しか扱いません。また、Dense層が入力として受け取れるのは一次元配列のみです。つまり、MNISTデータセットの画像データ（28&#215;28）を１次元の画像データ、784次元(28&#215;28=784)のベクトルとして表現する必要があります。また、値の範囲を0から1の間に正規化する必要もあります。<br><br>＊画像データの次元数とベクトルの次元数は異なる概念です。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="X_train = X_train.reshape(60000, 784)/255

X_test = X_test.reshape(10000, 784)/255" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train.reshape(</span><span style="color: #AE81FF">60000</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">X_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_test.reshape(</span><span style="color: #AE81FF">10000</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span></code></pre></div>



<p><strong><span class="bold-green">X_train = X_train.reshape(60000, 784)/255 </span></strong><br>＃訓練用の画像データ <code>X_train</code> を再形成しています。元の画像データは28&#215;28ピクセルの2次元配列であり、各ピクセルが0から255の値を取ります（白が0、黒が255）。<br>＃<code><strong>reshape(60000, 784)</strong></code> は、画像データを60000行784列の2次元配列に変形しています。これにより、各画像が28&#215;28=784次元のベクトルとして表現されます。<br>＃また、<code><strong>/255</strong></code> を使って画像のピクセル値を0から1の範囲にスケーリングしています。これは、ニューラルネットワークの入力として扱う際に、値の範囲を正規化するためです。<br><br><span class="bold-green"><strong>X_test = X_test.reshape(10000, 784)/255</strong><br></span>＃テスト用の画像データ <code>X_test</code> も同様に、同じ処理を施しています。テスト用の画像データも同様に784次元のベクトルに変形され、0から1の範囲にスケーリングされます。</p>



<h5 class="wp-block-heading"><span id="toc12">ラベルの修正</span></h5>



<p>Kerasではラベルデータを「バイナリ型」にする必要があります。バイナリ型とはデータを0と１だけで表現することです。つまり、２進数にするということです。つまり、ラベルデータを<span class="bold-red">one-hotエンコーディング形式</span>に変換すればいいのです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="from tensorflow.keras.utils import to_categorical

y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> tensorflow.keras.utils </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> to_categorical</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">y_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_train)</span></span>
<span class="line"><span style="color: #F8F8F2">y_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_test)</span></span>
<span class="line"></span></code></pre></div>



<p><span class="bold-green">from tensorflow.keras.utils import to_categorical<br></span>＃Kerasの <code>utils</code> モジュールから <code>np_utils</code> をインポートしています。<code>np_utils</code> モジュールには、ニューラルネットワークの学習に使用される便利な関数やユーティリティが含まれています。<br><span class="bold-red"><br></span><span class="bold-green">y_train = to_categorical(y_train)<br></span>＃訓練用のラベルデータ <code>y_train</code> をone-hotエンコーディング形式に変換しています。one-hotエンコーディングでは、各ラベルがベクトルの形式で表現され、対応するインデックスの要素が1であり、それ以外の要素が0となります。これにより、分類問題でのラベルの表現をより適切に扱うことができます。<br><span class="bold-red"><br></span><span class="bold-green"><strong>y_test = to_categorical(y_test)</strong><br></span>＃テスト用のラベルデータ <code>y_test</code> も同様に、同じ処理を施しています。すべてのラベルデータがone-hotエンコーディング形式に変換されます。<br><br>（Kerasのバージョン2.4.3以降では、<code>keras.utils</code> モジュールから<span class="marker-under"> <code>np_utils</code> モジュールが削除されました</span>。そのため、最新のKerasバージョンでは <code>np_utils</code> を使うことはできません。代わりに、ここでは<code>keras.utils</code> モジュールから <code>to_categorical</code> 関数を使用することにしています。）</p>



<h3 class="wp-block-heading"><span id="toc13">モデルの訓練</span></h3>



<p>訓練が開始されると、各エポックごとに訓練データと検証データの損失と評価指標が計算され、<code>hist</code> オブジェクトに保存されるようにします。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="hist = model.fit(X_train, y_train, batch_size=200, verbose=1, 
                 epochs=3, validation_split=0.1)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">hist </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.fit(X_train, y_train, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">200</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span></span>
<span class="line"><span style="color: #F8F8F2">                 </span><span style="color: #FD971F; font-style: italic">epochs</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">validation_split</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.1</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p><strong><span class="bold-green">hist = model.fit(X_train, y_train, batch_size=200, verbose=1,<br>epochs=10, validation_split=0.1)</span></strong><br><br>＃<code><strong>hist = model.fit</strong></code>　<br>: モデルの<span class="marker-under">訓練を開始するためのメソッド</span>です。<code>model</code> は訓練するニューラルネットワークモデルを指します<br><br>＃<code><strong>X_train, y_train</strong></code>　<br>: 訓練用の入力データ <code>X_train</code> とそのラベルデータ <code>y_train</code> を指定しています。このデータは<span class="marker-under">モデルの学習に使用</span>されます。<br><br>＃<code><strong>batch_size=200</strong></code>　<br>: ミニバッチのサイズを指定しています。<span class="bold-red">ミニバッチ学習</span>では、全データセットを小さなバッチに分割し、<span class="marker-under">各バッチごとにモデルのパラメータを更新</span>します。<code>batch_size</code> は1回のパラメータ更新に使用するデータのサンプル数を指定します。<br><br>＃<code><strong>verbose=1</strong></code>　<br>: 訓練中にログメッセージを表示するかどうかを制御します。<code>verbose=1</code> の場合、<span class="marker-under">進捗バーが表示</span>されます。表示した方がカッコいいですよ。（笑）<br><br>＃<code><strong>epochs=</strong></code><strong>3</strong>　<br>: エポック数を指定しています。<span class="marker-under">1つのエポックとは、全ての訓練データを1回学習することを指します</span>。<code>epochs</code> パラメータは、モデルが訓練データを何回反復して学習するかを指定します。<br><br>#<code><strong>validation_split=0.1</strong></code>　<br>: <span class="marker-under"><span class="bold-red">検証データ</span>の割合</span>を指定しています。訓練データの一部を検証に使用します。この場合、訓練データの10%が検証に使用されます。訓練中にモデルの性能を監視し、過学習を防ぐために使用されます</p>



<h3 class="wp-block-heading"><span id="toc14">モデルの評価</span></h3>



<p>先ほど訓練したモデルをテストデータを使って評価していきます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="score = model.evaluate(X_test, y_test, verbose=1)
print(&quot;正解率(acc)：&quot;, score[1])" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">score </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.evaluate(X_test, y_test, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;正解率(acc)：&quot;</span><span style="color: #F8F8F2">, score[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">])</span></span></code></pre></div>



<p><span class="bold-green"><strong>score = model.evaluate(X_test, y_test, verbose=1) </strong></span><br>＃<strong><code>evaluate()</code> </strong>　：モデルの性能を評価するためのメソッドです。<strong>evaluatte()</strong>メソッドは、指定されたデータセットで<span class="marker-under">モデルを評価し、損失と評価指標（ここでは正解率）を返し</span>ます。<br>＃引数<strong> <code>X_test</code> </strong>はテストデータの入力、<code><strong>y_test</strong></code> はテストデータの出力（正解ラベル）を表します。<br>＃<code><strong>verbose=1</strong></code> は評価の進捗状況を表示する設定です。<br><br><span class="bold-green"><strong>print(&#8220;正解率(acc)：&#8221;, score[1])</strong><br></span>＃テストデータでの評価結果を出力しています。<code>score[1]</code> は、<code>evaluate</code> メソッドが返す評価指標のうち、正解率（accuracy）に対応する値を取得しています。この値は、モデルがテストデータで<span class="marker-under">正確に予測できた割合</span>を示します。</p>



<h3 class="wp-block-heading"><span id="toc15">学習の実行/中断</span></h3>



<p>では、実行していきましょう。実行方法は人それぞれですが、私の場合はCMDでファイル名を入力することで実行しています。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="#実行
ファイル名.py

#中断する時は
CtrlキーとCキーを同時押ししましょう！" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F">#実行</span></span>
<span class="line"><span style="color: #F8F8F2">ファイル名.py</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#中断する時は</span></span>
<span class="line"><span style="color: #F8F8F2">CtrlキーとCキーを同時押ししましょう！</span></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc16">学習済みモデルの保存</span></h3>



<p>訓練されたニューラルネットワークモデルを&#8221;MNIST.h5&#8243; という名前のファイルに保存しましょう。このファイルを後で読み込むことで、モデルを再利用したり、別のプログラムで使用したりすることができます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="model.save(&quot;MNIST.h5&quot;)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">model.save(</span><span style="color: #E6DB74">&quot;MNIST.h5&quot;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p><strong><span class="bold-green">model.save(&#8220;MNIST.h5&#8221;)<br></span></strong>＃<code><strong>model</strong></code> は保存するKerasモデルを指します。<br>＃<code><strong>.save()</strong></code> メソッドは、指定されたファイル名でモデルを保存します。ここでは、&#8221;MNIST.h5&#8243; という名前のファイルにモデルが保存されます。拡張子 <code>.h5</code> は、HDF5形式で保存されることを示しています。</p>



<h3 class="wp-block-heading"><span id="toc17">保存したモデルを使うには</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#34362e;color:#efefe1">Python</span><span role="button" tabindex="0" data-code="from keras.models import load_model 

model = load_model(&quot;MNIST.h5&quot;)

hist = model.fit(X_train, y_train, batch_size=200, verbose=1, 
                 epochs=3, validation_split=0.1)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> load_model </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> load_model(</span><span style="color: #E6DB74">&quot;MNIST.h5&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">hist </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.fit(X_train, y_train, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">200</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span></span>
<span class="line"><span style="color: #F8F8F2">                 </span><span style="color: #FD971F; font-style: italic">epochs</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">validation_split</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.1</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p><span class="bold-green"><strong>from keras.models import load_model </strong><br></span>＃Kerasの <code>models</code> モジュールから <code>load_model</code> 関数をインポートしています。<span class="marker-under"><code>load_model</code> 関数は、保存されたモデルを読み込むために使用</span>されます。<br><br><span class="bold-green"><strong>model = load_model(&#8220;MNIST.h5&#8221;)</strong><br></span>＃<code>load_model</code> 関数を使って、&#8221;MNIST.h5&#8243; というファイルからモデルを読み込んでいます。読み込まれたモデルは、<code>model</code> 変数に格納されます。<br><br><span class="bold-green">hist = model.fit(X_train, y_train, batch_size=200, verbose=1,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;epochs=3, validation_split=0.1)</span><br>＃<span class="marker-under">続きから学習を再開</span>することができます。<br>＃先ほどのコードと同じなので細かい説明は割愛します。</p>



<h2 class="wp-block-heading"><span id="toc18">まとめ</span></h2>



<p>おわり。お疲れさまでした。でも、意外と想像より簡単だったんじゃないですか？</p>



<p>また、今は100％の理解じゃなくもいいです。こーやって今日みたいに手を動かしていくことを繰り返していけば、必ず上達します。それがAscendBeyond式です。</p>



<p>ということで、これからもどんどん実践を積んでいきましょう！次回は畳み込み層を追加してより、<span class="red">画像処理の性能を向上</span>させていきましょう！</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/851/" title="【AI/実践編】CNNを構築【衝撃簡単②】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/deb454252df1b08099182875a96ef3b0.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】CNNを構築【衝撃簡単②】</div><div class="blogcard-snippet internal-blogcard-snippet">CNNを簡単に構築していきましょう！ＡＩ実装初心者にとても適した内容となっています。AIの概要は学んだけど何から作ればいいんだろう。という悩みをお持ちの方にピッタリです。今回はＣＮＮ（畳み込みニューラルネットワーク）を構築していきます。今日も気楽にやっていきましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.24</div></div></div></div></a>
</div></figure>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/other/855/" title="【AI/実践編】WebカメラとAIを連携【衝撃簡単③】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/cb0bf6a9fecc26c9e640f1e8f7908f5d.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】WebカメラとAIを連携【衝撃簡単③】</div><div class="blogcard-snippet internal-blogcard-snippet">AIの深い原理が分からなくても作れます！今回は、AI素人でも実装可能なWebカメラを使ったニューラルネットワークを構築していきます。リアルタイムで画像を読み込み、それをMNISTデータで判別できるようにしましょう。AI初心者はとりあえず、実践あるのみですからね。机上の空論より、手を動かしていきましょう！それがAsend-Beyond式です！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.25</div></div></div></div></a>
</div><figcaption class="wp-element-caption">次々回</figcaption></figure>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1002/" title="【AI/実践編】生成AI-GANを実装【衝撃簡単④】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/6f716b5f388ff4821d0bf697bea80e40.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実践編】生成AI-GANを実装【衝撃簡単④】</div><div class="blogcard-snippet internal-blogcard-snippet">AIの深い原理が分からなくても作れます！今日はそんなAI技術を実践していきます。GANと呼ばれる画像生成AIを構築していきます。深い原理や、複雑な数学的思考は必要ありません。いまや、AIはパズル間隔でできる技術になっています。原理が分からなくても、実践でどんどん原理なんて補ってやりましょう！</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.27</div></div></div></div></a>
</div></figure>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
