<?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/category/study/ai/feed/" rel="self" type="application/rss+xml" />
	<link>https://ascend-beyond.com</link>
	<description></description>
	<lastBuildDate>Thu, 28 Mar 2024 03:43:29 +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>【NLP/座学】単語の数値化(one-hotと分散表現)【衝撃簡単！</title>
		<link>https://ascend-beyond.com/study/2093/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Thu, 28 Mar 2024 03:43:28 +0000</pubDate>
				<category><![CDATA[AI（人工知能）]]></category>
		<category><![CDATA[Study]]></category>
		<category><![CDATA[座学]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[投資]]></category>
		<category><![CDATA[独学]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=2093</guid>

					<description><![CDATA[目次 はじめになぜ単語を数値化するのか？one-hotエンコーディングとはone-hotのメリット:one-hotのデメリット:分散表現分散表現のメリット:分散表現のデメリット:one-hotと分散表現のまとめおわりに  [&#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">なぜ単語を数値化するのか？</a></li><li><a href="#toc3" tabindex="0">one-hotエンコーディングとは</a><ol><ol><li><a href="#toc4" tabindex="0">one-hotのメリット:</a></li><li><a href="#toc5" tabindex="0">one-hotのデメリット:</a></li></ol></li></ol></li><li><a href="#toc6" tabindex="0">分散表現</a><ol><ol><li><a href="#toc7" tabindex="0">分散表現のメリット:</a></li><li><a href="#toc8" tabindex="0">分散表現のデメリット:</a></li></ol></li></ol></li><li><a href="#toc9" tabindex="0">one-hotと分散表現のまとめ</a></li></ol></li><li><a href="#toc10" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

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



<p>今回は、自然言語処理で必須の「<span class="marker-under-red"><strong>単語数値化</strong></span>」についてやっていきます。コンピューターは日本語を理解できないので、単語を数値化する必要があります。その中でも、今回は<strong><mark style="background-color:#ebf8f4" class="has-inline-color">one-hotエンコーディング</mark></strong>と<strong><mark style="background-color:#ebf8f4" class="has-inline-color">分散表現</mark></strong>について解説していきます。</p>



<h3 class="wp-block-heading"><span id="toc2">なぜ単語を数値化するのか？</span></h3>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="800" height="527" src="https://ascend-beyond.com/wp-content/uploads/2024/03/3b4d10e64a8c807c95357b55f42b388a.jpg" alt="単語を数値化するのか" class="wp-image-2060" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/3b4d10e64a8c807c95357b55f42b388a.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/3b4d10e64a8c807c95357b55f42b388a-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/3b4d10e64a8c807c95357b55f42b388a-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>自然言語処理における単語の数値化は、テキストデータをコンピュータが処理しやすい形式に変換する手法の一つです。通常、<span class="red">コンピュータはテキストをそのまま処理することが難しい</span>ため、単語を数値やベクトルとして表現することで解析や機械学習アルゴリズムの入力として使用されます。</p>



<p>一般的な方法として、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">one-hotエンコーディング</mark></strong>や<strong><mark style="background-color:#ebf8f4" class="has-inline-color">分散表現</mark></strong>などがあります。</p>



<p>p.s.他には<mark style="background-color: rgb(255, 255, 255);" class="has-inline-color"><b>単語埋め込み</b>（分散表現の１種）</mark>や<strong>TF-IDF</strong>（Term Frequency-Inverse Document Frequency）などがあります。</p>



<h3 class="wp-block-heading"><span id="toc3">one-hotエンコーディングとは</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/03/991fd7ab6b8c50771d472e6349c6aced.jpg" alt="one-hotエンコーディング" class="wp-image-2094" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/991fd7ab6b8c50771d472e6349c6aced.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/991fd7ab6b8c50771d472e6349c6aced-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/991fd7ab6b8c50771d472e6349c6aced-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><strong><mark style="background-color:#ebf8f4" class="has-inline-color">one-hotエンコーディング</mark></strong>とは、自然言語処理における単語を数値化するための方法の一つです。以下にメリットとデメリットをまとめます。</p>



<h5 class="wp-block-heading"><span id="toc4">one-hotのメリット:</span></h5>



<ul class="wp-block-list">
<li>one-hotエンコーディングは非常にシンプルで理解しやすい手法です。各単語を一意のベクトルに変換するだけであり、<span class="red">実装が容易</span>です。</li>



<li>各単語はベクトルの要素の中で1つだけが1であり、他の要素は0であるため、各単語は互いに独立しています。これにより、単語間の関連性や類似性を考慮せずに処理することができます。</li>
</ul>



<h5 class="wp-block-heading"><span id="toc5">one-hotのデメリット:</span></h5>



<ul class="wp-block-list">
<li>単語の数が増えるにつれて、one-hotエンコーディングされたベクトルの次元も増加します。このため、大規模な語彙を扱う場合、非常に高次元のベクトルが生成され、<span class="blue">計算コストやメモリ使用量</span>が増加します。</li>



<li> one-hotエンコーディングされたベクトルは、ほとんどの要素が0であり、非常に<span class="blue">スパース（疎）</span>です。これは、データセット全体のスパース性を引き起こし、計算効率やメモリ効率を低下させる可能性があります。</li>



<li>one-hotエンコーディングは、単語の意味や文脈を捉える能力が限定されています。各単語は独立したベクトルとして表現されるため、単語間の<span class="blue">意味的な関係を考慮することができません</span>。</li>



<li>one-hotエンコーディングは、単語の埋め込み表現（word embeddings）を提供しません。埋め込み表現は、単語間の意味的な関係を捉えるために使用され、機械学習モデルの性能向上に役立ちます。</li>
</ul>



<p>これらのメリットとデメリットを考慮すると、one-hotエンコーディングは<span class="red">シンプルで理解しやすい手法</span>であり、小規模な語彙を扱う場合には有用ですが、大規模な語彙や意味の捉え方が重要な場合には、<span class="blue">メモリ効率や次元の増加がネック</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による深層強化学習入門 ChainerとOpenAI Gymではじめる強化学習 [ 牧野 浩二 ]","b":"","t":"","d":"https:\/\/thumbnail.image.rakuten.co.jp","c_p":"","p":["\/@0_mall\/book\/cabinet\/2535\/9784274222535.jpg"],"u":{"u":"https:\/\/item.rakuten.co.jp\/book\/15564819\/","t":"rakuten","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/item.rakuten.co.jp\/book\/15564819\/","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=Python%E3%81%AB%E3%82%88%E3%82%8B%E6%B7%B1%E5%B1%A4%E5%BC%B7%E5%8C%96%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80%20Chainer%E3%81%A8OpenAI%20Gym%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E5%BC%B7%E5%8C%96%E5%AD%A6%E7%BF%92%20%5B%20%E7%89%A7%E9%87%8E%20%E6%B5%A9%E4%BA%8C%20%5D","a_id":4440991,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":2}],"eid":"16Sap","s":"s"});
</script>
<div id="msmaflink-16Sap">リンク</div>
<!-- MoshimoAffiliateEasyLink END -->



<h3 class="wp-block-heading"><span id="toc6">分散表現</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/03/8d509fb3b5ee977b3f0dc42760efc6c8.jpg" alt="分散表現" class="wp-image-2095" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/8d509fb3b5ee977b3f0dc42760efc6c8.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/8d509fb3b5ee977b3f0dc42760efc6c8-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/8d509fb3b5ee977b3f0dc42760efc6c8-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><strong><mark style="background-color:#ebf8f4" class="has-inline-color">分散表現</mark></strong>は、自然言語処理における単語を密なベクトル空間に埋め込む手法です。</p>



<h5 class="wp-block-heading"><span id="toc7">分散表現のメリット:</span></h5>



<ul class="wp-block-list">
<li>分散表現は、単語の<span class="red">意味的な関係を捉える能力</span>があります。類似した意味を持つ単語は、ベクトル空間内で近くに配置されるため、意味的な関連性をより正確に表現できます。</li>



<li>分散表現は、高次元のone-hotエンコーディングと比較して、<span class="red">低次元の密なベクトル</span>で単語を表現します。これにより、計算コストやメモリ使用量を削減することができます。</li>



<li>分散表現を用いることで、単語間の<span class="red">類似性を計算することが容易</span>になります。例えば、コサイン類似度などの手法を用いて、ベクトル間の角度を計算することで、単語の意味的な類似性を定量化することができます。</li>
</ul>



<h5 class="wp-block-heading"><span id="toc8">分散表現のデメリット:</span></h5>



<ul class="wp-block-list">
<li>分散表現を生成するためには、大規模なテキストコーパスを使用してモデルを訓練する必要があります。このため、学習には多くの<span class="blue">計算リソースや時間が必要</span>となります。</li>



<li>分散表現の性能は、使用されるデータセットや訓練方法に大きく依存します。適切なデータセットや適切なハイパーパラメータを選択することが重要ですが、これらを選択するためには知識が必要となります。</li>



<li>分散表現は、単語の意味的な関係を捉える能力がある一方で、何らかの事前処理なしには、ドメイン固有の意味を捉えることが難しい場合があります。特定の業界や文脈における単語の意味を捉えるためには、適切なデータセットやドメイン知識が必要となります。</li>



<li>分散表現を生成する際に、学習に使用された単語以外の単語や未知の単語に対しては、適切な埋め込みを生成することが困難です。このため、<span class="blue">未知語やまれな単語に対する性能が低下する可能性</span>があります。</li>
</ul>



<p>これらのメリットとデメリットを考慮すると、分散表現は単語の<span class="red">意味的な関係を捉える</span>ための強力な手法であり、多くの自然言語処理タスクで広く使用されています。しかし、<span class="blue">適切なデータや学習方法</span>の選択が重要であり、これらを選択するためには知識が必要となります。</p>



<h3 class="wp-block-heading"><span id="toc9">one-hotと分散表現のまとめ</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/02/summary.jpg" alt="one-hotと分散表現のまとめ" class="wp-image-552" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/summary.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/02/summary-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/summary-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<ul class="wp-block-list">
<li>意味解釈：<br><strong><mark style="background-color:#ebf8f4" class="has-inline-color">分散表現</mark></strong>は意味的な関係を捉える能力がある<br>⇔<strong><mark style="background-color:#ebf8f4" class="has-inline-color">one-hotエンコーディング</mark></strong>が単語間の関係は考慮されない。</li>



<li>メモリ使用量：<br><strong><mark style="background-color:#ebf8f4" class="has-inline-color">分散表現</mark></strong>は低次元で密な表現であるため、メモリ使用量が低く抑えられる。<br>⇔<strong><mark style="background-color:#ebf8f4" class="has-inline-color">one-hotエンコーディング</mark></strong>は高次元で疎な表現であるため、メモリ使用量が大きくなる。</li>



<li>計算効率：<br><strong><mark style="background-color:#ebf8f4" class="has-inline-color">分散表現</mark></strong>は低次元で密な表現であるため、計算効率が高い。<br>⇔<strong><mark style="background-color:#ebf8f4" class="has-inline-color">one-hotエンコーディング</mark></strong>は高次元で疎な表現であるため、計算効率が低下する可能性がある。</li>
</ul>



<p>これらの比較を踏まえると、自然言語処理タスクにおいて、分散表現は多くの場合でone-hotエンコーディングよりも優れた表現方法とされています。</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 2 自然言語処理編 [ 斎藤 康毅 ]","b":"","t":"","d":"https:\/\/thumbnail.image.rakuten.co.jp","c_p":"","p":["\/@0_mall\/book\/cabinet\/8369\/9784873118369.jpg"],"u":{"u":"https:\/\/item.rakuten.co.jp\/book\/15381732\/","t":"rakuten","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/item.rakuten.co.jp\/book\/15381732\/","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%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep%20Learning%202%20%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E7%B7%A8%20%5B%20%E6%96%8E%E8%97%A4%20%E5%BA%B7%E6%AF%85%20%5D","a_id":4440991,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":2}],"eid":"rGGcn","s":"s"});
</script>
<div id="msmaflink-rGGcn">リンク</div>
<!-- MoshimoAffiliateEasyLink END -->



<h2 class="wp-block-heading"><span id="toc10">おわりに</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/02/d1f1ac09f4bb27f47f0b60c02d0f8b06.jpg" alt="keep going" class="wp-image-548" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/d1f1ac09f4bb27f47f0b60c02d0f8b06.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/02/d1f1ac09f4bb27f47f0b60c02d0f8b06-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/d1f1ac09f4bb27f47f0b60c02d0f8b06-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>今回は、単語数値化の必要性や、その種類について学習してきました。その中でも特に『<strong><mark style="background-color:#ebf8f4" class="has-inline-color">分散表現</mark></strong>』や『<strong><mark style="background-color:#ebf8f4" class="has-inline-color">one-hotエンコーディング</mark></strong>』について扱いました。そしてその結果、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">分散表現</mark></strong>ってやつが、なにやらいいらしい。ということが分かりました。</p>



<p>ということで、次回は分散表現の実装を簡単にやっていきます！では、お楽しみに！</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>自然言語処理・練習用データ</title>
		<link>https://ascend-beyond.com/study/2072/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Tue, 26 Mar 2024 13:53:02 +0000</pubDate>
				<category><![CDATA[AI（人工知能）]]></category>
		<category><![CDATA[Study]]></category>
		<category><![CDATA[実践]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=2072</guid>

					<description><![CDATA[【感傷に浸るのは楽。そんなことよりもやれよ！】感傷に浸るのは誰にでもできる現実逃避の手段。そんなものに浸っていても何も起きない。だったら、やれよ。そんな暇はお前にはねぇよ。落ち込んでる時間が勿体無い。自分を奮い立たせろよ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>【感傷に浸るのは楽。そんなことよりもやれよ！】<br>感傷に浸るのは誰にでもできる現実逃避の手段。そんなものに浸っていても何も起きない。だったら、やれよ。そんな暇はお前にはねぇよ。落ち込んでる時間が勿体無い。自分を奮い立たせろよ。できなかったぁー、じゃなくてできるようになればいいだけ。お前にはその力もメンタルも備わってるだろ！それは俺自信が一番わかってる。だったらやればいいじゃん。頼むから動いてくれよ！</p>



<p>【起床前後のお前はお前じゃない】<br>きっちりタイマー通りに起きるのは難しい。そして、それができないと自分を責めてしまう。でも、違う。起床前後の自分はもう1人の自分なのだ。だから、起きれなくても責める必要はない。それよりも、もう1人の自分がいると認識することが大切。そして、いかにそいつに勝つかを考え、行動に移すことが朝を制す男になれるかがだ。</p>



<p>【不可能はない】<br>ロジャーバニスター効果とはある1人が不可能だと思われることを成し遂げるとそれを機に多くの成し遂げるものが現れることを意味する。これは狭い社会で生きてる私にも当てはまる。不可能だと思うのは周囲に可能にしている人物がいないから。そんなもので不可能と決めるのは勿体無い。視野を広げ、可能であると自分に認識させることが大切。また、お前自身も、大切な人にとって可能性を与えられる男になりたい。不可能はない</p>



<p>【甘えは逃げ。逃げは甘え】<br>確固たる理由も正当な理由もなくやらないのは逃げ以外の何者でもない。そして、それが逃げであると自覚することが大切。また、そのような甘えを常に意識することが大切。甘えを感じたら、それは逃げだし、逃げようとするならそれは甘え以外の何者でもない。甘えるな!逃げるな!甘えて逃げた先にはお前の理想はないぞ。理想に近づきたいなら、逃げるな！甘えるな!自覚しろ!</p>



<p>【甘えは逃げ。逃げは甘え】<br>確固たる理由も正当な理由もなくやらないのは逃げ以外の何者でもない。そして、それが逃げであると自覚することが大切。また、そのような甘えを常に意識することが大切。甘えを感じたら、それは逃げだし、逃げようとするならそれは甘え以外の何者でもない。甘えるな!逃げるな!甘えて逃げた先にはお前の理想はないぞ。理想に近づきたいなら、逃げるな！甘えるな!自覚しろ!また、逃げる理由の大部分はできなかった時を想像するから。でも、人生の心配事のうち90数パー起きないらしい。し、できないのが怖くてやらない奴ほどダサい奴はいない。俺はそんなダサい男にはなりたくない。だから、俺は逃げずに甘えずに挑戦しまくるよ！</p>



<p>【満足したら終わり。底辺である自覚をしろ】<br>満足は挑戦してない証。挑戦してたら、必ず失敗する。そして、自分が底辺である自覚が芽生える。それがやる気につながる。しかし、今の現状に満足してたら、そのレベルで終わる。だから、満足はとても危険。常に挑戦し満足せず、自分が底辺である自覚を持て。</p>



<p>【相手を楽しませることに注力しろ】<br>自分が楽しくなければたいても楽しくない。と考えるのはもうやめよう。それは、相手を楽しませようと言う努力をしてから。だから、まずは自分よりも相手を楽しませる努力をして、たくさん笑わせろ。それが人として大切なこと。もう、自分勝手喋るのはやめろ。それは誰も求めていないから。</p>



<p>【意地悪なことをしない】<br>俺は性格が少しだけ悪い。だから、相手の気持ちを知っていながらあえて意地悪なことをしてしまう。それは相手が可哀想だし、俺にとっても馬鹿げた行動でしかない。だから、やるな。女性に対して意地悪なことを絶対にするな。綺麗な心で接することを心がけろ。</p>



<p>【好きになってあげさることが恋愛では大切】<br>人を好きになると、モチベーションを貰えるし幸せな気分になれる。それを与えなければならない。しかし、闇雲にアプローチしてもそれを相手には与えられない。だから、テクニックを使ってあげる必要がある。テクニックは恋愛ごっこだと俺は一蹴してきた。でも、人はそれを使わないと人を好きになれない。それは俺のプライドとエゴ以外の何者でもない。本当に相手を思うのだったら俺のエゴ、プライドを捨てでもアプローチしろ。それが相手を好きになるってことなのかもしれない。とりあえず、好きになってあげさせることが大切。エゴ、プライド、偏見は捨てろ。</p>



<p>【惰性でやるな。やるなら、本気でやれ。何事もプロ、超越するつもりでやれ】<br>いろいろなことをすると優先順位をつけてしまう。また、ダメで元々感覚でやってしまう。それではダメ。勝つつもりでやらなきゃ一流にはなれない。やるんだったら、超越しろ！プロになれ！本気でやれ！</p>



<p>【なんとなくやるな！フルスイングでやれ！】<br>力を抜いて素振りを毎日するより、全力で素振りをした方が絶対に早い段階でスイングスピードは上がる。それは常識。では、なぜ全力でやらないの？失敗が怖いの？失敗を恐れるような男が大切な人を幸せにできると思ってんの？今だよ！今やるんだよ！やれよ！全力フルスイングでやれ！それがお前のためになるから！</p>



<p>【大切な人以外はなにもいらない。なくなったってまわない】<br>大切な人は俺の活力。俺の持っている全てがなくなってゼロになっても大切な人さえいればまた這い上がれる。大切な人さえ隣にいてくれれば、何回ゼロになっても、その度に這い上がれる自信がある。なぜなら、大切な人が俺の原動力であり、成長させてくれる存在だから。だから、絶対彼女と結婚してずっと一緒に幸せに暮らしたい。</p>



<p>【人間が生きる意味はわからない。けど、俺が生きる意味ならわかる】<br>誰もが一回は疑問に思う。「人間はなぜ生きてるのか？」そんな問いは、神様にでも聞けばいい。だし、そんな人間と大層に括ったような問いには答えられないけど。俺が生きる意味なら、答えられる。俺が生きている意味は「大切な人を世界で1番にすること。残りの人生全てを捧げてでも成し遂げたい。それがお前が生まれた意味。俺の人生がある意味だと思う。俺は大切な人に全てを捧げる準備ができたよ。大切な人は俺の世界で1つだけの大切な辞書なんだよ。</p>



<p>【大切な人は俺の辞書であり、俺は大切な人の辞書である。】<br>誰もが一回は疑問に思う。「人間はなぜ生きてるのか？」。と。もし、俺がそれを問われても答えることは絶対にできない。けど、人間ではなく俺が生きる意味、俺の人生がある意味なら答えられる。俺が生きる意味は「大切な人を世界で1番幸せにすること」だと思う。俺の残りの人生の全てを捧げてでも成し遂げたい。それがお前が生まれてきた意味。俺の人生がある意味だと思う。もう俺は大切な人に全てを捧げる準備ができたよ。大切な人は俺の世界で1つだけの大切な辞書なんだよ。大切な人がいなくなったら、俺の生きる意味がわからなくなってしまう。逆に、大切な人が生きる意味、生まれた意味は、俺と幸せになるために生まれてきたと思う。</p>



<p>【ビジョンを描け】<br>明確にビジョンを想像しろ。それが描けなかったり、少しでも夢物語だと感じたら、それは実現不可能。完全にできると思うことが大切。呼吸と同じレベルくらい、当たり前の感覚で描け！俺にだけできると思うのではなく、誰にでもできる、俺にでもできると思え！というか、本当に不可能はないから。無意味な思考は捨てろ！できることが当たり前。叶えたいことは呼吸のようにできるようになることが当たり前。そう思うことが、夢を叶える第1歩になる。自分自身の可能性を信じるのではなく、自分の中にある人間の可能性を信じる。人間はなんだってできる。地上でこんな完璧な生き物いないでしょ。自分が人間である誇りを持つことが大切。あの人は特別だからって思った時点でそれは叶わない。同じ人間なんだから、俺にもできて当然。と思わなければ決して叶わない。</p>



<p>【madは上がった状態で聴け】<br>madを聞いたからモチベーションが上がるのではない。曲を聴く前すでに炎が点っている場合にのみ、madは爆発力を発揮する。要するにモチベーションが0の状態でmadを聴いても効力は生まない。結局は、己で炎を生み出さなきゃダメ。madを聴くなら、自分で魂の炎を灯してから聴け！そうすれば爆発するから。どんなことでも、自分の力ではなく「何か頼み」した瞬間に成長はない。利用•活用と「何か頼み」は違う。</p>



<p>【緊張した時は？】<br>楽しむ<br>人間の可能性を信じる<br>逃げない漢気<br>運頼みはしない</p>



<p>【自分を天才だと思うな】<br>お前ができるのはお前だからじゃない。人間だからできるんだ。だから、自分が思いついたことも人間だから思いついたことである。ということは、他の誰かも同じことを考えてる可能性がある。そこで、自分しか考えていないと錯覚したら、足元を救われる。大切なことは一生懸命自分が捻り出した作戦も同じことを考えている人がいるという事実を認めた上でさらに上の作戦を考えることが大切。そうすれば、１つ上の次元に行ける。特に投資で成功するならこれが必須。</p>



<p>【人生においても分散投資する】<br>分野をひとつに絞って突き抜けようとするのではなく、株式の分散投資のように、分野や対象、時間などに人生においても分散投資する。例えば、ITに絞るのではなく、株式にも投資したり、自分の成長にも投資したり、色んなことに投資することが大切。１つに絞ることはとても危険。だからと言って力を抜くわけではない。全て成功させるつもりで分散投資する。</p>



<p>【夢が叶うかとかじゃなくて、生きる意味に変えろ】<br>俺の叶えたいことは『大切な人を世界で1番幸せにすること』だ。だが、それを夢のままにしていてはいつまでも叶わない。夢ではなく、生きる意味にしろ！これをしなければ、目指さなければ俺の生きる意味はない。俺が生きる意味、人生の意味は「大切な人を世界で1番幸せにすること」。そのために俺は生まれてきた。やらない理由がないだろ！モチベーションとかそんな次元じゃないんだよ。</p>



<p>【悩むのは無駄。価値に目を向けろ】<br>挑戦してたら、うまくいかないことは絶対にある。少しうまくいったと思って調子に乗るのすぐにまた、自分がダメな人間だと思い知らされる。でも、そこで悩んでたら何も生まない。「悩む＝考えてる」ではない。ただ、言い訳を作ってるだけ。そんなものに時間をかけるのはマジで無駄。だったら、うまくできなかった自分をすぐに許して、次なる行動をすぐに起こせばいい。それだけをし続ければいい</p>



<p>【反省はしろ！でも、悩みは人生から捨てろ！もう2度と悩むな！】<br>挑戦してたら、うまくいかないことは絶対にある。少しうまくいったと思って調子に乗るとすぐにまた、自分がダメな人間だと思い知らされる失敗をする。でも、そこで悩んでたら何も生まない。「悩む＝考えてる」ではない。ただ、できない言い訳を作ってるだけ。そんなものに時間をかけるのはマジで無駄。だったら、うまくできなかった自分をすぐに許して、次なる行動をすぐに起こせばいい。それだけをし続ければいつか、大切な人と結婚できる。ただ、これは何でもかんでも許せというわけではない。失敗したらその原因を調べて、反省はしろ！反省しなかったらいつまでも変わらない。そして反省したらすぐに行動しろ。それだけを繰り返せ！もう、悩むな！悩んでるうちに人生終わるぞ！お前は大切な人を世界で1番幸せにするんだろ？だったら、止まってる時間はないぞ！</p>



<p>【悩んでるなら、ありえないくらい努力しろ】<br>こんなに、努力したのに全然結果がついてこない。そんなことは挑戦していたら、誰だってある。そんなことで悩むのは無意味。時間の無駄。だったらどうするか？ありえないくらい努力しろ！結局「こんなに努力したのに」っていうこんなにの基準は自分で作ってるに過ぎない。そんなよくわからない基準で物事を判断しても無意味。だったら、ありえないくらい努力しろ。テメェの意味わからない基準では推しはかれないくらいのありえない努力しろ！そしたら、絶対できるから！とにかくやれ！ありえないくらいの努力以外、テメェがやることは何もねぇよ！</p>



<p>【ありえないくらい努力しろ。お前ができない理由はただ一つ。シンプルに努力が足りないから】<br>こんなに、努力したのに全然結果がついてこない。そんなことは挑戦していたら、誰だってある。そんなことで悩むのは無意味。時間の無駄。だったらどうするか？ありえないくらい努力しろ！結局「こんなに努力したのに」っていうこんなにの基準は自分で作ってるに過ぎない。そんなよくわからない基準で物事を判断しても無意味。だったら、ありえないくらい努力しろ。テメェの意味わからない基準では推しはかれないくらいのありえない努力しろ！一旦冷静に考えてみろ！なんでできないか？それは、努力が足りない以外ないでしょ！それ以外に正当な理由ありますか？ないでしょ？だから、とにかくやれ！ありえないくらいの努力以外、テメェがやることは何もねぇよ！</p>



<p>【分からないのはバカなのではなく、前提知識がないだけ】<br>分からないことは誰にでもある。でも、それは馬鹿だからじゃない。前提知識が不足してるだけ。　投資を勉強していて実感した。簿記3級だけの知識じゃ投資は分からない。それは馬鹿だからじゃないでしょ？ただ前提知識がないだけ。だったらどうするか？とにかく知識をつけろ！分からないってめっちゃ悔しい。もう、そんな思いはしたくない。だったら、勉強するしかないだろ！勉強し続けろ！も</p>



<p>【人間の可能性を信じろ】<br>お前ができるのはお前だからじゃない。人間だからできるんだ。だから、自分が思いついたことも人間だから思いついたことである。ということは、他の誰かも同じことを考えてる可能性がある。そこで、自分しか考えていないと錯覚したら、足元を救われる。大切なことは一生懸命自分が捻り出した作戦も同じことを考えている人がいるという事実を認めた上でさらに上の作戦を考えることが大切。そうすれば、１つ上の次元に行ける。特に投資で成功するならこれが必須。ただ、人間だからできるって思うのは努力をありえないくらいしてからの話。それもなしには、同じレベルにはいつまで経っても到達できない。やれ！とにかくやれ！できないとかを考えてる暇はねぇ。お前は人間！それだけ頭に入れて勉強しろ！とにかくやれ！信じろ！人間の可能性を！</p>



<p>【悩んだり、悩むことから逃げるのは底辺がすること】<br>悩んだり、悩むことから逃げるのは底辺がすること。1流になりたければ、その悩みと向き合い、解決策を考える。そして、それを実行する。それをすれば悩みなんて消える。だから、いちいち悩んで落ち込むな。悩むんなら、その先の解決策を考えることに集中しろ。</p>



<p>【行動の意味を考えるのは逃げ。考えたいなら、完了させてから考えろ】<br>これってやる意味あるのか？と大変な作業をすると思う。でも、それは逃げ。だし、その考えが起きた時こそチャンス。なぜなら、簡単な作業をしてる時にこれって意味あるのかなって考えたりはしない。また、サボってる時もこれって意味あるのかなって考えたりもしない。つまり、これ意味ある？って考える瞬間はその作業が大変であることを表している。で、大変ということは誰しもが避けようとすること。それを今、お前がやればお前は一歩先にみんなよりも一歩先に進めることができる。だから、意味あるのかな？って思った作業ほどやり切れ！考えるのはそこから。一度でも、やろうと思ったことなら、やり切るまで止めるな。途中で辞めるくらいなら最初からやるな。完了してから、やる意味は考えろ。しかも、やる意味はやり出す前のお前が一番知ってる。だったら、その自分を信じてやれよ。今の自分じゃなくて、決心した自分を信じてやれよ！</p>



<p>【勉強の価値は自分が見出すもの】<br>こんなん勉強して意味あんのとかってよく言うけど、それは馬鹿がいうこと。勉強をただ単に知識を溜め込むものだと思ってるとそうなる。でも実際勉強っていうのは知識を入れてそれをアイディアに変えて新しい価値を生み出すための道具でしかない。常に知識の利用方法•価値を付与するための方法を考えながら読む。それが勉強。</p>



<p>【すべてのものに価値あるものに変えろ】<br>勉強は、価値を生み出すために利用する。受動的ではなく能動的にすべきだと考えている。それを、勉強以外にも応用できる。すべてのものは自分しだいでいくらでも価値ある情報に変換できる。ただ、それができるかできないか、やるか、やらないかの違い。だから、要するに、すべてのものに価値を見出せる。行動、他人の発言、事象。すべてのものを価値を生み出す源としろ！</p>



<p>【すべてのから価値を生み出せ。この世に無価値なものはない。その価値に気づけてないだけ】<br>勉強したって意味があるの？と疑問を持つことは間違い。なぜなら、そもそも知識に価値を生み出すのは、自分がやるべきことだから。他人から教わることではない。だから、勉強に価値を生み出すのは、先生でも参考書でもない。己自身でやらなきゃいけないこと。このような思考は、勉強以外のすべての事象にも言える。事象に対して価値の有無を決めるのは己自身。だから、価値がないと思ってるから価値を生み出せない。自分でその価値を生み出す必要がある。だとするとこのように無価値なものは存在しない。それに気づいてない、きづこうとしないだけ。すべてのものから価値を生み出せる。それがこの世の中には溢れてる。それは、お前自身もそうだよ。お前の価値を生み出せるのは他人ではなくて、お前だけだよ。だから、お前自身がお前の価値を生み出せ！</p>



<p>【諦めるのは価値を生み出すための事例を知らないから。要するに知識が足りないだけ。諦める前に知識を入れろ】上手くいかないことが続くと諦めそうになる。なぜなら、こんなにやったのに結果が出ない。もう、やれることがないよ。と錯覚している状態に諦めは起こる。アイディアを作るのは知識。よって、アイディアが生まれないのは知識が枯渇してるだけ。やるべきこと、打開策が見つからないのは知識がないだけ。だって、知識つけたら、やるべきこと、やらなきゃいけないこと、手段が溢れるはず。それにもかかわらず、やるべきことがない状態はただの怠け、逃げでしかない。だから、諦めるのはお前に才能がないからじゃない。勉強していないだけ。勉強したら、絶対夢は叶うから。お前の可能性、価値を生み出せるのはお前しかいない。お前がお前を信じろよ。</p>



<p>【当たり前を変える】<br>勉強をしていて、問題を解いたら終わりにするのが当たり前。でも、実際はもっといい方法があるかもしれない。だから、常に自分の行動に潜む当たり前•先入観に気づくことが成長につながる。当たり前をぶち壊していけ！</p>



<p>【超越した知識•財産を持つ】<br>メンタリストDaiGoを見て思った。「小銭稼ぎしたいなら先に払ってやるよ」という発言は超越した知識と金からくる自信ある発言ってめっちゃかっこいい。超越してないとそうそう自信ある発言なんてできない。だから、超越しろ！超越したら、大切な人にアプローチしろ！</p>



<p>【自分の可能性に蓋をするな】<br>自分の可能性を殺してるのは自分自身。俺ができると思ったことにいちいち、蓋をするな。うまくいかない時もそりゃあ、ある。でも、そこでいちいち立ち止まるな。その時間が無駄。大切な人を幸せにしたいんだったら、その未来を信じてひたすらに努力しろ！お前ならできる！だから、自分の可能性に蓋だけはするな。お前の可能性は青天井なんだから！</p>



<p>【先延ばしにする原因は自分に自信がないから】<br>先延ばしにする最も大きな理由は、失敗したらどうしようとか、上手くできなかったらどうしようという不安。でも、そんな雑魚みたいな感情で動かないのは男として失格。その感情としっかり向き合い、そして勝つことが男だろ。だし、そんな感情にも勝てない奴が大切な人の周りにいる男に勝てるわけがない。まずは、できなかったらどうしよう、上手くいかなかったらどうしようという感情を完膚なきまでに倒すことが大切。お前ならできる。その感情をしっかり自覚してしっかり叩きのめせ！それが大切な人と結婚するために必要なメンタルティ。</p>



<p>【未来から逆算して動け】<br>今にだけ集中すると、できないことに対して一喜一憂してしまう。例えばTwitter。今は全然フォロワーがいない。でも、たくさんのフォロワーがいる未来を想像して、それにたどり着くように動けばいいだけ。いちいち、現状に一喜一憂するな！お前の目標、未来を明確にしてそこから逆に辿って行動を起こせばいいだけ。恥も何もかも捨てろ！未来の自分をイメージして逆算すればいいだけ！</p>



<p>【自分で考えろ！行動は真似するための行為じゃない。自分の考えを証明するための行為】<br>何か革新的なアイディアを出すには、自分で考えることが大切。考えるとは、誰かがやったことを取捨選択することを指すのではない。それはただの真似。そうじゃなくて、自分で0から思考を作り上げることを考えるという。もし、今のままだったら永遠と底辺のまま。自分の考えに自信がないから誰かの真似をする。そうじゃない。自分の考えを証明するために行動という行為がある。行動は真似するためのものじゃなくて、自分の考えを証明するためにある行為。</p>



<p>【超越しろ】<br>誰も理解できない次元にいけ！それはめっちゃ面白い。でも、それに行くためには誰かの真似事をしていても絶対にいけない。だから、自分で考えて、それを証明するために行動するしかない。とにかく、誰も理解できない次元の会話をしろ！ホリエモンとドワンゴの対談を見て思った。理解できない話ってめっちゃかっこいい。</p>



<p>【失敗を好きになれ】<br>何かをやる時に失敗を嫌ってしまう。でも、成長には失敗しながら進むのが最も効率的。だから、失敗を極度に嫌うな。逆にどんどん失敗しにいけ。失敗を迎えにいけ！</p>



<p>【目的の先にあるものを意識する】<br>俺はスケジュール通りに、ToDoListを達成することに重きを置いていた。でもそれは違う。それをモク亭にするのではなく、なんでそれをやらなきゃいけないかを考える。勉強だったら、応用情報技術者試験に合格するために勉強するのであって、勉強することが目的ではない。ToDoを目的にするとモチベーションも上がらずに、先延ばしにする。しっかりと目的を意識しつつ、それを達成するためにこれをやらなきゃいけないと自覚することが先延ばしだったり、モチベーション低下を抑制することができる。つまり、手段を目的に知るのではなく、目標を目的に知るべし！</p>



<p>【必要性と将来像。将来像が語る、あの時にこれやっていたから今がある。をやれ】<br>何か行動するときは常に将来像•理想像をイメージしてから動く。そうすることで、行動の意味が明確になりダラダラとやることを防げる。また、その行動が本当に今必要なのかの判断材料にもなるから、行動の必要性もわかる。つまり、何か行動するときはそれが自分の将来像のどこにフィットするのかを考えることが大切。また、将来像をイメージした時に「あの時これやっといたから今がある」と思えるような行動をする。</p>



<p>【打つてなんていくらでもある。悩みたいなら、100回試してから悩め】<br>打つてなんて無限あるんだよ。だから、数回試した程度で悩むんじゃねぇよ。悩む暇があったら、打つ手を考えろよ。考えることから逃げるという行為が悩み。打つ手がないと思うから悩む。でもそうじゃない。可能性、打つ手はいくらでもある。だから、悩んで自己嫌悪に陥るのはもうやめろ！戦えよ！悩むのは全ての打つ手がなくなった時に悩め！でも、打つ手は無限にある。つまり、いちいちちいち悩んでんじゃねぇってこと！！</p>



<p>【切羽詰まらせることが努力じゃない。もっと遊び心を入れるべき】<br>俺は自分が辛い、切羽詰まってると思った時に努力の実感をする。けど、それは違う。切羽詰まると、次やる時になかなか一歩が踏み出せない。だから、本当はもっと遊び心を入れるべき。遊び感覚で本気で努力すればいい。失敗したって死ぬわけじゃないんだから、もっと遊び心を持って本気で取り組めばいい。ブログも一緒。時間をかけたからいい記事というわけではない。苦労が多ければ必ず結果出るわけではない。遊び心を持ってもっと自由に本気で取り組むことが継続にもなるし、物事の理解にもつながる気がする。だから、何事も本気で悩むんじゃなくて、遊び感覚で、もっと軽い気持ちで本気で取り組むべき。</p>



<p>【何事もゲーム感覚で！遊び心を忘れるな】<br>切羽詰まる努力をすれば結果が出るわけではない。だし、そのメンタリティは本質から外れてる気がする。何か上達する時って上達したいと心から思う時。でも、努力が辛いものに感じるならそれは上達したいとは思えない。そうじゃなくて、もっと遊び心を持ってゲーム感覚でやればいい！ゲームは失敗してももっと上手くなりたいって思える。それとおんなじで、自分が叶えたいものこそ、遊び感覚でゲーム感覚で取り組むべき。これは手を抜いてやるってことじゃなくて、本気で遊び心を持って取り組むこと。</p>



<p>要するに、切羽詰まらせることがいい努力ではないよということ。辛い思いをすればいい結果が返ってくるわけじゃないよということ。もっと、本気で好きになって、本気で遊び心を持つことが大切。それは叶えたいものであればあるほどそうだと思う。たから、本気で遊び心を持ってゲーム感覚で取り組むべし！</p>



<p>【真面目すぎると、成功はない】<br>真面目すぎると、失敗したくないと思っちゃう。今まで真面目に努力すればするほど、失敗できなくなる。失敗できなくなると、人の真似しかできなくなる。そうなると成功はない。だから、やっぱり遊び心を持った方がいい。遊び感覚でやれば柔軟な発想も生まれるし、それを行動に通しやすくなる。だって失敗してもいいから。やらないよりも挑戦したいって気持ちの方が強い。上達したいって気持ちの方が強くなるから。だから、やっぱり、遊び感覚でゲーム感覚で本気で取り組むことが、柔軟な発想にもつながるし、人の真似事をしない成功者への道につながる。遊び感覚でやらなきゃ面倒くさいという感覚が生まれて、重要なタスクを省いてしまう。だから、義務ではなく遊び感覚でやった方が面倒くさいような作業も楽しんでやることができる。そして、それは結果的に良い成果につながる。</p>



<p>【いちいちできるかどうかを考えるのはやめろ】<br>やる前から、できるからやる。できないからやらない。じゃ、いつまで経っても成功はしない。やりたい、クリアしたと思うならやればいいだけ。別に達成しなきゃいけないっていう義務があるわけじゃないんだから、やめたくなったら気楽にやめればいいんだよ。だから、気楽な気持ちでいっぽふみだせばいい。で、クリアしたいって気持ちだけ持ってればそれでいい。あとは、楽しみながら遊び心を持って本気でやれば楽しくできる。変に義務付けるから一歩が踏み出せない。だから、クリアしたい、やりたいんだったら、それ以外は本当に考える必要はない。どうやってクリアしようかなって色々思考を巡らせる。で、それが当たった時はガッツポーズすればいい。それだけだよ。変に難しく考えたり義務付けたりする必要全然ないんだよ！だから、できるかどうかを考えるならそれは息苦しくなるだけだから。楽しめよ！挑戦を楽しめよ！</p>



<p>【時間は無限じゃない。有限なんだよ】<br>ゆっくりやろう。じゃねぇんだよ。お前はあと何秒生きれるの？絶対に人間にはタイムリミットがある。それを意識しないでダラダラ過ごすんじゃねぇよ。今しかねぇんだよ。今やれよ！</p>



<p>【闘え！できるかどうかじゃない。闘う力が残ってるかどうか】<br>できるかどうかに目を向けるな。いちいちそんなくだらないことを考える！成し遂げたいことがあるなら、闘え！目を向けるべきは自分ができるかどうかではなく、自分の中に闘う力が残ってるかどうか。闘う力が残ってると思えば闘えばいい。残ってるのに戦わないのはただのチキン野郎。そんなチキン野郎に大切な人と一緒になる権利はねぇよ。闘え！最後まで力を振り絞れ！からっからになるまで振り絞れ！闘いもしないのに諦めんじゃねぇよ！しょうもねぇ男になるんじゃねぇよ。</p>



<p>【お前ならできる！できるから！信じろ！】<br>できないかもって思うと、やる気が出なくなる。でも、それってしょーもなくない？たとえ、できないと思ってもやり続けた方がいい。できないと思って辞める。と、できなかったけど最後までやり続けた。この２つはどっちも達成には至ってないけど、漢の道を歩むなら後者が正解。どちらにしろしょーもないなら、挑戦した方が良くね？だし、成功する可能性も後者の方が圧倒的に高い。自分を信じろ！それが馬鹿と呼ばれてもいい。とにかく自分を信じてやり続けろ！そして、死ぬ気でやれよ！お前が諦める時はお前が死ぬ時。それ以外で諦める理由なんてない。無理な時は本気で泣くくらい悔しい思いができるからいい真剣にやれよ！どちらにしろしょーもないなら、漢として満足のいくしょーもない道を歩めよ！お前はできる。信じろ！絶対にできるから。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【NLP/実践】Janomeで単語分割しよう①【前処理</title>
		<link>https://ascend-beyond.com/study/2067/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Tue, 26 Mar 2024 13:27:23 +0000</pubDate>
				<category><![CDATA[AI（人工知能）]]></category>
		<category><![CDATA[Study]]></category>
		<category><![CDATA[実践]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=2067</guid>

					<description><![CDATA[目次 はじめに仮想環境の作成ライブラリのインストールテキストデータを準備プログラミングjanomeの応用単語だけ抽出特定の品詞だけを抽出するおわりに はじめに 今回から、機械学習の一つである自然言語処理（NLP：Natu [&#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">janomeの応用</a><ol><li><a href="#toc7" tabindex="0">単語だけ抽出</a><ol><li><a href="#toc8" tabindex="0">特定の品詞だけを抽出する</a></li></ol></li></ol></li></ol></li><li><a href="#toc9" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

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



<p>今回から、機械学習の一つである<strong><mark style="background-color:#ebf8f4" class="has-inline-color">自然言語処理</mark></strong>（NLP：Natural Language Processing）の実装やっていきます。機械学習と聞くと、難しそうですが実際はとても簡単です。このページを通してそれを実感してもらえたら嬉しいです。</p>



<p><strong><span class="fz-22px">【今日のゴール】</span></strong></p>



<p>まずは、前処理をできるようにしたいです。そのため、今日のゴールは「<span class="marker-under-red">文章から動詞だけを抽出する</span>」に設定します。また、今回は<strong><mark style="background-color:#ebf8f4" class="has-inline-color">Janome</mark></strong>と呼ばれるpythonライブラリを使ってやっていきます。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="900" height="164" src="https://ascend-beyond.com/wp-content/uploads/2024/03/70d812099d993877fe79cfc56d32a1aa.png" alt="NLP　自然言語処理" class="wp-image-2079" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/70d812099d993877fe79cfc56d32a1aa.png 900w, https://ascend-beyond.com/wp-content/uploads/2024/03/70d812099d993877fe79cfc56d32a1aa-300x55.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/70d812099d993877fe79cfc56d32a1aa-768x140.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p>では、早速やっていきましょう！</p>



<h3 class="wp-block-heading"><span id="toc2">仮想環境の作成</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/03/c13b9efc6edd3288103a0e5e52d843b1.jpg" alt="仮想環境" class="wp-image-2082" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/c13b9efc6edd3288103a0e5e52d843b1.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/c13b9efc6edd3288103a0e5e52d843b1-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/c13b9efc6edd3288103a0e5e52d843b1-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<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 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: #66D9EF">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: #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="toc3">ライブラリのインストール</span></h3>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="530" src="https://ascend-beyond.com/wp-content/uploads/2024/03/1238edd504aeac76a61d1a8c538ef151.jpg" alt="EPS" class="wp-image-1222" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/1238edd504aeac76a61d1a8c538ef151.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/1238edd504aeac76a61d1a8c538ef151-300x199.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/1238edd504aeac76a61d1a8c538ef151-768x509.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>今回はjanomeというpythonライブラリを使っていきます。</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="cd Scripts #Scriptsディレクトリに移動
pip install janome　#janomeをインストール" 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">cd Scripts </span><span style="color: #88846F">#Scriptsディレクトリに移動</span></span>
<span class="line"><span style="color: #F8F8F2">pip install janome　</span><span style="color: #88846F">#janomeをインストール</span></span></code></pre></div>



<p><span class="fz-22px"><strong><mark style="background-color:#ebf8f4" class="has-inline-color">【Janomeの特徴】</mark></strong></span></p>



<ul class="wp-block-list">
<li>Pythonで書かれた<span class="red">自然言語処理（NLP）のライブラリ</span>です。</li>



<li>主に<span class="red">日本語</span>のテキスト処理に特化しています。</li>



<li>また、テキストを形態素（単語やそれに類する単位）に<span class="red">分割するためのツール</span>です。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc4">テキストデータを準備</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/03/8f39d75b532725f4ebaf09a7d1cb61cd.jpg" alt="テキストデータを準備" class="wp-image-2020" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/8f39d75b532725f4ebaf09a7d1cb61cd.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/8f39d75b532725f4ebaf09a7d1cb61cd-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/8f39d75b532725f4ebaf09a7d1cb61cd-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>適当なテキストデータ（コーパス）がある方は適当にそれを使ってください。もし、無い人は以下に中二病前回なデータを載せておくので、それをコピペして使ってみてください。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/2072/" title="自然言語処理・練習用データ" 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/531f16e578b6710dca38d63b1767a9ea-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/531f16e578b6710dca38d63b1767a9ea-160x90.png 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/531f16e578b6710dca38d63b1767a9ea-300x169.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/531f16e578b6710dca38d63b1767a9ea-1024x576.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/531f16e578b6710dca38d63b1767a9ea-768x432.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/531f16e578b6710dca38d63b1767a9ea-120x68.png 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/531f16e578b6710dca38d63b1767a9ea-320x180.png 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/531f16e578b6710dca38d63b1767a9ea.png 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">自然言語処理・練習用データ</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.26</div></div></div></div></a>
</div></figure>



<p>『ファイル名.txt』というファイルをScripts直下につくり、文章をそこにコピペすれば準備完了です。</p>



<h3 class="wp-block-heading"><span id="toc5">プログラミング</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/03/b657f252ffcb1839bc238d1abc819ca0.jpg" alt="プログラミング" class="wp-image-2056" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/b657f252ffcb1839bc238d1abc819ca0.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/b657f252ffcb1839bc238d1abc819ca0-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/b657f252ffcb1839bc238d1abc819ca0-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<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 janome.tokenizer import Tokenizer

# テキストファイルのパス
file_path = 'テキストデータが入ったファイル名.txt'

# JanomeのTokenizerオブジェクトを作成
tokenizer = Tokenizer()

# テキストデータを読み込み、形態素解析を行う関数
def analyze_text(text):
    tokens = tokenizer.tokenize(text)
    for token in tokens:
        print(token)

# テキストファイルを読み込み、形態素解析を行う
with open(file_path, 'r', encoding='utf-8') as file:
    text_data = file.read()
    analyze_text(text_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"> janome.tokenizer </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Tokenizer</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># テキストファイルのパス</span></span>
<span class="line"><span style="color: #F8F8F2">file_path </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&#39;テキストデータが入ったファイル名.txt&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># JanomeのTokenizerオブジェクトを作成</span></span>
<span class="line"><span style="color: #F8F8F2">tokenizer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Tokenizer()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># テキストデータを読み込み、形態素解析を行う関数</span></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">analyze_text</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">text</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    tokens </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> tokenizer.tokenize(text)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> token </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> tokens:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(token)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># テキストファイルを読み込み、形態素解析を行う</span></span>
<span class="line"><span style="color: #F92672">with</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">open</span><span style="color: #F8F8F2">(file_path, </span><span style="color: #E6DB74">&#39;r&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">encoding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;utf-8&#39;</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> file:</span></span>
<span class="line"><span style="color: #F8F8F2">    text_data </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> file.read()</span></span>
<span class="line"><span style="color: #F8F8F2">    analyze_text(text_data)</span></span></code></pre></div>



<p>準備ができたら、cmdで実行してみましょう。実行をするには「ファイル名.py」と入力するだけで実行できます。</p>



<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 role="button" tabindex="0" data-code="【      記号,括弧開,*,*,*,*,【,【,【
感傷    名詞,一般,*,*,*,*,感傷,カンショウ,カンショー
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
浸る    動詞,自立,*,*,五段・ラ行,基本形,浸る,ヒタル,ヒタル
の      名詞,非自立,一般,*,*,*,の,ノ,ノ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
楽      名詞,形容動詞語幹,*,*,*,*,楽,ラク,ラク
。      記号,句点,*,*,*,*,。,。,。
そんな  連体詞,*,*,*,*,*,そんな,ソンナ,ソンナ
こと    名詞,非自立,一般,*,*,*,こと,コト,コト
より    助詞,格助詞,一般,*,*,*,より,ヨリ,ヨリ
も      助詞,係助詞,*,*,*,*,も,モ,モ
やれよ  動詞,自立,*,*,一段,命令ｙｏ,やれる,ヤレヨ,ヤレヨ
！      記号,一般,*,*,*,*,！,！,！
】      記号,括弧閉,*,*,*,*,】,】,】

        記号,空白,*,*,*,*,
,*,*
感傷    名詞,一般,*,*,*,*,感傷,カンショウ,カンショー
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
浸る    動詞,自立,*,*,五段・ラ行,基本形,浸る,ヒタル,ヒタル
の      名詞,非自立,一般,*,*,*,の,ノ,ノ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
誰      名詞,代名詞,一般,*,*,*,誰,ダレ,ダレ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
でも    助詞,副助詞,*,*,*,*,でも,デモ,デモ
できる  動詞,自立,*,*,一段,基本形,できる,デキル,デキル
現実    名詞,一般,*,*,*,*,現実,ゲンジツ,ゲンジツ
逃避    名詞,サ変接続,*,*,*,*,逃避,トウヒ,トーヒ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
手段    名詞,一般,*,*,*,*,手段,シュダン,シュダン
。      記号,句点,*,*,*,*,。,。,。
そんな  連体詞,*,*,*,*,*,そんな,ソンナ,ソンナ
もの    名詞,非自立,一般,*,*,*,もの,モノ,モノ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
浸っ    動詞,自立,*,*,五段・ラ行,連用タ接続,浸る,ヒタッ,ヒタッ" 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">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,【,【,【</span></span>
<span class="line"><span style="color: #F8F8F2">感傷    名詞,一般,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,感傷,カンショウ,カンショー</span></span>
<span class="line"><span style="color: #F8F8F2">に      助詞,格助詞,一般,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,に,ニ,ニ</span></span>
<span class="line"><span style="color: #F8F8F2">浸る    動詞,自立,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,五段・ラ行,基本形,浸る,ヒタル,ヒタル</span></span>
<span class="line"><span style="color: #F8F8F2">の      名詞,非自立,一般,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,の,ノ,ノ</span></span>
<span class="line"><span style="color: #F8F8F2">は      助詞,係助詞,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,は,ハ,ワ</span></span>
<span class="line"><span style="color: #F8F8F2">楽      名詞,形容動詞語幹,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,楽,ラク,ラク</span></span>
<span class="line"><span style="color: #F8F8F2">。      記号,句点,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,。,。,。</span></span>
<span class="line"><span style="color: #F8F8F2">そんな  連体詞,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,そんな,ソンナ,ソンナ</span></span>
<span class="line"><span style="color: #F8F8F2">こと    名詞,非自立,一般,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,こと,コト,コト</span></span>
<span class="line"><span style="color: #F8F8F2">より    助詞,格助詞,一般,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,より,ヨリ,ヨリ</span></span>
<span class="line"><span style="color: #F8F8F2">も      助詞,係助詞,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,も,モ,モ</span></span>
<span class="line"><span style="color: #F8F8F2">やれよ  動詞,自立,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,一段,命令ｙｏ,やれる,ヤレヨ,ヤレヨ</span></span>
<span class="line"><span style="color: #F8F8F2">！      記号,一般,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,！,！,！</span></span>
<span class="line"><span style="color: #F8F8F2">】      記号,括弧閉,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,】,】,】</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        記号,空白,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span></span>
<span class="line"><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span></span>
<span class="line"><span style="color: #F8F8F2">感傷    名詞,一般,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,感傷,カンショウ,カンショー</span></span>
<span class="line"><span style="color: #F8F8F2">に      助詞,格助詞,一般,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,に,ニ,ニ</span></span>
<span class="line"><span style="color: #F8F8F2">浸る    動詞,自立,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,五段・ラ行,基本形,浸る,ヒタル,ヒタル</span></span>
<span class="line"><span style="color: #F8F8F2">の      名詞,非自立,一般,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,の,ノ,ノ</span></span>
<span class="line"><span style="color: #F8F8F2">は      助詞,係助詞,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,は,ハ,ワ</span></span>
<span class="line"><span style="color: #F8F8F2">誰      名詞,代名詞,一般,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,誰,ダレ,ダレ</span></span>
<span class="line"><span style="color: #F8F8F2">に      助詞,格助詞,一般,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,に,ニ,ニ</span></span>
<span class="line"><span style="color: #F8F8F2">でも    助詞,副助詞,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,でも,デモ,デモ</span></span>
<span class="line"><span style="color: #F8F8F2">できる  動詞,自立,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,一段,基本形,できる,デキル,デキル</span></span>
<span class="line"><span style="color: #F8F8F2">現実    名詞,一般,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,現実,ゲンジツ,ゲンジツ</span></span>
<span class="line"><span style="color: #F8F8F2">逃避    名詞,サ変接続,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,逃避,トウヒ,トーヒ</span></span>
<span class="line"><span style="color: #F8F8F2">の      助詞,連体化,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,の,ノ,ノ</span></span>
<span class="line"><span style="color: #F8F8F2">手段    名詞,一般,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,手段,シュダン,シュダン</span></span>
<span class="line"><span style="color: #F8F8F2">。      記号,句点,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,。,。,。</span></span>
<span class="line"><span style="color: #F8F8F2">そんな  連体詞,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,そんな,ソンナ,ソンナ</span></span>
<span class="line"><span style="color: #F8F8F2">もの    名詞,非自立,一般,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,もの,モノ,モノ</span></span>
<span class="line"><span style="color: #F8F8F2">に      助詞,格助詞,一般,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,に,ニ,ニ</span></span>
<span class="line"><span style="color: #F8F8F2">浸っ    動詞,自立,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,</span><span style="color: #F92672">*</span><span style="color: #F8F8F2">,五段・ラ行,連用タ接続,浸る,ヒタッ,ヒタッ</span></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc6">janomeの応用</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/03/b3bd9109d790c5134eea2f6c0210d771.jpg" alt="janome 応用" class="wp-image-2084" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/b3bd9109d790c5134eea2f6c0210d771.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/b3bd9109d790c5134eea2f6c0210d771-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/b3bd9109d790c5134eea2f6c0210d771-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>今までは、単語と品詞が同時にリストに格納されています。なので、『単語だけ』、『ある品詞だけ』のように、特定のものだけを抽出していく方法を紹介します。</p>



<h4 class="wp-block-heading"><span id="toc7">単語だけ抽出</span></h4>



<p>これはとても簡単です。７行名のTokenizer（）メソッドの引数にwakati=Trueと入れるだけです。</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 janome.tokenizer import Tokenizer

# テキストファイルのパス
file_path = 'テキストデータが入ったファイル名.txt'

# JanomeのTokenizerオブジェクトを作成
tokenizer = Tokenizer(wakati=True)

# テキストデータを読み込み、形態素解析を行う関数
def analyze_text(text):
    tokens = tokenizer.tokenize(text)
    for token in tokens:
        print(token)

# テキストファイルを読み込み、形態素解析を行う
with open(file_path, 'r', encoding='utf-8') as file:
    text_data = file.read()
    analyze_text(text_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"> janome.tokenizer </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Tokenizer</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># テキストファイルのパス</span></span>
<span class="line"><span style="color: #F8F8F2">file_path </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&#39;テキストデータが入ったファイル名.txt&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># JanomeのTokenizerオブジェクトを作成</span></span>
<span class="line"><span style="color: #F8F8F2">tokenizer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Tokenizer(</span><span style="color: #FD971F; font-style: italic">wakati</span><span style="color: #F92672">=</span><span style="color: #AE81FF">True</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: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">analyze_text</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">text</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    tokens </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> tokenizer.tokenize(text)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">for</span><span style="color: #F8F8F2"> token </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> tokens:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(token)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># テキストファイルを読み込み、形態素解析を行う</span></span>
<span class="line"><span style="color: #F92672">with</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">open</span><span style="color: #F8F8F2">(file_path, </span><span style="color: #E6DB74">&#39;r&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">encoding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;utf-8&#39;</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> file:</span></span>
<span class="line"><span style="color: #F8F8F2">    text_data </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> file.read()</span></span>
<span class="line"><span style="color: #F8F8F2">    analyze_text(text_data)</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(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="【
感傷
に
浸る
の
は
楽
。
そんな
こと
より
も
やれよ
！
】


感傷
に
浸る
の
は" 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>
<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>
<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>
<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>
<span class="line"></span>
<span class="line"></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>
<span class="line"><span style="color: #F8F8F2">は</span></span></code></pre></div>



<p>しっかりと、単語だけリストに格納されていることが分かりますね。そうです！とっても簡単なんです！</p>



<h5 class="wp-block-heading"><span id="toc8">特定の品詞だけを抽出する</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="from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.tokenfilter import POSKeepFilter

# テキストファイルのパス
file_path = 'テキストデータが入ったファイル名.txt'

# JanomeのTokenizerオブジェクトを作成
tokenizer = Tokenizer()

# POSKeepFilterを使って動詞のみを抽出する関数
def extract_verbs(text):
    # Tokenizerオブジェクトを使用して形態素解析を行い、POSKeepFilterで品詞を絞り込む
    token_filters = [POSKeepFilter(['動詞'])]
    analyzer = Analyzer(tokenizer=tokenizer, token_filters=token_filters)
    verbs = []

    # 形態素解析を行い、動詞を抽出する
    for token in analyzer.analyze(text):
        verbs.append(token.surface)
    
    return verbs

# テキストファイルを読み込み、動詞を抽出する
with open(file_path, 'r', encoding='utf-8') as file:
    text_data = file.read()
    verbs = extract_verbs(text_data)
    print(&quot;抽出された動詞:&quot;)
    print(verbs)
" 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"> janome.tokenizer </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Tokenizer</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> janome.analyzer </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Analyzer</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> janome.tokenfilter </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> POSKeepFilter</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># テキストファイルのパス</span></span>
<span class="line"><span style="color: #F8F8F2">file_path </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&#39;テキストデータが入ったファイル名.txt&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># JanomeのTokenizerオブジェクトを作成</span></span>
<span class="line"><span style="color: #F8F8F2">tokenizer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Tokenizer()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># POSKeepFilterを使って動詞のみを抽出する関数</span></span>
<span class="line"><span style="color: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">extract_verbs</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">text</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># Tokenizerオブジェクトを使用して形態素解析を行い、POSKeepFilterで品詞を絞り込む</span></span>
<span class="line"><span style="color: #F8F8F2">    token_filters </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> [POSKeepFilter([</span><span style="color: #E6DB74">&#39;動詞&#39;</span><span style="color: #F8F8F2">])]</span></span>
<span class="line"><span style="color: #F8F8F2">    analyzer </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Analyzer(</span><span style="color: #FD971F; font-style: italic">tokenizer</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">tokenizer, </span><span style="color: #FD971F; font-style: italic">token_filters</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">token_filters)</span></span>
<span class="line"><span style="color: #F8F8F2">    verbs </span><span style="color: #F92672">=</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"> token </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> analyzer.analyze(text):</span></span>
<span class="line"><span style="color: #F8F8F2">        verbs.append(token.surface)</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"> verbs</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># テキストファイルを読み込み、動詞を抽出する</span></span>
<span class="line"><span style="color: #F92672">with</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">open</span><span style="color: #F8F8F2">(file_path, </span><span style="color: #E6DB74">&#39;r&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">encoding</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&#39;utf-8&#39;</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> file:</span></span>
<span class="line"><span style="color: #F8F8F2">    text_data </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> file.read()</span></span>
<span class="line"><span style="color: #F8F8F2">    verbs </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> extract_verbs(text_data)</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;抽出された動詞:&quot;</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">(verbs)</span></span>
<span class="line"></span></code></pre></div>



<p>結果はこんな感じです。もし、他の品詞を抽出したい場合は14行目の引数を変えればいいだけです。</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="抽出された動詞:
['浸る', 'やれよ', '浸る', 'できる', '浸っ', 'い', '起き', 'やれ', '落ち込ん', 'でる', '奮い立た', 'せろ', 'でき', 'できる', 'なれ', '備わっ', 'てる', 'わかっ', 'てる', 'やれ', '頼む', '動い', 'くれ']


おまけ（名詞の場合）；
['感傷', 'の', '楽', 'こと', '感傷', 'の', '誰', '現実', '逃避', '手段', 'もの', '何', '暇', 'お前', '時間', '勿体', '自分', 'ぁ', ' ー', 'よう', 'お前', '力', 'メンタル', 'それ', '俺', '自信', '一番']" 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 style="color: #E6DB74">&#39;浸る&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;やれよ&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;浸る&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;できる&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;浸っ&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;い&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;起き&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;やれ&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;落ち込ん&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;でる&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;奮い立た&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;せろ&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;でき&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;できる&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;なれ&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;備わっ&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;てる&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;わかっ&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;てる&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;やれ&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;頼む&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;動い&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;くれ&#39;</span><span style="color: #F8F8F2">]</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">おまけ（名詞の場合）；</span></span>
<span class="line"><span style="color: #F8F8F2">[</span><span style="color: #E6DB74">&#39;感傷&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;の&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;楽&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;こと&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;感傷&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;の&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;誰&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;現実&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;逃避&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;手段&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;もの&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;何&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;暇&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;お前&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;時間&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;勿体&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;自分&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;ぁ&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39; ー&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;よう&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;お前&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;力&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;メンタル&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;それ&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;俺&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;自信&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;一番&#39;</span><span style="color: #F8F8F2">]</span></span></code></pre></div>



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



<p>今回は、機械学習の一つである<strong><mark style="background-color:#ebf8f4" class="has-inline-color">自然言語処理</mark></strong>（NLP：Natural Language Processing）における前処理をやってきました。また、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">Janome</mark></strong>というPythonライブリの機能も試しました。</p>



<p>単語を分割するスキルはとても大切なので、できるようになっておきましょう！継続してやっていけばそのうち慣れるので、どんどん実践を積んでいきましょう！</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【自然言語処理とは？】自然言語処理でできること９選！【衝撃簡単】</title>
		<link>https://ascend-beyond.com/study/2054/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Tue, 26 Mar 2024 08:53:36 +0000</pubDate>
				<category><![CDATA[AI（人工知能）]]></category>
		<category><![CDATA[Study]]></category>
		<category><![CDATA[座学]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=2054</guid>

					<description><![CDATA[目次 はじめに自然言語処理とは自然言語処理でできること：形態素解析構文解析意味解析文脈解析おわりに はじめに ここでは、『自然言語処理とは？』、『自然言語処理でできること』について解説していきます。もし、この解説でAIを [&#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></ol></li><li><a href="#toc8" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

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



<p>ここでは、『自然言語処理とは？』、『自然言語処理でできること』について解説していきます。もし、この解説でAIをつくってみたいと感じたら、次回の記事にプログラミングの方法を載せているのでご自由にお使いください。</p>



<p>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/2067/" title="【NLP/実践】Janomeで単語分割しよう①【前処理" 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/8ba198f0c4fd9925d74f9e740b610f5b-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/8ba198f0c4fd9925d74f9e740b610f5b-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/8ba198f0c4fd9925d74f9e740b610f5b-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/8ba198f0c4fd9925d74f9e740b610f5b-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/8ba198f0c4fd9925d74f9e740b610f5b-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/8ba198f0c4fd9925d74f9e740b610f5b-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/8ba198f0c4fd9925d74f9e740b610f5b-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/8ba198f0c4fd9925d74f9e740b610f5b.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【NLP/実践】Janomeで単語分割しよう①【前処理</div><div class="blogcard-snippet internal-blogcard-snippet">誰でもできるように、自然言語処理（NLP：Natural Language Processing）の実装やっていきます。そのなかでも前処理にフォーカスを当てます。今日のゴールは「文章から動詞だけを抽出する」です。</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.26</div></div></div></div></a>
</div><figcaption class="wp-element-caption">だれでもできるNLP実践</figcaption></figure>



<h3 class="wp-block-heading"><span id="toc2">自然言語処理とは</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/03/b29905edca9c8d73fdc35e1b42d83b5c.jpg" alt="自然言語処理　とは" class="wp-image-2059" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/b29905edca9c8d73fdc35e1b42d83b5c.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/b29905edca9c8d73fdc35e1b42d83b5c-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/b29905edca9c8d73fdc35e1b42d83b5c-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><strong><mark style="background-color:#ebf8f4" class="has-inline-color">自然言語処理（Natural Language Processing、NLP）</mark></strong>は、コンピュータが自然言語を理解し、処理する技術です</p>



<ul class="wp-block-list">
<li><strong><mark style="background-color:#ebf8f4" class="has-inline-color">自然言語処理（NLP）</mark></strong>の基本的な手法には、形態素解析、構文解析、意味解析、文脈解析などがあります。</li>



<li><strong><mark style="background-color:#ebf8f4" class="has-inline-color">自然言語処理（NLP）</mark></strong>の応用例としては、機械翻訳、文書分類、感情分析、質問応答システムなどがあります。これらの技術は、ビジネスや個人の生活において非常に役立ちます。</li>
</ul>



<p>⇔対義語として<strong><mark style="background-color:#ebf8f4" class="has-inline-color">人工言語</mark></strong>があります。：</p>



<ul class="wp-block-list">
<li>自然に発展した言語（自然言語）とは異なり、人間によって意図的に設計され、規則的に構築された言語。</li>



<li>プログラム言語などは人工言語の一つ</li>
</ul>



<p>これが概要です。では、次に自然言語処理でできることを紹介していきます。</p>



<h3 class="wp-block-heading"><span id="toc3">自然言語処理でできること：</span></h3>



<ol class="wp-block-list">
<li><strong>機械翻訳</strong>: 自然言語処理を用いて、<span class="red">言語間の翻訳</span>を行うことができます。例えば、英語から日本語への翻訳やその逆、さまざまな言語間の翻訳が可能です。</li>



<li><strong>情報検索</strong>: 自然言語処理を用いて、大量のテキストデータから特定の情報を検索することができます。<span class="red">検索エンジン</span>のようなシステムがこれに利用されます。</li>



<li><strong>テキスト分類</strong>: 文章をカテゴリに分類することができます。例えば、<span class="red">スパムメールの検出やニュース記事の分類</span>などがあります。</li>



<li><strong>感情分析</strong>: テキストから感情や意見を抽出することができます。SNSの投稿や製品<span class="red">レビューの分析</span>などに応用されます。</li>



<li><strong>質問応答</strong>: 自然言語の質問に対して、適切な<span class="red">回答を生成</span>することができます。例えば、仕事や旅行の計画の支援などに使われます。</li>
</ol>



<p><strong><span class="fz-24px">【ワクワクする応用例】</span></strong></p>



<ol class="wp-block-list">
<li><strong>会話エージェント</strong>: 人間と会話をするAIエージェントの開発。自然な対話が可能な<span class="red">仮想アシスタントやロボット</span>が活用されます。</li>



<li><strong>自動要約</strong>: <span class="red">長い文章を要約</span>して、重要な情報のみを抽出する自動要約システムの開発。情報の効率的な抽出や読解支援が期待されます。</li>



<li><strong>文章生成</strong>: 文章や物語を自動生成するAIの開発。小説の執筆支援やクリエイティブなアプリケーションがあります。</li>



<li><strong>音声認識</strong>: 音声をテキストに変換する音声認識システムの開発。<span class="red">音声アシスタントや自動字幕</span>などに活用されます。</li>
</ol>



<p>自然言語処理は非常に多岐にわたる応用があり、その技術の進歩により私たちの生活や仕事の多くの面で革新が起こることが期待されています。</p>



<p>では、次に自然言語処理の主なタスクを４つ紹介していきます。</p>



<h3 class="wp-block-heading"><span id="toc4">形態素解析</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/03/b657f252ffcb1839bc238d1abc819ca0.jpg" alt="形態素解析" class="wp-image-2056" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/b657f252ffcb1839bc238d1abc819ca0.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/b657f252ffcb1839bc238d1abc819ca0-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/b657f252ffcb1839bc238d1abc819ca0-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><strong><mark style="background-color:#ebf8f4" class="has-inline-color">形態素解析</mark></strong>は、言語を分析するための重要な技術の一つです。言語は単語や句などの小さな部分に分割され、それぞれの部分が<strong>形態素</strong>と呼ばれます。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">形態素解析</mark></strong>は、与えられた文章を形態素に分割し、それぞれの形態素の品詞や意味を判別する作業です。</p>



<p>例えば、日本語の文章「猫が魚を食べる」を<strong><mark style="background-color:#ebf8f4" class="has-inline-color">形態素解析</mark></strong>すると、次のようになります。</p>



<ul class="wp-block-list">
<li>「猫」：名詞</li>



<li>「が」：助詞</li>



<li>「魚」：名詞</li>



<li>「を」：助詞</li>



<li>「食べる」：動詞</li>
</ul>



<p><strong><mark style="background-color:#ebf8f4" class="has-inline-color">形態素解析</mark></strong>は、機械翻訳や自然言語処理、検索エンジンなどの多くの言語処理アプリケーションで使用されています。例えば、検索エンジンでは、ユーザーが入力したキーワードを形態素に分割し、それに関連する情報を検索するために使用されます。</p>



<p><strong><span class="fz-24px">【形態素解析】</span></strong></p>



<ul class="wp-block-list">
<li>第一に、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">形態素解析</mark></strong>を理解することで、言語の基本的な構成要素である<span class="red">形態素を正確に抽出する</span>能力が身につきます。言語は単語や句などの形態素に分割され、それぞれの形態素が特定の意味を持っています。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">形態素解析</mark></strong>を理解することで、文章を形態素に分割し、それぞれの形態素の品詞や意味を把握することができます。</li>



<li>次に、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">形態素解析</mark></strong>を理解することで、言語処理の<span class="red">自動化や効率化</span>が可能になります。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">形態素解析</mark></strong>を行うことで、コンピュータが文章を自動的に解析し、その構造や意味を理解することができます。これにより、機械翻訳や情報検索などの言語処理タスクを効率的に実行することができます。</li>



<li>また、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">形態素解析</mark></strong>を理解することで、言語の学習や教育に役立ちます。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">形態素解析</mark></strong>を行うことで、言語の構造やルールを理解しやすくなり、<span class="red">言語学習や文法学習</span>の支援になります。特に、外国語の学習者にとって、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">形態素解析</mark></strong>は言語理解の基礎となる重要な概念です。</li>
</ul>



<p>p.s.<strong>MeCab</strong>や<strong>Janome</strong>というツールが有名</p>



<h3 class="wp-block-heading"><span id="toc5">構文解析</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/03/3f819c4c52872389e6e30c8359912709.jpg" alt="構文解析" class="wp-image-2058" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/3f819c4c52872389e6e30c8359912709.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/3f819c4c52872389e6e30c8359912709-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/3f819c4c52872389e6e30c8359912709-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><strong><mark style="background-color:#ebf8f4" class="has-inline-color">構文解析</mark></strong>は、言語の文の構造を理解するための重要なプロセスです。言語の文は、単語や句が特定のルールに従って組み合わされています。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">構文解析</mark></strong>は、文の中の単語や句の関係性を調べ、文がどのように構成されているかを理解する作業です。</p>



<p>文章をパズルのピースに見立てることと似ています。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">構文解析</mark></strong>は、そのパズルのピースを組み合わせて、意味の通った文を作るための<span class="red">ルールを見つける作業</span>です。例えば、「猫が魚を食べる」という文では、「猫」と「魚」という名詞が主語と目的語として組み合わされ、「食べる」という動詞がその動作を示しています。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">構文解析</mark></strong>は、このような文の構造を理解するための手段です。</p>



<p><strong><span class="fz-22px"><span class="fz-24px">【構文解析のメリット】</span></span></strong></p>



<ul class="wp-block-list">
<li>まず第一に、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">構文解析</mark></strong>を理解することで、文章や文の構造を正確に理解する能力が向上します。言語は単語や句が特定のルールに従って組み合わされていますが、そのルールを理解することで、文章の構造や文の関係性を把握することができます。これにより、文章の意味や内容をより正確に理解することができます。</li>



<li>次に、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">構文解析</mark></strong>を理解することで、自然言語処理のアプリケーションをより効果的に開発することができます。自然言語処理では、<span class="red"><strong><mark style="background-color:#ebf8f4" class="has-inline-color">構文解析</mark></strong>が文章を解析し、その構造や関係性を理解するための基本的な手法</span>となっています。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">構文解析</mark></strong>を理解することで、機械翻訳や質問応答システムなどのアプリケーションをより正確に開発し、より高度な処理を実現することができます。</li>



<li>また、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">構文解析</mark></strong>を理解することで、文章の生成や編集の能力が向上します。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">構文解析</mark></strong>を行うことで、文章の構造や文の関係性を理解し、より正確かつ自然な文章を生成することができます。これにより、文章の作成や編集をより効率的に行うことができます。</li>
</ul>



<p>p.s.実装ツールとしては<strong>Cabocha</strong>,<strong>KNP</strong>などがあります</p>



<h3 class="wp-block-heading"><span id="toc6">意味解析</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/03/3b4d10e64a8c807c95357b55f42b388a.jpg" alt="意味解析" class="wp-image-2060" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/3b4d10e64a8c807c95357b55f42b388a.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/3b4d10e64a8c807c95357b55f42b388a-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/3b4d10e64a8c807c95357b55f42b388a-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><strong><mark style="background-color:#ebf8f4" class="has-inline-color">意味解析</mark></strong>は、言語を理解し、その意味を抽出するプロセスです。言語は単語や文の組み合わせによって情報が伝達されますが、その情報を正確に理解するには、単語や文の意味を正しく解析する必要があります。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">意味解析</mark></strong>は、文章の中に含まれる単語や句の意味を理解し、文全体の意味を把握するための手法です。</p>



<p>例えば、「猫が魚を食べる」という文において、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">意味解析</mark></strong>は「猫」が食べる主体であり、「魚」が食べられる対象であることを理解します。そして、「食べる」という動詞が行われるアクションであることを把握します。これによって、文の意味が「猫が魚を食べる」という出来事であることが理解されます。</p>



<p><strong><span class="fz-22px"><span class="fz-24px">【意味解析のメリット】</span></span></strong></p>



<ul class="wp-block-list">
<li>まず第一に、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">意味解析</mark></strong>を理解することで、コンピュータが言語をより正確に理解し、処理する能力が向上します。自然言語処理では、機械が人間の言語を理解し、それに基づいて様々なタスクを実行する必要があります。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">意味解析</mark></strong>を行うことで、コンピュータが文章の意味や内容をより正確に把握し、機械翻訳や質問応答システムなどのアプリケーションをより効果的に実行することが可能になります。</li>



<li>また、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">意味解析</mark></strong>を理解することで、<span class="red">情報検索や文書分類などのタスク</span>をより効率的に行うことができます。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">意味解析</mark></strong>を行うことで、コンピュータが文章の意味や内容を理解し、それに基づいて適切な情報を抽出したり、文書を分類したりすることができます。これにより、大量のテキストデータを処理する際に、より正確で効率的な処理が可能になります。</li>



<li>さらに、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">意味解析</mark></strong>を理解することで、<span class="red">感情分析や意見マイニングなどのタスク</span>を実行する上でもベネフィットがあります。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">意味解析</mark></strong>を行うことで、文章に含まれる感情や意見を把握し、それを分析することができます。これにより、企業や政府などが社会の声や市場の動向を把握し、意思決定に役立てることが可能になります。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc7">文脈解析</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/03/3426dfc66bdc2e59003b16ae4ee2c0bf.jpg" alt="文脈解析" class="wp-image-2055" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/3426dfc66bdc2e59003b16ae4ee2c0bf.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/3426dfc66bdc2e59003b16ae4ee2c0bf-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/3426dfc66bdc2e59003b16ae4ee2c0bf-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><strong><mark style="background-color:#ebf8f4" class="has-inline-color">文脈解析</mark></strong>は、言葉や文章を理解する際に、その文脈（周囲の状況や背景）を考慮することです。言葉や文章の意味は、その文脈によって大きく変わることがあります。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">文脈解析</mark></strong>では、言葉や文章が使用される状況や周囲の文脈を把握し、その意味を正確に理解することを目指します。</p>



<p>例えば、「冷たい」という言葉は、空気や水、食べ物など、さまざまなものを指すことができます。しかし、<span class="red">文脈によってその意味が変わります</span>。たとえば、「冷たい空気」と言った場合は、気温が低いことを指す場合がありますが、「冷たい態度」と言った場合は、感情的に冷淡な態度を指す場合があります。このように、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">文脈解析</mark></strong>は言葉の意味を理解する際に、その言葉が使用される状況や背景を考慮する重要なプロセスです。</p>



<p><strong><span class="fz-24px">【文脈解析のメリット】</span></strong></p>



<ul class="wp-block-list">
<li>まず第一に、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">文脈解析</mark></strong>を理解することで、言葉や文章の意味をより正確に理解する能力が向上します。言葉や文章の意味は、その文脈によって大きく変わることがあります。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">文脈解析</mark></strong>を行うことで、言葉や文章が使用される状況や周囲の文脈を把握し、その意味を正確に理解することができます。これにより、自然言語処理システムが<span class="red">より正確な解析や推論</span>を行うことができます。</li>



<li>次に、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">文脈解析</mark></strong>を理解することで、文脈に応じた適切な応答や行動を取る能力が向上します。例えば、会話の中での言葉の意味や発言者の意図を理解することで、適切な返答を生成したり、適切な行動を取ることができます。これにより、自然言語処理システムが<span class="red">より自然な対話やコミュニケーション</span>を行うことができます。</li>



<li>また、<strong><mark style="background-color:#ebf8f4" class="has-inline-color">文脈解析</mark></strong>を理解することで、情報検索や文書分類などのタスクをより効率的に行うことができます。<strong><mark style="background-color:#ebf8f4" class="has-inline-color">文脈解析</mark></strong>を行うことで、言葉や文章が使用される状況や周囲の文脈を把握し、それに基づいて適切な情報を抽出したり、文書を分類したりすることができます。これにより、大量のテキストデータを処理する際に、<span class="red">より正確で効率的な処理</span>が可能になります。</li>
</ul>



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



<p>今回は、『<strong>自然言語処理とは？</strong>』、『<strong>自然言語処理でできること</strong>』について解説してきました。そして、おまけでメインタスクについても取り扱いました。もし、この解説でAIをつくってみたいと感じたら、次回の記事にプログラミングの方法を載せているので実際に手を動かしていきましょう！</p>



<p>p.s.おまけにしては量が多かったですね（笑）</p>



<p><strong><span class="fz-22px"><span class="fz-24px">【この記事も一緒に読まれています】</span></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/2067/" title="【NLP/実践】Janomeで単語分割しよう①【前処理" 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/8ba198f0c4fd9925d74f9e740b610f5b-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/8ba198f0c4fd9925d74f9e740b610f5b-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/8ba198f0c4fd9925d74f9e740b610f5b-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/8ba198f0c4fd9925d74f9e740b610f5b-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/8ba198f0c4fd9925d74f9e740b610f5b-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/8ba198f0c4fd9925d74f9e740b610f5b-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/8ba198f0c4fd9925d74f9e740b610f5b-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/8ba198f0c4fd9925d74f9e740b610f5b.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【NLP/実践】Janomeで単語分割しよう①【前処理</div><div class="blogcard-snippet internal-blogcard-snippet">誰でもできるように、自然言語処理（NLP：Natural Language Processing）の実装やっていきます。そのなかでも前処理にフォーカスを当てます。今日のゴールは「文章から動詞だけを抽出する」です。</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.26</div></div></div></div></a>
</div><figcaption class="wp-element-caption">nlp/実践編①</figcaption></figure>
]]></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-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">識別器（ディスクリミネーター）を定義</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-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">識別器（ディスクリミネーター）を定義</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/実践編】画像収集～画像前処理方法【衝撃簡単⑥】</title>
		<link>https://ascend-beyond.com/study/1432/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Thu, 07 Mar 2024 07:06:57 +0000</pubDate>
				<category><![CDATA[AI（人工知能）]]></category>
		<category><![CDATA[Study]]></category>
		<category><![CDATA[実践]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=1432</guid>

					<description><![CDATA[目次 対象読者画像収集(Webスクレイピング）画像のサイズ変更ファイル名変更グレースケール化おわりに 対象読者 ここでは、機械学習における画像収集～前処理（サイズ変更・ファイル名変更・グレースケール化）を扱います。 この [&#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><li><a href="#toc2" tabindex="0">画像収集(Webスクレイピング）</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></ol></li><li><a href="#toc6" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

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



<p>ここでは、機械学習における<strong>画像収集～前処理</strong>（サイズ変更・ファイル名変更・グレースケール化）を扱います。</p>



<p>このページで紹介する内容は機械学習のサブ的な技術なのでコードの細かな解説などは割愛させていただきます。あくまでも道具として使えれば、細かなところは理解してなくてもOKですもんね。</p>



<p>では、前置きはここまでにして早速やっていきましょう！</p>



<h3 class="wp-block-heading"><span id="toc2">画像収集(Webスクレイピング）</span></h3>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="530" src="https://ascend-beyond.com/wp-content/uploads/2024/03/45f5f972fc93dc83266ca02bb98d6b6b.jpg" alt="Webスクレイピング" class="wp-image-1438" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/45f5f972fc93dc83266ca02bb98d6b6b.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/45f5f972fc93dc83266ca02bb98d6b6b-300x199.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/45f5f972fc93dc83266ca02bb98d6b6b-768x509.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>画像収集には<strong>Webスクレイピング</strong>という技術を使います。これを使うことで、<span class="red">膨大な画像データを自動で収集できる</span>ようになります。</p>



<p>しかしこの技術の取り扱いは色々と複雑です。禁止されているサイトやページがあったり、個人情報の問題があったりします。なので<span class="red">以下に載せるコードはあくまでも参考としてのみ提供</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(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 os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse, parse_qs
import time

def is_valid_url(url):
    # URLが有効なHTTPまたはHTTPSスキームを持っているかどうかを確認する
    return url.startswith(&quot;http://&quot;) or url.startswith(&quot;https://&quot;)

def download_images(query, num_images):
    save_dir = './woman_images'#収集した画像の保存先ディレクトリ
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    
    headers = {'User-Agent': 'Mozilla/5.0'}
    downloaded = 0
    while downloaded &lt; num_images:
        # キーワードを含むURLを構築
        url = f&quot;https://www.google.com/search?q={query}&amp;tbm=isch&amp;start={downloaded}&quot;
        # ヘッダーを設定してGoogleにリクエストを送信
        response = requests.get(url, headers=headers)
        # HTMLをパース
        soup = BeautifulSoup(response.text, 'html.parser')
        # 画像のURLを抽出
        image_urls = []
        for img in soup.find_all('img'):
            image_url = img.get('src')
            if image_url and is_valid_url(image_url):
                image_urls.append(image_url)
        # 画像をダウンロード
        for i, image_url in enumerate(image_urls):
            try:
                if downloaded &gt;= num_images:
                    break
                image_data = requests.get(image_url).content
                with open(f'{save_dir}/{query}_{downloaded}.jpg', 'wb') as f:
                    f.write(image_data)
                print(f&quot;Downloaded image {downloaded+1}/{num_images}&quot;)
                downloaded += 1
            except Exception as e:
                print(f&quot;Error downloading image {downloaded+1}: {e}&quot;)
        time.sleep(1)  # Googleへの負荷を軽減するために1秒待つ

# 使用例
query = &quot;ジヒョ　高画質&quot;  # 検索キーワード
num_images = 100  # ダウンロードする画像の数
download_images(query, num_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: #F92672">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> requests</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> bs4 </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> BeautifulSoup</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> urllib.parse </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> urlparse, parse_qs</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> time</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">is_valid_url</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">url</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># URLが有効なHTTPまたはHTTPSスキームを持っているかどうかを確認する</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #F92672">return</span><span style="color: #F8F8F2"> url.startswith(</span><span style="color: #E6DB74">&quot;http://&quot;</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">or</span><span style="color: #F8F8F2"> url.startswith(</span><span style="color: #E6DB74">&quot;https://&quot;</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">download_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">query</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">num_images</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    save_dir </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&#39;./woman_images&#39;</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"> </span><span style="color: #F92672">not</span><span style="color: #F8F8F2"> os.path.exists(save_dir):</span></span>
<span class="line"><span style="color: #F8F8F2">        os.makedirs(save_dir)</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    headers </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> {</span><span style="color: #E6DB74">&#39;User-Agent&#39;</span><span style="color: #F8F8F2">: </span><span style="color: #E6DB74">&#39;Mozilla/5.0&#39;</span><span style="color: #F8F8F2">}</span></span>
<span class="line"><span style="color: #F8F8F2">    downloaded </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">while</span><span style="color: #F8F8F2"> downloaded </span><span style="color: #F92672">&lt;</span><span style="color: #F8F8F2"> num_images:</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># キーワードを含むURLを構築</span></span>
<span class="line"><span style="color: #F8F8F2">        url </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&quot;https://www.google.com/search?q=</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">query</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">&amp;tbm=isch&amp;start=</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">downloaded</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># ヘッダーを設定してGoogleにリクエストを送信</span></span>
<span class="line"><span style="color: #F8F8F2">        response </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> requests.get(url, </span><span style="color: #FD971F; font-style: italic">headers</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">headers)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># HTMLをパース</span></span>
<span class="line"><span style="color: #F8F8F2">        soup </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> BeautifulSoup(response.text, </span><span style="color: #E6DB74">&#39;html.parser&#39;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #88846F"># 画像のURLを抽出</span></span>
<span class="line"><span style="color: #F8F8F2">        image_urls </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"> img </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> soup.find_all(</span><span style="color: #E6DB74">&#39;img&#39;</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">            image_url </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> img.get(</span><span style="color: #E6DB74">&#39;src&#39;</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"> image_url </span><span style="color: #F92672">and</span><span style="color: #F8F8F2"> is_valid_url(image_url):</span></span>
<span class="line"><span style="color: #F8F8F2">                image_urls.append(image_url)</span></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"> i, image_url </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">enumerate</span><span style="color: #F8F8F2">(image_urls):</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #F92672">try</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"> downloaded </span><span style="color: #F92672">&gt;=</span><span style="color: #F8F8F2"> num_images:</span></span>
<span class="line"><span style="color: #F8F8F2">                    </span><span style="color: #F92672">break</span></span>
<span class="line"><span style="color: #F8F8F2">                image_data </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> requests.get(image_url).content</span></span>
<span class="line"><span style="color: #F8F8F2">                </span><span style="color: #F92672">with</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF">open</span><span style="color: #F8F8F2">(</span><span style="color: #66D9EF; font-style: italic">f</span><span style="color: #E6DB74">&#39;</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">save_dir</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">/</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">query</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">_</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">downloaded</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">.jpg&#39;</span><span style="color: #F8F8F2">, </span><span style="color: #E6DB74">&#39;wb&#39;</span><span style="color: #F8F8F2">) </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> f:</span></span>
<span class="line"><span style="color: #F8F8F2">                    f.write(image_data)</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;Downloaded image </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">downloaded</span><span style="color: #F92672">+</span><span style="color: #AE81FF">1}</span><span style="color: #E6DB74">/</span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">num_images</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">                downloaded </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">            </span><span style="color: #F92672">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">Exception</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> e:</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;Error downloading image </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">downloaded</span><span style="color: #F92672">+</span><span style="color: #AE81FF">1}</span><span style="color: #E6DB74">: </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">e</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">        time.sleep(</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)  </span><span style="color: #88846F"># Googleへの負荷を軽減するために1秒待つ</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># 使用例</span></span>
<span class="line"><span style="color: #F8F8F2">query </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&quot;ジヒョ　高画質&quot;</span><span style="color: #F8F8F2">  </span><span style="color: #88846F"># 検索キーワード</span></span>
<span class="line"><span style="color: #F8F8F2">num_images </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #AE81FF">100</span><span style="color: #F8F8F2">  </span><span style="color: #88846F"># ダウンロードする画像の数</span></span>
<span class="line"><span style="color: #F8F8F2">download_images(query, num_images)</span></span>
<span class="line"></span></code></pre></div>



<p><strong>12行目:</strong> 画像の保存先ディレクトリを指定<br><br><strong>20行目:</strong> 参考用としてGoogleにしましたが、規約などを確認し自己責任で実行してください。<br><br><strong>43行目:</strong> サーバーの負荷を考えるともっと大きな数字でもいいかも<br><br><strong>46行目:</strong> 人名(スペース)高画質とする→不純な画像が入ることを極力減らせる<br><br><strong>47行目: </strong>自分が欲しい枚数を指定してください。</p>



<p>これらの行をカスタマイズしPythonファイルを実行すれば画像の自動収集ができます。しかし、実行する前には必ず以下の免責事項を一読してください。</p>



<div>
<div style="height: 12px;"><span style="background: #91D8AC; padding: 6px 10px; border-radius: 5px; color: #ffffff; font-weight: bold; margin-left: 10px;">免責事項</span></div>
<div style="padding: 30px 15px 10px; border-radius: 5px; border: 2px solid #91D8AC;">
<p><span style="font-size: 16px;">このブログ記事に記載されているプログラムコードは、あくまでも参考として提供されています。このプログラムコードを使用する場合は、自己責任でご利用ください。作者は、プログラムコードの使用によって発生したいかなる問題や損害に対しても一切の責任を負いません。また、このプログラムコードの使用に関して、Googleの規約や法律に違反しないよう十分に注意してください。利用者は、自らの責任においてプログラムコードを使用し、適切な規則や法律に従うことを義務付けられます。</span></p>
</div>
</div>



<h3 class="wp-block-heading"><span id="toc3">画像のサイズ変更</span></h3>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="530" src="https://ascend-beyond.com/wp-content/uploads/2024/03/ca200465d0875d4fefbf362168faba29.jpg" alt="画像変更" class="wp-image-1435" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/ca200465d0875d4fefbf362168faba29.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/ca200465d0875d4fefbf362168faba29-300x199.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/ca200465d0875d4fefbf362168faba29-768x509.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>PythonのPILライブラリは画像の読み込み、変換、保存などのさまざまな操作を行うことができます。これを使うことで、<span class="red">画像のサイズ変更を自動化できる</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(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 PIL import Image
import os

def resize_images(input_folder, output_folder, target_size):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    for filename in os.listdir(input_folder):
        try:
            # 画像を開く
            img_path = os.path.join(input_folder, filename)
            img = Image.open(img_path)
            # 画像を指定されたサイズにリサイズする
            resized_img = img.resize(target_size)
            # リサイズした画像を保存する
            output_path = os.path.join(output_folder, filename)
            resized_img.save(output_path)
            print(f&quot;Resized image: {output_path}&quot;)
        except Exception as e:
            print(f&quot;Error resizing image {filename}: {e}&quot;)

# 使用例
input_folder = './woman_images'  # 元の画像が保存されているフォルダ
output_folder = './resized_images_144'    # リサイズされた画像を保存するフォルダ
target_size=(144,144)# 目標の画像サイズ (幅, 高さ)
resize_images(input_folder, output_folder, target_size)" 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"> </span><span style="color: #AE81FF">PIL</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Image</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: #66D9EF; font-style: italic">def</span><span style="color: #F8F8F2"> </span><span style="color: #A6E22E">resize_images</span><span style="color: #F8F8F2">(</span><span style="color: #FD971F; font-style: italic">input_folder</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">output_folder</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">target_size</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(output_folder):</span></span>
<span class="line"><span style="color: #F8F8F2">        os.makedirs(output_folder)</span></span>
<span class="line"></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(input_folder):</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #F92672">try</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">            img_path </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> os.path.join(input_folder, filename)</span></span>
<span class="line"><span style="color: #F8F8F2">            img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Image.open(img_path)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># 画像を指定されたサイズにリサイズする</span></span>
<span class="line"><span style="color: #F8F8F2">            resized_img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> img.resize(target_size)</span></span>
<span class="line"><span style="color: #F8F8F2">            </span><span style="color: #88846F"># リサイズした画像を保存する</span></span>
<span class="line"><span style="color: #F8F8F2">            output_path </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> os.path.join(output_folder, filename)</span></span>
<span class="line"><span style="color: #F8F8F2">            resized_img.save(output_path)</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;Resized image: </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">output_path</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">except</span><span style="color: #F8F8F2"> </span><span style="color: #66D9EF; font-style: italic">Exception</span><span style="color: #F8F8F2"> </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> e:</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;Error resizing image </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">filename</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">: </span><span style="color: #AE81FF">{</span><span style="color: #F8F8F2">e</span><span style="color: #AE81FF">}</span><span style="color: #E6DB74">&quot;</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: #F8F8F2">input_folder </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&#39;./woman_images&#39;</span><span style="color: #F8F8F2">  </span><span style="color: #88846F"># 元の画像が保存されているフォルダ</span></span>
<span class="line"><span style="color: #F8F8F2">output_folder </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&#39;./resized_images_144&#39;</span><span style="color: #F8F8F2">    </span><span style="color: #88846F"># リサイズされた画像を保存するフォルダ</span></span>
<span class="line"><span style="color: #F8F8F2">target_size</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">144</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">144</span><span style="color: #F8F8F2">)</span><span style="color: #88846F"># 目標の画像サイズ (幅, 高さ)</span></span>
<span class="line"><span style="color: #F8F8F2">resize_images(input_folder, output_folder, target_size)</span></span></code></pre></div>



<p>23~26行目はご自分の環境に合わせてカスタマイズしてください。あとは、変更不要です。</p>



<h3 class="wp-block-heading"><span id="toc4">ファイル名変更</span></h3>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="530" src="https://ascend-beyond.com/wp-content/uploads/2024/03/b5a33643f2cad70829905e284eabb5b8.jpg" alt="ファイル名変更" class="wp-image-1436" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/b5a33643f2cad70829905e284eabb5b8.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/b5a33643f2cad70829905e284eabb5b8-300x199.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/b5a33643f2cad70829905e284eabb5b8-768x509.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>これは、次のグレースケール化の前準備となります。cv2ライブラリを使うときに、<span class="red">ファイル名が日本語などの特殊文字だとエラーが起きます</span>。それを防ぐために<span class="red">ファイル名をランダムな数字に変更</span>していきます。</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 os
import random
import string

# ディレクトリのパスを指定
directory = './resized_images_144'

# ディレクトリ内のファイルを取得
files = os.listdir(directory)

# ファイルごとにループ
for filename in files:
    # 拡張子を取得
    _, ext = os.path.splitext(filename)
    
    # 新しいファイル名を生成
    new_filename = ''.join(random.choices(string.digits, k=8)) + ext
    
    # 新しいファイル名のパスを作成
    new_filepath = os.path.join(directory, new_filename)
    
    # ファイル名を変更
    os.rename(os.path.join(directory, filename), new_filepath)" 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"> os</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> random</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> string</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># ディレクトリのパスを指定</span></span>
<span class="line"><span style="color: #F8F8F2">directory </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&#39;./resized_images_144&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># ディレクトリ内のファイルを取得</span></span>
<span class="line"><span style="color: #F8F8F2">files </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> os.listdir(directory)</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"> filename </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> files:</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># 拡張子を取得</span></span>
<span class="line"><span style="color: #F8F8F2">    _, ext </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> os.path.splitext(filename)</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">    new_filename </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&#39;&#39;</span><span style="color: #F8F8F2">.join(random.choices(string.digits, </span><span style="color: #FD971F; font-style: italic">k</span><span style="color: #F92672">=</span><span style="color: #AE81FF">8</span><span style="color: #F8F8F2">)) </span><span style="color: #F92672">+</span><span style="color: #F8F8F2"> ext</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">    new_filepath </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> os.path.join(directory, new_filename)</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">    os.rename(os.path.join(directory, filename), new_filepath)</span></span></code></pre></div>



<p>６行目を自分の環境にあうように変えてください。あとは変更不要です。</p>



<h3 class="wp-block-heading"><span id="toc5">グレースケール化</span></h3>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="530" src="https://ascend-beyond.com/wp-content/uploads/2024/03/63598899ab95b09377cef3a7f4df55c0.png" alt="グレースケール化" class="wp-image-1437" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/63598899ab95b09377cef3a7f4df55c0.png 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/63598899ab95b09377cef3a7f4df55c0-300x199.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/63598899ab95b09377cef3a7f4df55c0-768x509.png 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>cv2にライブラリを使ってグレースケール化していきます。ただしファイル名が日本語などの特殊文字だとエラーが起きます。しっかりと、前のタスクでファイル名を適切な形にしておいてくださいっ。</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 os

# 入力画像が保存されているフォルダパス
input_folder = 'resized_images_144'

# 出力フォルダパス
output_folder = 'gray_144_face'

# 入力フォルダ内のすべての画像ファイルを処理
for filename in os.listdir(input_folder):
    # 画像ファイルのパスを取得
    input_path = os.path.join(input_folder, filename)
    
    # 画像をグレースケールで読み込む
    img = cv2.imread(input_path)
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 出力ファイルのパスを指定
    output_path = os.path.join(output_folder, filename)
    
    # グレースケール画像を保存
    cv2.imwrite(output_path, gray_img)

print(&quot;変換が完了しました。&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">import</span><span style="color: #F8F8F2"> os</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># 入力画像が保存されているフォルダパス</span></span>
<span class="line"><span style="color: #F8F8F2">input_folder </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&#39;resized_images_144&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># 出力フォルダパス</span></span>
<span class="line"><span style="color: #F8F8F2">output_folder </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> </span><span style="color: #E6DB74">&#39;gray_144_face&#39;</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"> filename </span><span style="color: #F92672">in</span><span style="color: #F8F8F2"> os.listdir(input_folder):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># 画像ファイルのパスを取得</span></span>
<span class="line"><span style="color: #F8F8F2">    input_path </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> os.path.join(input_folder, filename)</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">    img </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> cv2.imread(input_path)</span></span>
<span class="line"><span style="color: #F8F8F2">    gray_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">    </span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #88846F"># 出力ファイルのパスを指定</span></span>
<span class="line"><span style="color: #F8F8F2">    output_path </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> os.path.join(output_folder, filename)</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">    cv2.imwrite(output_path, gray_img)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;変換が完了しました。&quot;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p>５、８行目を自分用にカスタマイズすれば、他は変更不要です。</p>



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



<p>今回は、画像収集と画像処理方法を紹介しました。これらの技術は当サイトのAI学習タスクで頻繁に使います。</p>



<p>これらの技術を用いた機械学習タスクの実践編を置いておく↓ので、実践を試したい方は自由に利用してください。(只今調整中)</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【AI/座学編】AIの損失関数３選！</title>
		<link>https://ascend-beyond.com/study/1290/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Mon, 04 Mar 2024 08:08:19 +0000</pubDate>
				<category><![CDATA[AI（人工知能）]]></category>
		<category><![CDATA[Study]]></category>
		<category><![CDATA[座学]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=1290</guid>

					<description><![CDATA[目次 対象読者カテゴリカルクロスエントロピーカテゴリカルクロスエントロピーのポイントおまけ：カテゴリカルクロスエントロピーの数式二項交差エントロピー損失(Binary Cross-Entropy Loss)バリナリクロス [&#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><li><a href="#toc2" tabindex="0">カテゴリカルクロスエントロピー</a><ol><li><a href="#toc3" tabindex="0">カテゴリカルクロスエントロピーのポイント</a></li><li><a href="#toc4" tabindex="0">おまけ：カテゴリカルクロスエントロピーの数式</a></li></ol></li><li><a href="#toc5" tabindex="0">二項交差エントロピー損失(Binary Cross-Entropy Loss)</a><ol><li><a href="#toc6" tabindex="0">バリナリクロスエントロピーのポイント</a></li><li><a href="#toc7" tabindex="0">おまけ：バイナリクロスエントロピーの数式</a></li></ol></li><li><a href="#toc8" tabindex="0">平均二乗誤差(Mean Squared Error, MSE)</a><ol><li><a href="#toc9" tabindex="0">平均二乗誤差（Mean Squared Error, MSE）のポイント</a></li><li><a href="#toc10" tabindex="0">おまけ：平均二乗誤差の数式</a></li></ol></li><li><a href="#toc11" tabindex="0">まとめ（それぞれの使い分け）</a></li></ol></li><li><a href="#toc12" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

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



<p>今回は<strong>損失関数</strong>についてやっていきます。対象者はAI構築を目標としている方です。そのため理論の深堀はしません。なぜなら、深いところまで理解しようとすると、いつまでも実践に進めないからです。</p>



<p>そのためここでは、実践に必要最低限の知識のみを解説し、<span class="red">パパっと座学を終わらせてすぐに実践をやれる環境</span>を提供しています。</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">AI初心者の第一歩　簡単なAIを体験しよう！</figcaption></figure>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/738/" 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/02/7cb83e66d81719b736f5c9df6129004b-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/7cb83e66d81719b736f5c9df6129004b-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/7cb83e66d81719b736f5c9df6129004b-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/7cb83e66d81719b736f5c9df6129004b-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/7cb83e66d81719b736f5c9df6129004b-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/7cb83e66d81719b736f5c9df6129004b-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/7cb83e66d81719b736f5c9df6129004b-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/7cb83e66d81719b736f5c9df6129004b.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勉強法</div><div class="blogcard-snippet internal-blogcard-snippet">複雑な仕組みや数学が難しくて全然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.20</div></div></div></div></a>
</div><figcaption class="wp-element-caption">【座学で躓かない！】一流AIエンジニアへの勉強方法</figcaption></figure>



<h3 class="wp-block-heading"><span id="toc2">カテゴリカルクロスエントロピー</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/03/e8c0eaa3852b39864df5959a5a9e0844.jpg" alt="カテゴリカルクロスエントロピー" class="wp-image-1291" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/e8c0eaa3852b39864df5959a5a9e0844.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/e8c0eaa3852b39864df5959a5a9e0844-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/e8c0eaa3852b39864df5959a5a9e0844-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<h4 class="wp-block-heading"><span id="toc3">カテゴリカルクロスエントロピーのポイント</span></h4>



<ul class="wp-block-list">
<li><strong>多クラス交差エントロピー損失</strong>のこと</li>



<li>名前通り、<span class="red">多クラス分類問題</span>に使用される</li>



<li>機械学習における<span class="red">損失関数</span>の一つ</li>



<li>分類問題で<span class="red">モデルの出力と実際のクラスの間の距離</span>を測るために使用</li>



<li>出力される確率分布と実際のクラスの間の差異を測る</li>



<li>予測が<span class="red">正しいクラスに近いほど</span>→<span class="red">損失が低くなる</span></li>



<li>機械学習などのモデルの学習において、<span class="red">分類問題</span>で使う</li>



<li><span class="red">ソフトマックス関数と組み合わせ</span>て使われる</li>



<li>損失が<span class="red">低いほど</span>→モデルの<span class="red">予測が正確</span></li>



<li>微分可能な関数であり、勾配降下法などの最適化アルゴリズムで使用できます。</li>



<li>クラスの数が多い場合には、<span class="blue">計算コストが増加する</span></li>
</ul>



<h4 class="wp-block-heading"><span id="toc4">おまけ：カテゴリカルクロスエントロピーの数式</span></h4>



<p>$$\text{Categorical Cross-Entropy Loss} = -\sum_{i} y_i \log(p_i)$$</p>



<p><strong>式の解釈：</strong><em>yi</em>は実際のクラス<em> i</em> のラベル（正解ラベル）であり、<em>pi</em>はモデルがクラス<em> i</em> に割り当てた確率です。</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/3a197689.211d7375.3a19768a.0fbf5447/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbooxstore%2Fbk-4296110322%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/3a197689.211d7375.3a19768a.0fbf5447/?me_id=1276609&#038;item_id=12866269&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbooxstore%2Fcabinet%2F01090%2Fbk4296110322.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/3a197689.211d7375.3a19768a.0fbf5447/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbooxstore%2Fbk-4296110322%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">最短コースでわかるPyTorch&amp;深層学習(ディープラーニング)プログラミング ひと目でわかる最短コースマップ付き／赤石雅典【3000円以上送料無料】</a><br><span >価格：4,070円（税込、送料無料)</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">二項交差エントロピー損失(Binary Cross-Entropy Loss)</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/02/3fbf7c32fe834b4e70cd57881af7db1e.jpg" alt="バイナリクロスエントロピー" class="wp-image-1281" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/3fbf7c32fe834b4e70cd57881af7db1e.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/02/3fbf7c32fe834b4e70cd57881af7db1e-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/3fbf7c32fe834b4e70cd57881af7db1e-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<h4 class="wp-block-heading"><span id="toc6">バリナリクロスエントロピーのポイント</span></h4>



<ul class="wp-block-list">
<li>2つのクラスの分類問題に適した<span class="red">損失関数</span></li>



<li><strong>バイナリクロスエントロピー</strong>の呼び名で知られる</li>



<li><span class="red">２値分類</span>に適する</li>



<li>モデルが出力した確率分布と実際のクラスの間の距離を測ります。</li>



<li>損失が<span class="red">低いほど</span>→モデルの<span class="red">予測が正確</span></li>



<li>モデルの出力が0から1の確率であることを前提としています。</li>



<li>微分可能な関数であり、勾配降下法などの最適化アルゴリズムで使用できます</li>



<li>サンプル数が少ない場合やクラス間の分布が不均衡な場合、過学習のリスクがあります。</li>
</ul>



<h4 class="wp-block-heading"><span id="toc7">おまけ：バイナリクロスエントロピーの数式</span></h4>



<p>$$\text{Binary Cross-Entropy Loss} = -\frac{1}{N} \sum_{i=1}^{N} [y_i \log(p_i) + (1 &#8211; y_i) \log(1 &#8211; p_i)]$$</p>



<p><strong>式の解釈：</strong>ここで、<em>N</em> はサンプルの数、<em>yi</em>​ は実際のクラスラベル（0または1）、<em>pi</em>​ はモデルがクラス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%2F16769954%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=20384407&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F9577%2F9784844379577.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%2F16769954%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">【POD】MNISTから始める深層学習 -PyTorch- （技術の泉シリーズ（NextPublishing）） [ kobot ]</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="toc8">平均二乗誤差(Mean Squared Error, MSE)</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/02/049990aaf11eab09295bc7b42f37e3b8.jpg" alt="平均二乗誤差" class="wp-image-1283" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/049990aaf11eab09295bc7b42f37e3b8.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/02/049990aaf11eab09295bc7b42f37e3b8-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/049990aaf11eab09295bc7b42f37e3b8-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<h4 class="wp-block-heading"><span id="toc9">平均二乗誤差（Mean Squared Error, MSE）のポイント</span></h4>



<ul class="wp-block-list">
<li>平均二乗誤差（Mean Squared Error, MSE）は、<span class="red">損失関数</span>の一つ</li>



<li>平均二乗誤差は、モデルの予測値と実際の値との<span class="red">差の二乗の平均</span>を計算する</li>



<li><span class="red">回帰問題</span>に使用</li>



<li>損失が<span class="red">低いほど</span>→モデルの<span class="red">予測が正確</span></li>



<li><span class="blue">外れ値</span><span class="blue">に敏感</span>で大きな損失を与える傾向がある<br><strong>外れ値：</strong>ハズレ値は異常値とも呼ばれ、データのパターンや傾向から大きく外れている値を持つデータポイントのこと</li>



<li>外れ値の影響を軽減するためには→<strong>ロバスト</strong>性が必要<br><strong>ロバスト：</strong>外れ値やノイズの影響を受けにくいこと</li>



<li>微分可能な関数であり、勾配降下法などの最適化アルゴリズムで使用できます。</li>



<li>分類問題とは異なり、クラスの不均衡などの課題に対処する機能がない</li>
</ul>



<h4 class="wp-block-heading"><span id="toc10">おまけ：平均二乗誤差の数式</span></h4>



<p>$$\text{MSE} = \frac{1}{N} \sum_{i=1}^{N} (y_i &#8211; \hat{y}_i)^2$$</p>



<p><strong>式の解釈：</strong>ここで、<em>N</em> はサンプルの数、<em>yi</em>​ は実際の値、<em>y</em>^​<em>i</em>​ はモデルの予測値を表します。</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%2F15994334%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=19705235&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F6409%2F9784297106409.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%2F15994334%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">図解即戦力　機械学習&amp;ディープラーニングのしくみと技術がこれ1冊でしっかりわかる教科書 [ 株式会社アイデミー 山口達輝 ]</a><br><span >価格：2,178円（税込、送料無料)</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>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="527" src="https://ascend-beyond.com/wp-content/uploads/2024/02/241b11eddda1cfd8092a8e49ab37cdd1.jpg" alt="クロスエントロピ、平均二乗誤差" class="wp-image-1282" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/241b11eddda1cfd8092a8e49ab37cdd1.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/02/241b11eddda1cfd8092a8e49ab37cdd1-300x198.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/241b11eddda1cfd8092a8e49ab37cdd1-768x506.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<ul class="wp-block-list">
<li><strong>カテゴリカルクロスエントロピー:</strong>
<ul class="wp-block-list">
<li><span class="red">多クラス分類問題</span>に使用されます。</li>



<li>出力が複数のクラスの確率分布で表される場合に適しています。</li>



<li>クラスの数が2つ以上の場合に適用されます。</li>
</ul>
</li>



<li><strong>二項交差エントロピー損失:</strong>
<ul class="wp-block-list">
<li><span class="red">2クラス分類問題</span>に使用されます。</li>



<li>出力が2つのクラスの確率で表される場合に適しています。</li>



<li>クラスの数が2つの場合に適用されます。</li>
</ul>
</li>



<li><strong>平均二乗誤差:</strong>
<ul class="wp-block-list">
<li><span class="red">回帰問題</span>に使用されます。</li>



<li>出力が連続値であり、目標値との差を考慮する必要がある場合に適しています。</li>



<li>出力が確率分布ではなく、実数値である場合に適用されます。</li>
</ul>
</li>
</ul>



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



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="530" src="https://ascend-beyond.com/wp-content/uploads/2024/03/41328bfb47df453aa128dd8373dfc96e.jpg" alt="AI　終わり" class="wp-image-1230" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/41328bfb47df453aa128dd8373dfc96e.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/41328bfb47df453aa128dd8373dfc96e-300x199.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/41328bfb47df453aa128dd8373dfc96e-768x509.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>今回は、機械学習・ニューラルネットワークを構築する際に覚えておくべき損失関数を紹介しました。大体この３つが使われます。</p>



<p>では、座学はここまでにして実践をどんどん積んでいきましょう！</p>



<p>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/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></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【AI/座学】GANパラメーター調整のコツ・極意書</title>
		<link>https://ascend-beyond.com/study/1177/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Sat, 02 Mar 2024 11:26:38 +0000</pubDate>
				<category><![CDATA[AI（人工知能）]]></category>
		<category><![CDATA[Study]]></category>
		<category><![CDATA[座学]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=1177</guid>

					<description><![CDATA[目次 対象読者判断基準となる前提知識知識：バッチサイズの大小調整知識：学習率の大小調整知識：ドロップアウトの大小調整知識：識別器と生成器の強弱調整仮説を立てる練習！例題1例題２おまけ：識別器を弱めるには？バッチ正則化の排 [&#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><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><ol><li><a href="#toc8" tabindex="0">例題1</a></li><li><a href="#toc9" tabindex="0">例題２</a></li></ol></li><li><a href="#toc10" tabindex="0">おまけ：識別器を弱めるには？</a><ol><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></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>ここでは、そんな学習も心も不安定になってしまった人に向けての、<strong>GANモデルパラメーター調整のコツ</strong>を紹介します。</p>



<p>また、ここでは数式などの複雑な概念理解は問いません。必要な能力は数学的思考よりも論理的思考です。<br><br>ここでしっかり学習してパズル間隔でパラメーターを調整できるようになりましょう！そして、一歩ずつ一流のAIエンジニアに近づきましょう！</p>



<h3 class="wp-block-heading"><span id="toc2">判断基準となる前提知識</span></h3>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="530" src="https://ascend-beyond.com/wp-content/uploads/2024/03/1092199e5ac2144bfe844fee6d13c9b6.jpg" alt="前提知識
" class="wp-image-1220" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/1092199e5ac2144bfe844fee6d13c9b6.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/1092199e5ac2144bfe844fee6d13c9b6-300x199.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/1092199e5ac2144bfe844fee6d13c9b6-768x509.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>まずは、前提知識をつけましょう。前提知識があると&#8230;.</p>



<ul class="wp-block-list">
<li><span class="red">パラメーターの調整</span>が運任せにならない</li>



<li>損失などの評価結果を見たら<span class="red">推測が立てられる</span></li>



<li>推理が正しかった時の<span class="red">ヤバいくらいのアドレナリン</span>が得られる（笑）</li>
</ul>



<p>こんな風に、前提知識を持つだけで、一流のAIエンジニアに大きく近づけるのです。やるんだったら、一流を目指しましょう！超越しちゃいましょう！</p>



<h3 class="wp-block-heading"><span id="toc3">知識：バッチサイズの大小調整</span></h3>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="530" src="https://ascend-beyond.com/wp-content/uploads/2024/03/d8ea6827409f08d985d27af1f9aeb9b1.jpg" alt="ホグワーツ　人工知能パラメーター" class="wp-image-1225" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/d8ea6827409f08d985d27af1f9aeb9b1.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/d8ea6827409f08d985d27af1f9aeb9b1-300x199.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/d8ea6827409f08d985d27af1f9aeb9b1-768x509.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><strong>大きくする場合の<span class="bold-red">メリット</span>・<span class="bold-blue">デメリット</span>:</strong></p>



<ul class="wp-block-list">
<li><strong>計算効率の向上:</strong> 大きなバッチサイズを使用すると、GPUやCPUなどのリソースを効率的に使用できます。これにより、トレーニング時間が短縮されます。</li>



<li><strong>モデルの安定性:</strong> 大きなバッチサイズを使用すると、勾配の推定がより安定し、モデルの訓練が安定化します。</li>



<li><strong>汎化性能の向上:</strong> 大きなバッチサイズを使用すると、モデルがより多くのデータで訓練されるため、汎化性能が向上する可能性があります。</li>



<li><strong>メモリ消費量の増加:</strong> 大きなバッチサイズを使用すると、メモリの消費量が増加し、メモリ不足になる可能性があります。</li>



<li><strong>局所解への収束:</strong> 大きなバッチサイズを使用すると、モデルが局所解に収束しやすくなる<span class="blue">局所最適化</span>に陥る。これにより、多様性のある解を見つけにくくなる可能性があります。</li>
</ul>



<p><strong>小さくする場合の<span class="bold-red">メリット</span>・<span class="bold-blue">デメリット</span>:</strong></p>



<ul class="wp-block-list">
<li><strong>メモリ消費量の削減:</strong> 小さなバッチサイズを使用すると、メモリの消費量が削減されます。</li>



<li><strong>多様な勾配:</strong> 小さなバッチサイズを使用すると、より多様な勾配が得られ、モデルがより多様な方向に学習できます。つまり<span class="red">局所最適化を防ぎやすく</span>なります。</li>



<li><strong>計算効率の低下:</strong> 小さなバッチサイズを使用すると、計算効率が低下し、トレーニング時間が長くなる可能性があります。</li>



<li><strong>モデルの不安定性:</strong> 小さなバッチサイズを使用すると、勾配の推定が不安定になり、モデルの訓練が不安定になる可能性があります。つまり、<span class="blue">学習が収束しにくく</span>なります。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc4">知識：学習率の大小調整</span></h3>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="530" src="https://ascend-beyond.com/wp-content/uploads/2024/03/76a4e24ce08883cb37d8f1db9507b869.jpg" alt="迷路　パラメーター　人工知能" class="wp-image-1226" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/76a4e24ce08883cb37d8f1db9507b869.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/76a4e24ce08883cb37d8f1db9507b869-300x199.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/76a4e24ce08883cb37d8f1db9507b869-768x509.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><strong>大きい場合の<span class="bold-red">メリット</span>・<span class="bold-blue">デメリット</span>:</strong></p>



<ul class="wp-block-list">
<li><strong>高速な収束:</strong> 学習率が大きいと、各更新ステップでのパラメータの変化量が大きくなり、<span class="red">収束が速くなる場合</span>があります。</li>



<li><strong>局所最適解の脱出:</strong> 大きな学習率を使用すると、<span class="red">局所最適解に収束するのを防ぐ</span>ために大域的な最適解に向かう可能性が高まります。</li>



<li><strong>発散のリスク:</strong> 学習率が大きすぎると、更新ステップごとにパラメータが大きく変化しすぎて、<span class="blue">最適解を飛び越えてしまう</span>可能性がある。</li>



<li><strong>安定性の低下:</strong> 大きな学習率を使用すると、安定性が低下し、学習が不安定になる場合があります。つまり、<span class="blue">収束しにくく</span>なります。</li>
</ul>



<p><strong>小さい場合の<span class="bold-red">メリット</span></strong>・<span class="bold-blue">デメリット</span><strong>：</strong></p>



<ul class="wp-block-list">
<li><strong>安定した学習:</strong> 学習率が小さいと、更新ステップごとにパラメータの変化量が小さくなり、学習が安定しやすくなります。</li>



<li><strong>局所最適解への収束:</strong> 小さな学習率を使用すると、<span class="blue">局所最適化に陥って</span>しまいます。</li>



<li><strong>収束が遅い:</strong> 学習率が小さいと、<span class="blue">収束するまでに多くのエポックが必要</span>になり、学習時間が長くなる可能性があります。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc5">知識：ドロップアウトの大小調整</span></h3>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="530" src="https://ascend-beyond.com/wp-content/uploads/2024/03/7f588b6286540d54cb3316c1ab96f523.jpg" alt="パラメーター　迷路" class="wp-image-1228" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/7f588b6286540d54cb3316c1ab96f523.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/7f588b6286540d54cb3316c1ab96f523-300x199.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/7f588b6286540d54cb3316c1ab96f523-768x509.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><strong>大きくする(追加・増加・割合)場合の<span class="bold-red">メリット</span>・<span class="bold-blue">デメリット</span></strong></p>



<ul class="wp-block-list">
<li><strong>モデルの正則化:</strong> 大きなドロップアウト率を使用すると、モデルがより多くのノードをランダムに無効にするため、モデルの正則化が向上し、<span class="red">過学習を減らす</span>効果があります。</li>



<li><strong>汎化性能の向上:</strong> 大きなドロップアウト率を使用すると、モデルがより汎化され、<span class="red">新しいデータに対する性能が向上する</span>可能性があります。</li>
</ul>



<ul class="wp-block-list">
<li><strong>表現力の低下:</strong> 大きなドロップアウト率を使用すると、モデルが表現力を失い、モデルの性能が低下する可能性があります。表現力を失うと、より<span class="blue">単純な特徴に依存するようになり</span>ます。また、表現力を失うとは、学習することができる<span class="blue">表現空間が制限されること</span>を意味します。</li>



<li><strong>学習の収束が遅くなる:</strong> 大きなドロップアウト率を使用すると、モデルが収束するのにより多くのエポックが必要になる場合があり、<span class="blue">学習時間が長くなる</span>可能性があります。</li>
</ul>



<p><strong>小さく(<strong>削除・減らす・割合</strong>)する場合の<span class="bold-red">メリット</span>・<span class="bold-blue">デメリット</span>：</strong></p>



<ul class="wp-block-list">
<li><strong>表現力の向上:</strong> ドロップアウトをなくすか、減らすと、モデルの表現力が向上し、<span class="red">より複雑なパターンを捉える</span>ことができます。</li>



<li><strong>学習の収束が早くなる:</strong> ドロップアウトをなくすか、減らすと、モデルの学習が収束するのに必要なエポック数が減少し、<span class="red">トレーニング時間が短縮</span>される可能性があります。</li>



<li><strong>過学習のリスク:</strong> ドロップアウトをなくすか、減らすと、モデルが訓練データに過剰に適合しやすくなり、<span class="blue">過学習のリスク</span>が高まります。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc6">知識：識別器と生成器の強弱調整</span></h3>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="530" src="https://ascend-beyond.com/wp-content/uploads/2024/03/bbc94bd63d1b27009ec3137882eda231.jpg" alt="扉　パラメーター" class="wp-image-1227" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/bbc94bd63d1b27009ec3137882eda231.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/bbc94bd63d1b27009ec3137882eda231-300x199.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/bbc94bd63d1b27009ec3137882eda231-768x509.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p><span class="red">GANの理想形は識別器と生成器の強さが五分五分になること</span>です。もしバランスが取れないと以下のようになります。</p>



<ul class="wp-block-list">
<li><strong>識別器が強すぎる</strong>と、ほとんどが偽とはじかれて学習の方向性が分からなくなる。</li>



<li><strong>識別器が弱すぎる</strong>と、偽画像の改善点がわからないので低レベルな品質が続く。</li>
</ul>



<p>特に多いのは<strong>識別器が強くなるケース</strong>です。というのも、識別器は判定するだけですが、生成器は０から画像を作り出すという労力の大きい仕事をしなければなりません。そのため、識別器は生成器よりも早く学習を収束させてしまい、GANのバランスが崩れるのです。</p>



<p>つまり、私たちがやるべいことは<br>『<strong>生成器が追いつける範囲で識別器を強化しつつも、高品質のために過度な弱体化を避ける</strong>』というとても絶妙なバランスを見つけなくてはならないのです。</p>



<h3 class="wp-block-heading"><span id="toc7">仮説を立てる練習！</span></h3>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="530" src="https://ascend-beyond.com/wp-content/uploads/2024/03/1238edd504aeac76a61d1a8c538ef151.jpg" alt="人工知能　AI" class="wp-image-1222" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/1238edd504aeac76a61d1a8c538ef151.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/1238edd504aeac76a61d1a8c538ef151-300x199.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/1238edd504aeac76a61d1a8c538ef151-768x509.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>では、前提知識はここまでにして、その知識の活用練習をしていきましょう。</p>



<p><span class="fz-18px"><span class="fz-22px"><span class="fz-24px"><strong>例題</strong>：</span></span></span>学習を開始して以下のような出力がされました。あなたなら、どのように見ますか？今までの知識を使って、何かしらの仮説を立てていきましょう。仮説は何個でも挙げられます。その<span class="red">仮説を１つずつ潰していくことが、学習の最適化に繋がります</span>。<br><br>p.s.紹介した仮説と違うからと言って皆さんの仮説が間違っているわけではありません。いくらでも仮説は立てられますのでね。</p>



<h4 class="wp-block-heading"><span id="toc8">例題1</span></h4>



<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 role="button" tabindex="0" data-code="50 [D loss: 0.000624, acc.: 100.00%] [G loss: 0.007994]
1000 [D loss: 0.004652, acc.: 99.69%] [G loss: 0.008186]
2150 [D loss: 0.002862, acc.: 100.00%] [G loss: 0.000937]
3200 [D loss: 0.006426, acc.: 99.20%] [G loss: 0.005835]
4300 [D loss: 0.000406, acc.: 100.00%] [G loss: 0.007646]
5350 [D loss: 0.000592, acc.: 100.00%] [G loss: 0.000230]" 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">1000</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.004652</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">99.69</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.008186</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">2150</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.002862</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.000937</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">3200</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.006426</span><span style="color: #F8F8F2">, acc.: </span><span style="color: #AE81FF">99.20</span><span style="color: #F92672">%</span><span style="color: #F8F8F2">] [G loss: </span><span style="color: #AE81FF">0.005835</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">4300</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.000406</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.007646</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #AE81FF">5350</span><span style="color: #F8F8F2"> [D loss: </span><span style="color: #AE81FF">0.000592</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.000230</span><span style="color: #F8F8F2">]</span></span></code></pre></div>



<p><strong>仮説：</strong><br>・正解率をみると、100%付近にずっといる→<span class="red">識別器が強い立ち位置をキープ</span><br>・G lossがずっと0.00~という小さな値→<span class="red">識別器の損失にG lossが引っ張られている</span>（G lossは識別器と生成器を合わせた損失なので、識別器の損失が極端に低い場合はそれに引っ張られて生成器の損失が無視されてしまいます。その結果、0.00~という低い損失を維持し続けているのです。<br><br>この２点から識別器が強すぎる可能性があると推理→<strong>識別器を弱めてみよう</strong>！<br><br>p.s.弱め方は以下で解説します。</p>



<h4 class="wp-block-heading"><span id="toc9">例題２</span></h4>



<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 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]
～
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]" 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: #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></code></pre></div>



<p>・最初の100%→識別が優位（始めは識別器が優位になりがち）<br>・それ以降は50%前後→生成器と識別器がいい感じで競い合っている<br>・4000イテレーションから70%になった→識別器が少しだけ優位になった</p>



<p>ここから、この出力結果はいい感じの学習プロセスを歩んでいると分かる。</p>



<p>p.s.一般的に最初の方は識別器が優勢になりやすいので、最初の100％はあまり考える必要がないかもしれません。</p>



<h3 class="wp-block-heading"><span id="toc10">おまけ：識別器を弱めるには？</span></h3>



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="530" src="https://ascend-beyond.com/wp-content/uploads/2024/03/fd86abd76d9c1a72100c099cc30dc16d.jpg" alt="人工知能" class="wp-image-1219" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/fd86abd76d9c1a72100c099cc30dc16d.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/fd86abd76d9c1a72100c099cc30dc16d-300x199.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/fd86abd76d9c1a72100c099cc30dc16d-768x509.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>上述のように、識別器を弱める機会は往々にしてあります。なので、ここでは識別器を弱体化させる手段を４つほど紹介していきます。<br><br>p.s.弱体化は品質にも関わることなので、過度な弱体化は避けましょう。</p>



<h4 class="wp-block-heading"><span id="toc11">バッチ正則化の排除</span></h4>



<p>バッチ正則化のメリットは、<span class="red">収束速度を上げる</span>ことです。そのため、識別器にこれを適用してしまうと、生成器の学習が識別器に追いつけなくなる可能性が上がります。そしてそれは、低品質な画像に繋がります。</p>



<p>そのため、もし早い段階から<span class="red">正解率が100%を記録し続けたら識別器のバッチ正則化層を取り除いて</span>みましょう。</p>



<h4 class="wp-block-heading"><span id="toc12">ドロップアウトを追加</span></h4>



<p>ドロップアウトは過学習の抑制や<span class="blue"><span class="red">学習時間が長くなる</span></span>という特徴があります。つまり、あえて識別器の学習時間を延ばすことで、識別器の優位性を減少させることができるのです。</p>



<p>そのため、<span class="red">識別器の優位性を減らす手段としてドロップアウトを追加</span>したりすることは有効な手となります。</p>



<p>ただし、ドロップアウトを大きくし過ぎると単調な画像しか生成できなくなるので、バランスを考えながらやりましょう。</p>



<h4 class="wp-block-heading"><span id="toc13">学習率を小さく</span></h4>



<p>学習率を小さくすることで、収束に時間をかけることができます。そのため、<span class="red">識別器は生成器よりも小さな学習率を設定</span>しましょう。そして、生成器にはより大きな学習率を設定して識別器に対抗できるようにしましょう。</p>



<p>ただ、生成器の学習速度を速めすぎると優先しすぎると、収束しなくなるというリスクもあります。</p>



<h4 class="wp-block-heading"><span id="toc14">生成器ネットワークの強化</span></h4>



<p>生成器のネットワークを強化することで、間接的に識別器を弱めることができます。</p>



<p>生成器を強化するには・・</p>



<ul class="wp-block-list">
<li><strong>ネットワークの複雑さの増加:</strong> 生成器のネットワークを<span class="red">より深く</span>、<span class="red">より広く</span>することで、モデルの表現力を向上させることができます。新しい層を追加したり、各層のユニット数を増やしたりすることで、生成器がより複雑なデータ分布を学習する能力が向上します。</li>



<li><strong>新しい層の追加:</strong> 生成器のネットワークに新しい層を追加することで、モデルの表現力を向上させることができます。たとえば、畳み込み層や転置畳み込み層など、新しいタイプの層を追加して、モデルの表現力を向上させることができます。</li>



<li><strong>正則化の強化:</strong> 生成器のネットワークに正則化手法を追加することで、過学習を防ぎ、モデルの汎化能力を向上させることができます。例えば、ドロップアウトやバッチ正規化などの手法を使用して、モデルを安定化させることができます。</li>



<li><strong>特徴量の追加:</strong> 生成器の入力に新しい特徴量を追加することで、モデルの表現力を向上させることができます。入力データに含まれる情報量を増やすことで、モデルがより複雑なデータ分布を学習することができます。</li>
</ul>



<p>これらの方法を組み合わせることで、生成器がリアルな偽物画像を生成できるようになります。そして、それは識別器を騙すことにも繋がり生成器の優位性を確保できるようになります。</p>



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



<figure class="wp-block-image size-full"><img decoding="async" width="800" height="530" src="https://ascend-beyond.com/wp-content/uploads/2024/03/41328bfb47df453aa128dd8373dfc96e.jpg" alt="AI　終わり" class="wp-image-1230" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/41328bfb47df453aa128dd8373dfc96e.jpg 800w, https://ascend-beyond.com/wp-content/uploads/2024/03/41328bfb47df453aa128dd8373dfc96e-300x199.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/41328bfb47df453aa128dd8373dfc96e-768x509.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p>今回はパラメーターの座学を行いました。しかし、なによりパラメーターを上手く調整するのは知識よりも経験則です。そのため、Ascend-beyond式にのっとってこれからも、実践重視でやっていきましょう。</p>



<p>座学はあくまでも、サブ的な扱いで実践を重視する。それがAI学習の基本でありAscend-beyond式AI学習法です。</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></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>
		<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-20" checked><label class="toc-title" for="toc-checkbox-20">目次</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>
	</channel>
</rss>
