<?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>実践</title>
	<atom:link href="https://ascend-beyond.com/category/study/ai/practice/feed/" rel="self" type="application/rss+xml" />
	<link>https://ascend-beyond.com</link>
	<description></description>
	<lastBuildDate>Wed, 27 Mar 2024 09:59:10 +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>実践</title>
	<link>https://ascend-beyond.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href=""/>	<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-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a><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 fetchpriority="high" 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>【AI/実装編】サイズの大きな画像を生成【衝撃簡単⑧】</title>
		<link>https://ascend-beyond.com/study/1478/</link>
		
		<dc:creator><![CDATA[管理人]]></dc:creator>
		<pubDate>Sat, 09 Mar 2024 11:39:33 +0000</pubDate>
				<category><![CDATA[AI（人工知能）]]></category>
		<category><![CDATA[Study]]></category>
		<category><![CDATA[実践]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[独学]]></category>
		<guid isPermaLink="false">https://ascend-beyond.com/?p=1478</guid>

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

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

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



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



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



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



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



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



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

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



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

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

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

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


def discriminator_model(shape):
    model = Sequential()

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

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

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

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

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

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

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

    return model



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

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

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

discriminator.trainable = False

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

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

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

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

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

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


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

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


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

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

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

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



iterations = 20000
batch_size = 128
sample_interval = 1  

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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

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

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

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



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



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



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



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



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

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

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

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

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

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

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

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

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



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



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



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



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



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



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



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



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



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

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

discriminator.trainable = False

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



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



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



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



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

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

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

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

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


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

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



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



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



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



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



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



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



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



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



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



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



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



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

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

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



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



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



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



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



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



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

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



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



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



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



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



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



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



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

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

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

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



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



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



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

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

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

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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

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


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

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


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

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



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




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


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

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

discriminator.trainable = False

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



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



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

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

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

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

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

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


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

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

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


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


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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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

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


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

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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

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

discriminator.trainable = False

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



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



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



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



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

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

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

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

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

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

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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

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

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



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



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



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



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



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



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



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



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



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



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



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



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



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

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

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

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

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



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



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



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



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



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



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/1478/" title="【AI/実装編】サイズの大きな画像を生成【衝撃簡単⑧】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703-160x90.jpg 160w, https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703-300x169.jpg 300w, https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703-1024x576.jpg 1024w, https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703-768x432.jpg 768w, https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703-120x68.jpg 120w, https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703-320x180.jpg 320w, https://ascend-beyond.com/wp-content/uploads/2024/03/2e241ea7502ce7a0a5cec035f9ed1703.jpg 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/実装編】サイズの大きな画像を生成【衝撃簡単⑧】</div><div class="blogcard-snippet internal-blogcard-snippet">【衝撃簡単】でDCGANモデルで大きな画像を生成していきます。流れはMNISTと同じです。初心者でもできるレベルの学習になので簡単にやっていきましょう。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.09</div></div></div></div></a>
</div></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【AI/実践編】画像収集～画像前処理方法【衝撃簡単⑥】</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-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">画像収集(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/実践編】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-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">DCGANモデルの定義とコンパイル</a></li><li><a href="#toc8" tabindex="0">モデルのコンパイル</a></li><li><a href="#toc9" tabindex="0">モデルの訓練</a></li><li><a href="#toc10" tabindex="0">生成画像の保存</a></li><li><a href="#toc11" tabindex="0">モデルの実行</a></li><li><a href="#toc12" tabindex="0">モデルの保存とロード方法</a></li><li><a href="#toc13" tabindex="0">ファイルの実行</a></li><li><a href="#toc14" tabindex="0">出力例</a></li></ol></li><li><a href="#toc15" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

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



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



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



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



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



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



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



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



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



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



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

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

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

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

    model.add(LeakyReLU(alpha=0.01))

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



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

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

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

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

discriminator.trainable = False

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

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

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

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

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

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


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

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



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

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

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

iterations = 20000
batch_size = 128
sample_interval = 50  

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



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



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



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

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



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



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



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



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



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



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



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



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



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

    model.add(LeakyReLU(alpha=0.01))

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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

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

discriminator.trainable = False#前回と同じ

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



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



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



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



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



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



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



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

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

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

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

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

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

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

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



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



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



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



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



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



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

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

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



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



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



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



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



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



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



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



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



<p></p>



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

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



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



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



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



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



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



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



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



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



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



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



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



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

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

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

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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

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

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

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

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

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

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

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

        g_loss=gan.train_on_batch(z,real_label)

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

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

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



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



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



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

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

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

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


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



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



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



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



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



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

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

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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

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

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

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



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



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



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



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



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



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



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



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



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



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



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



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

cap = cv2.VideoCapture(0)

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

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

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

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

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

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

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

cap.release()
cv2.destroyAllWindows()


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


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

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




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

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

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



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



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



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



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



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



<li>撮影する</li>



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



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



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



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



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



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

cap = cv2.VideoCapture(0) 

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

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

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

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

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



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



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



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



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



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

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

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

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



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



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



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



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

# cap = cv2.VideoCapture(1) 

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

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



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



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



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



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

# cap = cv2.VideoCapture(0) 


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

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

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

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



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



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



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



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



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

# cap = cv2.VideoCapture(0) 


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

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


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

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

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

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



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



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



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

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

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

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

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

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

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

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

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

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



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



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



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



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



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



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

# cap = cv2.VideoCapture(0)

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

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

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

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

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

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

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

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

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

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

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

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

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



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



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



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



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



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

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

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

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

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



model = Sequential()

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

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

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

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

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


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


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

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

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



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



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



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



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



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



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



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



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

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

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

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



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



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



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



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



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



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



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



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



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



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

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

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

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

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



model = Sequential()

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

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

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

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

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


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


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

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

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



<h3 class="wp-block-heading"><span id="toc4">基本モデルの構築</span></h3>



<p>まずは、全結合層のみでニューラルネットワークモデルを構築しましょう。</p>



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

model = Sequential()

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

model.add(Dense(10))
model.add(Activation(&quot;softmax&quot;))
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Dense, Activation</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dropout(</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;softmax&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span></code></pre></div>



<p><span class="bold-green"><strong>from keras.models import Sequential</strong></span><br>＃Kerasの<code>Sequential</code>モデルクラスをインポートします。<code>Sequential</code>モデルは、レイヤーを順番に重ねてモデルを定義するためのものです。<br><span class="bold-green"><br></span><strong><span class="bold-green">from keras.layers import Dense, Activation</span></strong><br>＃Dense層とActivation層を含む必要なモジュールをインポートします。Dense層は、<span class="bold-red">全結合層</span>を表し、Activation層は活性化関数を適用するために使用されます。<br><br><span class="bold-green">from keras.layers import Dropout</span><br>#過学習を防ぐために使用される正則化手法の1つである<code>Dropout</code>をインポートしています。<br><br><span class="bold-green">model = Sequential()</span><br>＃Sequentialモデルのインスタンスを作成します。これは、ニューラルネットワークモデルを構築するための土台となるものです。<br><br><strong><span class="bold-green">model.add(Dense(784))</span><br></strong>＃<strong><strong><span class="bold-red">全結合層</span></strong></strong>(Dense層)を追加します。この層は784個(28&#215;28)のユニット（ニューロン）を持ち、画像データの特徴を抽出し、平坦化します。</p>



<p><strong><span class="bold-green">model.add(Activation(&#8220;relu&#8221;))<br></span></strong>#ReLU(Rectified Linear Unit)活性化関数を適用します。これにより、非線形性が導入されます。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/808/" title="【AI/座学編】高頻出な活性化関数まとめ" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-160x90.png 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-300x169.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-1024x576.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-768x432.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-120x68.png 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-320x180.png 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5.png 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/座学編】高頻出な活性化関数まとめ</div><div class="blogcard-snippet internal-blogcard-snippet">ここでは、AIを実装する上で使用頻度の高い活性化関数を解説します。また、解説はAscendBeyond式にのっとり、複雑な概念理解には重きを置かず実装に必要な最低限の重要な知識のみを提供しています。座学で時間を浪費していては、AIを作るという本来の目的から離れるばかりですからね。やはり、座学よりも実践に時間を多く費やしてほしいので、座学は軽く頭に入れる程度にしてどんどん実践を積んでください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.22</div></div></div></div></a>
</div><figcaption class="wp-element-caption">ReLUについて知りたい方はどうぞ</figcaption></figure>



<p><span class="bold-green">model.add(Dropout(0.5))</span><br>＃Dropout率が0.5であるDropoutレイヤーを追加しています。ここでのDropout率0.5は、ランダムに選択された50%のニューロンを無効にし、それ以外のニューロンを活性化させることを意味します。</p>



<p><strong><span class="bold-green">model.add(Dense(10))</span><br></strong>#出力層として<strong><span class="bold-red">全結合層</span></strong>を追加します。この層は、モデルが10クラスの分類を行うことを示します。</p>



<p><strong><span class="bold-green">model.add(Activation(&#8220;softmax&#8221;))</span></strong><br>#最後に、ソフトマックス活性化関数を適用します。これにより、出力は各クラスに属する確率として解釈されます。softmax関数は、クラス分類問題において一般的に使用されます。</p>



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



<h3 class="wp-block-heading"><span id="toc5">畳み込み層を追加</span></h3>



<p>では、実際に畳み込み層を追加していきましょう。コード量が多く感じるかもしれませんが、実質は同じメソッドを使いまわしているだけなので、恐れることはありません。<br><br>p.s.コメント部分は既に書いたコードを表しています。</p>



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

#model = Sequential()

model.add(Conv2D(32,(3,3)))
model.add(Activation(&quot;relu&quot;))

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

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

#model.add(Dense(784))
#model.add(Activation(&quot;relu&quot;))
#model.add(Dropout(0.5))
#model.add(Dense(10))
#model.add(Activation(&quot;softmax&quot;))
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F">#from keras.models import Sequential</span></span>
<span class="line"><span style="color: #88846F">#from keras.layers import Dense, Activation</span></span>
<span class="line"><span style="color: #88846F">#from keras.layers import Dropout</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Conv2D,MaxPooling2D</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#model = Sequential()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Conv2D(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">,(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Conv2D(</span><span style="color: #AE81FF">32</span><span style="color: #F8F8F2">,(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(MaxPooling2D((</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dropout(</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Conv2D(</span><span style="color: #AE81FF">16</span><span style="color: #F8F8F2">,(</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(MaxPooling2D((</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">2</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dropout(</span><span style="color: #AE81FF">0.5</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#model.add(Dense(784))</span></span>
<span class="line"><span style="color: #88846F">#model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"><span style="color: #88846F">#model.add(Dropout(0.5))</span></span>
<span class="line"><span style="color: #88846F">#model.add(Dense(10))</span></span>
<span class="line"><span style="color: #88846F">#model.add(Activation(&quot;softmax&quot;))</span></span>
<span class="line"></span></code></pre></div>



<p><strong><span class="bold-green">from keras.layers import Conv2D</span></strong><br>＃2次元<span class="bold-red">畳み込み層</span>(Convolutional Layer)を使用するためのモジュールをインポートします。<br><br><span class="bold-green">from keras.layers import MaxPooling2D<br></span>＃畳み込みニューラルネットワーク（CNN）内で使用される<span class="bold-red">プーリング層</span>の1つであるMaxPooling2Dをインポートしています。<br></p>



<p><span class="bold-green"><code>model.add(Conv2D(32,(3,3)))</code></span><br>＃32個の3&#215;3のフィルタを持つ畳み込み層を追加しています。この層は、画像データの特徴を抽出します。<br><br><span class="bold-green"><code>model.add(Activation("relu"))</code></span><br>＃ReLU(Rectified Linear Unit)活性化関数を適用します。これにより、非線形性が導入されます。<br><br><code><span class="bold-green">model.add(Conv2D(32,(3,3)))</span></code><br>＃32個の3&#215;3のフィルタを持つ畳み込み層を追加しています。この層も、画像データの特徴を抽出します。<br><br><code><span class="bold-green">model.add(Activation("relu"))</span></code><br>＃再びReLU活性化関数を適用します。<br><br><span class="bold-green"><code>model.add(MaxPooling2D((2,2)))</code></span><br>＃MaxPooling2D層を追加します。2&#215;2のウィンドウ内の最大値を取得し、画像を圧縮します。これにより、特徴マップのサイズが削減されます。<br><br><span class="bold-green"><code>model.add(Dropout(0.5))</code></span><br>＃Dropoutレイヤーを追加します。50%のドロップアウト率で、ランダムに一部のニューロンを無効にします。過学習を防止するために使用されます。<br><br>以上のプロセスを繰り返し、さらに畳み込み層とプーリング層、Dropoutレイヤーを追加しています。3つ目の畳み込み層は16個の3&#215;3のフィルタを持ち、その後にReLU活性化関数が適用され、MaxPooling2Dで画像が圧縮され、最後にDropoutが適用されます。</p>



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



<h3 class="wp-block-heading"><span id="toc6">Conv2Dのルール</span></h3>



<p>Conv２Dを使用するためにはいくつかのルールがあります。そのルールに従わないと学習を進めることができません。そのため、ここでは上のコードをConv２Dに合うように必要なコードを追加していきます。</p>



<h5 class="wp-block-heading"><span id="toc7">Conv２D入力編</span></h5>



<p><code>Conv2D()</code>の入力は３次元(width,height,channel)でなけらばなりません。しかし、今回入力とするMNISTはチャンネルを持たない２次元です。なので、この入力を３次元に変換していきましょう。</p>



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

#model = Sequential()

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

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

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

# model.add(Dense(784))
# model.add(Activation(&quot;relu&quot;))
# model.add(Dropout(0.5))
# model.add(Dense(10))
# model.add(Activation(&quot;softmax&quot;))" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F"># from keras.models import Sequential</span></span>
<span class="line"><span style="color: #88846F"># from keras.layers import Dense, Activation</span></span>
<span class="line"><span style="color: #88846F"># from keras.layers import Conv2D,MaxPooling2D,Dropout</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Reshape</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#model = Sequential()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Reshape((</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">), </span><span style="color: #FD971F; font-style: italic">input_shape</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">,</span><span style="color: #AE81FF">28</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Conv2D(32,(3,3)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># model.add(Conv2D(32,(3,3)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"><span style="color: #88846F"># model.add(MaxPooling2D((2,2)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dropout(0.5))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># model.add(Conv2D(16,(3,3)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"><span style="color: #88846F"># model.add(MaxPooling2D((2,2)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dropout(0.5))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># model.add(Dense(784))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dropout(0.5))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dense(10))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;softmax&quot;))</span></span></code></pre></div>



<p><span class="bold-green"><code>from keras.layers import Reshape</code><br></span>＃Reshapeレイヤーを使用するために必要なモジュールをインポートします。Reshapeレイヤーは、入力データの<span class="marker-under">形状を変更するため</span>に使用されます。<br><br><span class="bold-green">model.add(Reshape((28,28,1), input_shape=(28,28))) </span><br>＃Reshapeレイヤーを追加します。このレイヤーは、入力データの形状を変更します。具体的には、入力データの形状を <code>(28, 28)</code> から <code>(28, 28, 1)</code> に変更します。これは、入力データがグレースケールの画像であり、1つのチャンネル（色）のみを持つことを示しています。このような形状のデータは、通常、畳み込みニューラルネットワーク（CNN）の入力として多々使用されています。</p>



<h5 class="wp-block-heading"><span id="toc8">Conv2D出力編</span></h5>



<p>Conv2Dで出力されたデータは<span class="bold">２次元配列です。</span>しかし、それと結合する全結合層は１次元配列しか受け付けません。そのため、全結合層(Dense)に渡す前には２次元配列を１次元に変形する必要があります。</p>



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

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

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

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

model.add(Flatten())

# model.add(Dense(784))
# model.add(Activation(&quot;relu&quot;))
# model.add(Dropout(0.5))
# model.add(Dense(10))
# model.add(Activation(&quot;softmax&quot;))" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F"># from keras.models import Sequential</span></span>
<span class="line"><span style="color: #88846F"># from keras.layers import Dense, Activation</span></span>
<span class="line"><span style="color: #88846F"># from keras.layers import Conv2D,MaxPooling2D,Dropout</span></span>
<span class="line"><span style="color: #88846F">#from keras.layers import Reshape</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Flatten</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#model = Sequential()</span></span>
<span class="line"><span style="color: #88846F"># model.add(Reshape((28,28,1), input_shape=(28,28)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Conv2D(32,(3,3)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># model.add(Conv2D(32,(3,3)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"><span style="color: #88846F"># model.add(MaxPooling2D((2,2)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dropout(0.5))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># model.add(Conv2D(16,(3,3)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"><span style="color: #88846F"># model.add(MaxPooling2D((2,2)))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dropout(0.5))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Flatten())</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F"># model.add(Dense(784))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;relu&quot;))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dropout(0.5))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Dense(10))</span></span>
<span class="line"><span style="color: #88846F"># model.add(Activation(&quot;softmax&quot;))</span></span></code></pre></div>



<p><span class="bold-green">from keras.layers import Flatten</span><br>#<code>Flatten</code>をインポートしています。Flattenレイヤーは入力を平滑化するために使用されます。<span class="bold-green"><br></span><br><span class="bold-green">model.add(Flatten())<br></span>＃畳み込み層やプーリング層などで処理された2次元の特徴マップを、その後の全結合層に入力するために、<span class="marker-under">１次元に変換するため</span>にFlatten()レイヤーが使います。<strong><span class="bold-green"><br></span></strong></p>



<h3 class="wp-block-heading"><span id="toc9">MNISTデータを読み込む</span></h3>



<p>前回同様、今回もMNISTを使って分析していきます。MNISTデータセットを読み込み、画像データとラベルデータを前処理してニューラルネットワークのトレーニングに適した形式に変換していきましょう。</p>



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

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

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

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

#~~~省略~~~~~~~~~~~~~~~~~~~~~~~" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F">#~~~省略~~~~~~~~~~~~~~~~~~~~~~~</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.datasets </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> mnist</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.utils </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> to_categorical</span></span>
<span class="line"><span style="color: #F92672">import</span><span style="color: #F8F8F2"> numpy </span><span style="color: #F92672">as</span><span style="color: #F8F8F2"> np</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">(X_train, y_train), (X_test, y_test) </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> mnist.load_data()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.array(X_train)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span>
<span class="line"><span style="color: #F8F8F2">X_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> np.array(X_test)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">y_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_train)</span></span>
<span class="line"><span style="color: #F8F8F2">y_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_test)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#~~~省略~~~~~~~~~~~~~~~~~~~~~~~</span></span></code></pre></div>



<p><span class="bold-green"><code>from keras.datasets import mnist</code><br></span>＃Kerasの<code>mnist</code>モジュールからMNISTデータセットを読み込むためのモジュールをインポートします。MNISTデータセットは、手書き数字（0から9までの数字）の画像データセットです。</p>



<p><span class="bold-green"><code>from keras.utils import to_categorical</code><br></span>＃Kerasの<code>to_categorical</code>関数を使用するためのモジュールをインポートします。この関数は、クラスラベルを<span class="bold-red">one-hotエンコーディング</span>形式に変換するのに使用されます。<br><br><code><span class="bold-green">import numpy as np</span></code><br>＃NumPyライブラリを<code>np</code>としてインポートします。NumPyはPythonで数値計算を行うための基本的なライブラリです。<br><br><span class="bold-green"><code>(X_train, y_train), (X_test, y_test) = mnist.load_data()</code><br></span>＃ <code>mnist.load_data()</code>関数を使用してMNISTデータセットを読み込みます。この関数は、トレーニング用の画像データとラベル、テスト用の画像データとラベルを返します。それぞれを<code>(X_train, y_train)</code>と<code>(X_test, y_test)</code>に代入します。<br><br><span class="bold-green"><code>X_train = np.array(X_train)/255</code></span><br><span class="bold-green"><code>X_test = np.array(X_test)/255</code><br></span>＃トレーニング用とテスト用の画像データをNumPy配列に変換し、値を0から1の範囲に正規化します。これは、画像のピクセル値を0から255の範囲から0から1の範囲にスケーリングすることで、ニューラルネットワークの学習を効率的に行うためです。<br><br><span class="bold-green"><code>y_train = to_categorical(y_train)</code><br><code>y_test = to_categorical(y_test)</code></span><br>＃トレーニング用とテスト用のラベルデータをone-hotエンコーディング形式に変換します。これにより、各サンプルのラベルがクラスの数だけの次元を持つベクトルに変換されます。例えば、数字3の場合、[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]となります。これは、多クラス分類のタスクにおいて、出力層でソフトマックス活性化関数を使用するために必要です。</p>



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



<p>モデルが学習するための損失関数や最適化アルゴリズム、および評価指標を設定していきましょう。</p>



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



<p><code><span class="bold-green">model.compile</span></code><br>＃モデルをコンパイルします。このメソッドを使用して、モデルの学習プロセスを設定します。<br><br><span class="bold-green"><code>loss="categorical_crossentropy"</code><br></span>＃損失関数(loss function)として、カテゴリカルクロスエントロピーを指定しています。カテゴリカルクロスエントロピーは、<span class="red">多クラス分類問題</span>において使用される損失関数であり、モデルの予測と真のラベルの間の差異を評価します。<br><br><code>optimizer="sgd"</code><br>＃<span class="bold-red">オプティマイザ</span>(optimizer)として、<span class="bold-red">確率的勾配降下法</span>（Stochastic Gradient Descent、SGD）を指定しています。SGDは、ミニバッチごとに勾配を計算し、モデルのパラメータを更新する際に使用される最適化アルゴリズムです。<br><br><span class="bold-green"><code>metrics=["accuracy"]</code><br></span>＃モデルの性能評価指標(metrics)として、正解率(accuracy)を指定しています。正解率は、モデルが正しく分類したサンプルの割合を示します。訓練や評価の際に、この指標を監視することでモデルの性能を評価することができます。</p>



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



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



<p>訓練が開始されると、各エポックごとに訓練データと検証データの損失と評価指標が計算され、<code>hist</code> オブジェクトに保存されるようにします。</p>



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



<p><strong><span class="bold-green">hist = model.fit(X_train, y_train, batch_size=200, verbose=1,<br>epochs=10, validation_split=0.1)</span></strong><br><br>＃<code><strong>hist = model.fit</strong></code>　<br>: モデルの訓練を開始するためのメソッドです。<code>model</code> は訓練するニューラルネットワークモデルを指します<br><br>＃<code><strong>X_train, y_train</strong></code>　<br>: 訓練用の入力データ <code>X_train</code> とそのラベルデータ <code>y_train</code> を指定しています。このデータはモデルの学習に使用されます。<br><br>＃<code><strong>batch_size=200</strong></code>　<br>: ミニバッチのサイズを指定しています。ミニバッチ学習では、全データセットを小さなバッチに分割し、各バッチごとにモデルのパラメータを更新します。<code>batch_size</code> は1回のパラメータ更新に使用するデータのサンプル数を指定します。<br><br>＃<code><strong>verbose=1</strong></code>　<br>: 訓練中にログメッセージを表示するかどうかを制御します。<code>verbose=1</code> の場合、進捗バーが表示されます。表示した方がカッコいいですよ。（笑）<br><br>＃<code><strong>epochs=</strong></code><strong>3</strong>　<br>: エポック数を指定しています。1つのエポックとは、全ての訓練データを1回学習することを指します。<code>epochs</code> パラメータは、モデルが訓練データを何回反復して学習するかを指定します。<br><br>#<code><strong>validation_split=0.1</strong></code>　<br>：検証データの割合を指定しています。訓練データの一部を検証に使用します。この場合、訓練データの10%が検証に使用されます。訓練中にモデルの性能を監視し、過学習を防ぐために使用されます</p>



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



<p>先ほど訓練したモデルをテストデータを使って評価していきます。</p>



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

score = model.evaluate(X_test, y_test, verbose=1)
print(&quot;正解率(acc)：&quot;, score[1])" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F">#~~~省略~~~~~~~~~~~~~~~~~~~~~~~</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">score </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.evaluate(X_test, y_test, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;正解率(acc)：&quot;</span><span style="color: #F8F8F2">, score[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">])</span></span></code></pre></div>



<p><span class="bold-green"><strong>score = model.evaluate(X_test, y_test, verbose=1) </strong></span><br>＃<strong><code>evaluate()</code> </strong>　：モデルの性能を評価するためのメソッドです。<strong>evaluatte()</strong>メソッドは、指定されたデータセットで<span class="marker-under">モデルを評価し、損失と評価指標（ここでは正解率）を返し</span>ます。<br>＃引数<strong> <code>X_test</code> </strong>はテストデータの入力、<code><strong>y_test</strong></code> はテストデータの出力（正解ラベル）を表します。<br>＃<code><strong>verbose=1</strong></code> は評価の進捗状況を表示する設定です。<br><br><span class="bold-green"><strong>print(&#8220;正解率(acc)：&#8221;, score[1])</strong><br></span>＃テストデータでの評価結果を出力しています。<code>score[1]</code> は、<code>evaluate</code> メソッドが返す評価指標のうち、正解率（accuracy）に対応する値を取得しています。この値は、モデルがテストデータで<span class="marker-under">正確に予測できた割合</span>を示します。</p>



<h3 class="wp-block-heading"><span id="toc13">学習の実行</span></h3>



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



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



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



<p>訓練されたニューラルネットワークモデルを&#8221;MNIST.h5&#8243; という名前のファイルに保存しましょう。このファイルを後で読み込むことで、モデルを再利用したり、別のプログラムで使用したりすることができます。</p>



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

model.save(&quot;MNIST.h5&quot;)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F">#~~~省略~~~~~~~~~~~~~~~~~~~~~~~</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.save(</span><span style="color: #E6DB74">&quot;MNIST.h5&quot;</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p><strong><span class="bold-green">model.save(&#8220;MNIST.h5&#8221;)<br></span></strong>＃<code><strong>model</strong></code> は保存するKerasモデルを指します。<br>＃<code><strong>.save()</strong></code> メソッドは、指定されたファイル名でモデルを保存します。ここでは、&#8221;MNIST.h5&#8243; という名前のファイルにモデルが保存されます。拡張子 <code>.h5</code> は、HDF5形式で保存されることを示しています。</p>



<h3 class="wp-block-heading"><span id="toc15">保存したモデルを使うには</span></h3>



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

model = load_model(&quot;MNIST.h5&quot;)

hist = model.fit(X_train, y_train, batch_size=200, verbose=1, 
                 epochs=3, validation_split=0.1)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> load_model </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> load_model(</span><span style="color: #E6DB74">&quot;MNIST.h5&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">hist </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.fit(X_train, y_train, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">200</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span></span>
<span class="line"><span style="color: #F8F8F2">                 </span><span style="color: #FD971F; font-style: italic">epochs</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">validation_split</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.1</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p><span class="bold-green"><strong>from keras.models import load_model </strong><br></span>＃Kerasの <code>models</code> モジュールから <code>load_model</code> 関数をインポートしています。<span class="marker-under"><code>load_model</code> 関数は、保存されたモデルを読み込むために使用</span>されます。<br><br><span class="bold-green"><strong>model = load_model(&#8220;MNIST.h5&#8221;)</strong><br></span>＃<code>load_model</code> 関数を使って、&#8221;MNIST.h5&#8243; というファイルからモデルを読み込んでいます。読み込まれたモデルは、<code>model</code> 変数に格納されます。<br><br><span class="bold-green">hist = model.fit(X_train, y_train, batch_size=200, verbose=1,<br>                 epochs=3, validation_split=0.1)</span><br>＃<span class="marker-under">続きから学習を再開</span>することができます。<br>＃先ほどのコードと同じなので細かい説明は割愛します。</p>



<table border="0" cellpadding="0" cellspacing="0"><tr><td><div style="border:1px solid #95a5a6;border-radius:.75rem;background-color:#FFFFFF;width:280px;margin:0px;padding:5px;text-align:center;overflow:hidden;"><table><tr><td style="width:128px"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15374717%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;"><img decoding="async" src="https://hbb.afl.rakuten.co.jp/hgb/39414777.169c3d99.39414778.be6498e6/?me_id=1213310&#038;item_id=19028377&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F4121%2F9784798154121.jpg%3F_ex%3D128x128&#038;s=128x128&#038;t=picttext" border="0" style="margin:2px" alt="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]" title="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]"></a></td><td style="vertical-align:top;width:136px;display: block;"><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px;word-wrap:break-word"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15374717%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">現場で使える！TensorFlow開発入門 Kerasによる深層学習モデル構築手法 （AI &amp; TECHNOLOGY） [ 太田 満久 ]</a><br><span >価格：2,948円（税込、送料無料)</span> <span style="color:#BBB">(2024/3/4時点)</span></p></td></tr></table></div><br><p style="color:#000000;font-size:12px;line-height:1.4em;margin:5px;word-wrap:break-word"></p></td></tr></table>



<h2 class="wp-block-heading"><span id="toc16">まとめ</span></h2>



<p>しゅうりょーー。お疲れさまでした。書籍で原理を学ぶよりも、やっぱり動かしながら学んだ方が楽しいし、頭に入りますよね。</p>



<p>ということで、これからもどんどん実践を積んでいきましょう！</p>



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

					<description><![CDATA[目次 対象読者今日のゴール今日使うコード仮想環境の構築ライブラリのインストールMNISTを読み込むモデルの準備モデルの構築モデルをコンパイルMNISTの前処理正規化ラベルの修正モデルの訓練モデルの評価学習の実行/中断学習 [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-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><ol><ol><li><a href="#toc2" tabindex="0">今日のゴール</a></li></ol></li></ol></li><li><a href="#toc3" tabindex="0">今日使うコード</a></li><li><a href="#toc4" tabindex="0">仮想環境の構築</a></li><li><a href="#toc5" tabindex="0">ライブラリのインストール</a></li><li><a href="#toc6" tabindex="0">MNISTを読み込む</a></li><li><a href="#toc7" tabindex="0">モデルの準備</a></li><li><a href="#toc8" tabindex="0">モデルの構築</a></li><li><a href="#toc9" tabindex="0">モデルをコンパイル</a></li><li><a href="#toc10" tabindex="0">MNISTの前処理</a><ol><ol><li><a href="#toc11" tabindex="0">正規化</a></li><li><a href="#toc12" tabindex="0">ラベルの修正</a></li></ol></li></ol></li><li><a href="#toc13" tabindex="0">モデルの訓練</a></li><li><a href="#toc14" tabindex="0">モデルの評価</a></li><li><a href="#toc15" tabindex="0">学習の実行/中断</a></li><li><a href="#toc16" tabindex="0">学習済みモデルの保存</a></li><li><a href="#toc17" tabindex="0">保存したモデルを使うには</a></li></ol></li><li><a href="#toc18" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

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



<p>AIの<span class="red">概要は学んだけど何から作ればいいんだろう</span>。という悩みをお持ちではありませんか？<br><br>今日はそんなあなたにピッタリのタスクを紹介します。コーディング自体は数分で終わります。</p>



<p>また、始めたばかりで100％の理解を求める必要はありません。AIはとても深い分野なので、50%理解できたらいいや程度の軽い気持ちで学習を進めましょう。その方が挫折することなく長期間続けられ、結果的にいつか50%の理解が90%以上の理解になる時がきます。</p>



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



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



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



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



<p>今日のゴールは下の写真のようにMNISTデータを使って、実際に正解率を出すところまでやっていきます。</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="126" src="https://ascend-beyond.com/wp-content/uploads/2024/02/10a409b62952ff98699128a593e88c03-1024x126.png" alt="ｃｍｄ" class="wp-image-904" style="width:840px;height:auto" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/10a409b62952ff98699128a593e88c03-1024x126.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/10a409b62952ff98699128a593e88c03-300x37.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/10a409b62952ff98699128a593e88c03-768x95.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/10a409b62952ff98699128a593e88c03-1536x190.png 1536w, https://ascend-beyond.com/wp-content/uploads/2024/02/10a409b62952ff98699128a593e88c03.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>また、当ページは<a rel="nofollow noopener" href="https://qiita.com/Ka-k" target="_blank">@Ka-k(KAI Kenzo)</a>という方の<a rel="nofollow noopener" href="https://qiita.com/Ka-k/items/2cd6f86b6aa00bf5e72b" target="_blank">環境構築</a>と<a rel="nofollow noopener" href="https://qiita.com/Ka-k/items/2cd6f86b6aa00bf5e72b" target="_blank">MNISTチュートリアル</a>の２ページを参考に書きました。KAIさんは初心者にとても良質な教材を提供されている方です。しかし、結構前に書かれているということもあり、コードが少しだけ古くなっています。<br><br>なので、今日はこのサイトを参考にしつつも今風にアレンジしつつ誰でも実装できるように解説していきます。<br>p.s.赤太字は当サイトで座学として解説済み&amp;解説予定のワードです。</p>



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



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



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

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

model = Sequential()

model.add(Dense(512, input_dim=(784)))
model.add(Activation(&quot;relu&quot;))

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


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

X_train = X_train.reshape(60000, 784)/255
X_test = X_test.reshape(10000, 784)/255



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


hist = model.fit(X_train, y_train, batch_size=200, verbose=1, 
                 epochs=10, validation_split=0.1)　#epoch数はお好みで

score = model.evaluate(X_test, y_test, verbose=1)
print(&quot;正解率(acc)：&quot;, score[1])

model.save(&quot;./ai-first.h5&quot;)
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.datasets </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> mnist</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Dense, Activation</span></span>
<span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.utils </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> to_categorical</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">(X_train, y_train), (X_test, y_test) </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> mnist.load_data()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">512</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_dim</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;softmax&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.compile(</span><span style="color: #FD971F; font-style: italic">loss</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;categorical_crossentropy&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">optimizer</span><span style="color: #F92672">=</span><span style="color: #E6DB74">&quot;sgd&quot;</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">metrics</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">[</span><span style="color: #E6DB74">&quot;accuracy&quot;</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train.reshape(</span><span style="color: #AE81FF">60000</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span>
<span class="line"><span style="color: #F8F8F2">X_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_test.reshape(</span><span style="color: #AE81FF">10000</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">y_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_train)</span></span>
<span class="line"><span style="color: #F8F8F2">y_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_test)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">hist </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.fit(X_train, y_train, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">200</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span></span>
<span class="line"><span style="color: #F8F8F2">                 </span><span style="color: #FD971F; font-style: italic">epochs</span><span style="color: #F92672">=</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">validation_split</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.1</span><span style="color: #F8F8F2">)　</span><span style="color: #88846F">#epoch数はお好みで</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">score </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.evaluate(X_test, y_test, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #66D9EF">print</span><span style="color: #F8F8F2">(</span><span style="color: #E6DB74">&quot;正解率(acc)：&quot;</span><span style="color: #F8F8F2">, score[</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.save(</span><span style="color: #E6DB74">&quot;./ai-first.h5&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc4">仮想環境の構築</span></h3>



<p>まずは仮想環境を作っていきましょう。作れればなんでもいいので、お好みのやり方でやってください。今回、私はコマンドプロンプト（cmd）から作る方法でやっていきます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="python -m venv 仮想環境名　#仮想環境の作成

仮想環境名/Scripts/activate #仮想環境の有効化(Windows version)
source 仮想環境名/bin/activate #仮想環境の有効化(Mac/Linux　version)

cd 仮想環境名/Scripts #Scriptsディレクトリまで移動

echo. &gt; ファイル名.py #Pythonファイルを作成

code . #vsCodeを開く" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">python </span><span style="color: #F92672">-</span><span style="color: #F8F8F2">m venv 仮想環境名　</span><span style="color: #88846F">#仮想環境の作成</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">仮想環境名</span><span style="color: #F92672">/</span><span style="color: #F8F8F2">Scripts</span><span style="color: #F92672">/</span><span style="color: #F8F8F2">activate </span><span style="color: #88846F">#仮想環境の有効化(Windows version)</span></span>
<span class="line"><span style="color: #F8F8F2">source 仮想環境名</span><span style="color: #F92672">/</span><span style="color: #F8F8F2">bin</span><span style="color: #F92672">/</span><span style="color: #F8F8F2">activate </span><span style="color: #88846F">#仮想環境の有効化(Mac/Linux　version)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">cd 仮想環境名</span><span style="color: #F92672">/</span><span style="color: #F8F8F2">Scripts </span><span style="color: #88846F">#Scriptsディレクトリまで移動</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">echo. </span><span style="color: #F92672">&gt;</span><span style="color: #F8F8F2"> ファイル名.py </span><span style="color: #88846F">#Pythonファイルを作成</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">code </span><span style="color: #F92672">.</span><span style="color: #F8F8F2"> </span><span style="color: #88846F">#vsCodeを開く</span></span></code></pre></div>



<p>pythonファイルを作成する場所はactivate.batやactivateと同じディレクトリにしましょう。</p>



<p>仮想環境には以下のメリットがあります。</p>



<ul class="wp-block-list">
<li>プロジェクトごとの環境の分離</li>



<li>クリーンアップの容易化</li>
</ul>



<h3 class="wp-block-heading"><span id="toc5">ライブラリのインストール</span></h3>



<p>では、次に必要なライブラリをインストールしていきましょう。これもcmdでやっていきます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="＃ニューラルネットワークやディープラーニングモデルの構築やトレーニングに使用されるライブラリ
pip install tensorflow

＃大規模なデータセットを使うときに用いるパッケージ
pip install h5py

＃モデルの構築、トレーニング、評価、デプロイメントなどを簡素化するライブラリ
pip install keras

＃画像やビデオのキャプチャ、変換、フィルタリング、特徴抽出、物体検出、画像の編集などに使う
pip install opencv-python" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">＃ニューラルネットワークやディープラーニングモデルの構築やトレーニングに使用されるライブラリ</span></span>
<span class="line"><span style="color: #F8F8F2">pip install tensorflow</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">＃大規模なデータセットを使うときに用いるパッケージ</span></span>
<span class="line"><span style="color: #F8F8F2">pip install h5py</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">＃モデルの構築、トレーニング、評価、デプロイメントなどを簡素化するライブラリ</span></span>
<span class="line"><span style="color: #F8F8F2">pip install keras</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">＃画像やビデオのキャプチャ、変換、フィルタリング、特徴抽出、物体検出、画像の編集などに使う</span></span>
<span class="line"><span style="color: #F8F8F2">pip install opencv</span><span style="color: #F92672">-</span><span style="color: #F8F8F2">python</span></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc6">MNISTを読み込む</span></h3>



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

(X_train, y_train), (X_test, y_test) = mnist.load_data()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.datasets </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> mnist</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">(X_train, y_train), (X_test, y_test) </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> mnist.load_data()</span></span></code></pre></div>



<p><br><strong><span class="bold-green">from keras.datasets import mnist</span></strong>  <br>＃Kerasライブラリの datasets モジュールから mnist データセットをインポートする<br><br><strong><span class="bold-green">(X_train, y_train), (X_test, y_test) = mnist.load_data()</span></strong> <br>＃<code>mnist</code> データセットから<span class="marker-under">訓練用データとテスト用データを読み込む</span><br>＃<ruby><code><strong>load_data()</strong></code></ruby> メソッドは、MNISTデータセットを読み込み、訓練用の画像データとラベル、テスト用の画像データとラベルをそれぞれ返す<br>＃訓練用の画像データは <code>X_train</code> に、訓練用のラベルは <code>y_train</code> に、テスト用の画像データは <code>X_test</code> に、テスト用のラベルは <code>y_test</code> にそれぞれ代入される</p>



<h3 class="wp-block-heading"><span id="toc7">モデルの準備</span></h3>



<p>空のSequentialモデルを作成して、後で層を追加してニューラルネットワークモデルを構築するための準備を整えます。</p>



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

model = Sequential()" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Sequential</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> Sequential()</span></span></code></pre></div>



<p><strong><span class="bold-green">from keras.models import Sequential</span></strong><br>＃Kerasライブラリの <code>models</code> モジュールから <code>Sequential</code> クラスをインポートしています。<code><strong>Sequential</strong></code> クラスは、ニューラルネットワークモデルを作成するためのクラスであり、<span class="marker-under">層を直線的に積み重ねて構築されるシンプルなモデル</span>です。<br><br><strong><span class="bold-green">model = Sequential()</span></strong><br>＃<code>Sequential</code> クラスのインスタンスを作成し、<code>model</code> 変数に代入しています。これにより、新しいSequentialモデルが作成されます。このモデルは、層を順番に追加していくことで構築されます。</p>



<table border="0" cellpadding="0" cellspacing="0"><tr><td><div style="border:1px solid #95a5a6;border-radius:.75rem;background-color:#FFFFFF;width:280px;margin:0px;padding:5px;text-align:center;overflow:hidden;"><table><tr><td style="width:128px"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16879483%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;"><img decoding="async" src="https://hbb.afl.rakuten.co.jp/hgb/39414777.169c3d99.39414778.be6498e6/?me_id=1213310&#038;item_id=20463208&#038;pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F8080%2F9784065238080_1_3.jpg%3F_ex%3D128x128&#038;s=128x128&#038;t=picttext" border="0" style="margin:2px" alt="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]" title="[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]"></a></td><td style="vertical-align:top;width:136px;display: block;"><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px;word-wrap:break-word"><a rel="nofollow sponsored noopener" href="https://hb.afl.rakuten.co.jp/ichiba/39414777.169c3d99.39414778.be6498e6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F16879483%2F&#038;link_type=picttext&#038;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIxMjh4MTI4IiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxLCJwcm9kIjowLCJhbXAiOmZhbHNlfQ%3D%3D" target="_blank" style="word-wrap:break-word;">ディープラーニング　学習する機械　ヤン・ルカン、人工知能を語る （KS科学一般書） [ ヤン・ルカン ]</a><br><span >価格：2,750円（税込、送料無料)</span> <span style="color:#BBB">(2024/3/4時点)</span></p></td></tr></table></div><br><p style="color:#000000;font-size:12px;line-height:1.4em;margin:5px;word-wrap:break-word"></p></td></tr></table>



<h3 class="wp-block-heading"><span id="toc8">モデルの構築</span></h3>



<p>3層のニューラルネットワークモデルを構築しています。入力層から隠れ層（<span class="bold-red"><a href="https://ascend-beyond.com/study/808/" target="_blank">ReLU</a></span>）への接続、隠れ層から出力層（<span class="bold-red"><a href="https://ascend-beyond.com/study/808/" target="_blank">Softmax</a></span>）への接続があります。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<a href="https://ascend-beyond.com/study/808/" title="【AI/座学編】高頻出な活性化関数まとめ" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-160x90.png 160w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-300x169.png 300w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-1024x576.png 1024w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-768x432.png 768w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-120x68.png 120w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5-320x180.png 320w, https://ascend-beyond.com/wp-content/uploads/2024/02/b0804adcb784ae1095a5d9b9999039d5.png 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【AI/座学編】高頻出な活性化関数まとめ</div><div class="blogcard-snippet internal-blogcard-snippet">ここでは、AIを実装する上で使用頻度の高い活性化関数を解説します。また、解説はAscendBeyond式にのっとり、複雑な概念理解には重きを置かず実装に必要な最低限の重要な知識のみを提供しています。座学で時間を浪費していては、AIを作るという本来の目的から離れるばかりですからね。やはり、座学よりも実践に時間を多く費やしてほしいので、座学は軽く頭に入れる程度にしてどんどん実践を積んでください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ascend-beyond.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ascend-beyond.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.02.22</div></div></div></div></a>
</div></figure>



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

model.add(Dense(512, input_dim=(784)))
model.add(Activation(&quot;relu&quot;))

model.add(Dense(10))
model.add(Activation(&quot;softmax&quot;))" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.layers </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> Dense, Activation</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">512</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">input_dim</span><span style="color: #F92672">=</span><span style="color: #F8F8F2">(</span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">)))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;relu&quot;</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model.add(Dense(</span><span style="color: #AE81FF">10</span><span style="color: #F8F8F2">))</span></span>
<span class="line"><span style="color: #F8F8F2">model.add(Activation(</span><span style="color: #E6DB74">&quot;softmax&quot;</span><span style="color: #F8F8F2">))</span></span></code></pre></div>



<p><strong><span class="bold-green">from keras.layers.core import Dense, Activation </span></strong><br>＃Kerasの <code>layers</code> モジュールから <code>Dense</code> クラスと <code>Activation</code> クラスをインポートしています。<span class="marker-under"><code><strong>Dense</strong></code> クラスは<span class="bold-red">全結合層</span></span>（密な層）を定義するためのクラスであり、<span class="marker-under"><code><strong>Activation</strong></code> クラスは活性化関数を適用</span>するためのクラスです。<br><br><strong><span class="bold-green">model.add(Dense(512, input_dim=(784))) </span></strong><br>＃<code>Dense</code> クラスのインスタンスを作成し、モデルに追加しています。この層は、<span class="bold-red">512個</span>のニューロン（ユニット）を持つ全結合層です。<code><strong>input_dim</strong></code> パラメータは入力の次元を指定しており、<span class="bold-red">784次元</span>の入力を受け取ることを示しています。<br><br><strong><span class="bold-green">model.add(Activation(&#8220;relu&#8221;)) </span></strong><br>＃活性化関数としてReLU（Rectified Linear Unit）関数を適用する層をモデルに追加しています。ReLU関数は、入力が0未満の場合は0を、それ以外の場合は入力をそのまま出力する関数であり、非線形性を導入するためによく使用されます。<br><br><strong><span class="bold-green">model.add(Dense(10)) </span></strong><br>＃2つ目の全結合層を追加しています。この層は10個のニューロンを持ち、出力層として機能します。入力次元は前の層から自動的に推定されるため、<code>input_dim</code> パラメータは省略されています。<br><br><strong><span class="bold-green">model.add(Activation(&#8220;softmax&#8221;))</span></strong><br>＃出力層にSoftmax活性化関数を適用する層を追加しています。Softmax関数は、クラス分類問題で各クラスに対する確率分布を生成するために使用されます。softmax関数によって、モデルの出力が各クラスに対する確率として解釈できるようになります。</p>



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



<p>モデルの損失関数として<strong>カテゴリカルクロスエントロピー</strong>、<span class="bold-red">最適化アルゴリズム</span>として<span class="bold-red">SGD</span>、<span class="bold-red">評価指標</span>として<span class="bold-red">正解率</span>を設定していきます。（これらの設定作業をコンパイルといいます）</p>



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



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



<p><strong><span class="bold-green">model.compile(loss=&#8221;categorical_crossentropy&#8221;, optimizer=&#8221;sgd&#8221;, metrics=[&#8220;accuracy&#8221;])</span></strong><br><br>＃<code><strong>model.compile</strong></code>　<br>: モデルをコンパイルするメソッドです。モデルをコンパイルすることで、損失関数や<span class="bold-red">最適化アルゴリズム</span>などの設定が確定されます。<br><br>＃<code><strong>loss="categorical_crossentropy"</strong></code>　<br>: 損失関数を設定しています。この場合、カテゴリカルクロスエントロピー（categorical crossentropy）が損失関数として指定されています。カテゴリカルクロスエントロピーは、<span class="red">多クラス分類問題</span>で使用される一般的な損失関数であり、予測と真のラベルの間の差異を測定します。<br><br>＃<code><strong>optimizer="sgd"</strong></code>　<br>：<span class="bold-red">最適化アルゴリズム</span>を指定しています。この場合、<span class="bold-red">確率的勾配降下法</span>（Stochastic Gradient Descent, SGD）が最適化アルゴリズムとして指定されています。SGDは、勾配を使ってモデルのパラメータを更新し、<span class="marker-under">損失関数を最小化する</span>ことを目指します。<br><br>＃<code><strong>metrics=["accuracy"]</strong></code>　<br>: モデルの<span class="bold-red">評価指標</span>を指定しています。この場合、<span class="bold-red">正解率</span>（accuracy）が指定されています。<span class="marker-under">精度は、モデルが正確に予測した割合</span>を示す指標です。</p>



<h3 class="wp-block-heading"><span id="toc10">MNISTの前処理</span></h3>



<h5 class="wp-block-heading"><span id="toc11">正規化</span></h5>



<p>Kerasでは0.0～1.0までの、float型の配列しか扱いません。また、Dense層が入力として受け取れるのは一次元配列のみです。つまり、MNISTデータセットの画像データ（28&#215;28）を１次元の画像データ、784次元(28&#215;28=784)のベクトルとして表現する必要があります。また、値の範囲を0から1の間に正規化する必要もあります。<br><br>＊画像データの次元数とベクトルの次元数は異なる概念です。</p>



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

X_test = X_test.reshape(10000, 784)/255" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">X_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_train.reshape(</span><span style="color: #AE81FF">60000</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">X_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> X_test.reshape(</span><span style="color: #AE81FF">10000</span><span style="color: #F8F8F2">, </span><span style="color: #AE81FF">784</span><span style="color: #F8F8F2">)</span><span style="color: #F92672">/</span><span style="color: #AE81FF">255</span></span></code></pre></div>



<p><strong><span class="bold-green">X_train = X_train.reshape(60000, 784)/255 </span></strong><br>＃訓練用の画像データ <code>X_train</code> を再形成しています。元の画像データは28&#215;28ピクセルの2次元配列であり、各ピクセルが0から255の値を取ります（白が0、黒が255）。<br>＃<code><strong>reshape(60000, 784)</strong></code> は、画像データを60000行784列の2次元配列に変形しています。これにより、各画像が28&#215;28=784次元のベクトルとして表現されます。<br>＃また、<code><strong>/255</strong></code> を使って画像のピクセル値を0から1の範囲にスケーリングしています。これは、ニューラルネットワークの入力として扱う際に、値の範囲を正規化するためです。<br><br><span class="bold-green"><strong>X_test = X_test.reshape(10000, 784)/255</strong><br></span>＃テスト用の画像データ <code>X_test</code> も同様に、同じ処理を施しています。テスト用の画像データも同様に784次元のベクトルに変形され、0から1の範囲にスケーリングされます。</p>



<h5 class="wp-block-heading"><span id="toc12">ラベルの修正</span></h5>



<p>Kerasではラベルデータを「バイナリ型」にする必要があります。バイナリ型とはデータを0と１だけで表現することです。つまり、２進数にするということです。つまり、ラベルデータを<span class="bold-red">one-hotエンコーディング形式</span>に変換すればいいのです。</p>



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

y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> tensorflow.keras.utils </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> to_categorical</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">y_train </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_train)</span></span>
<span class="line"><span style="color: #F8F8F2">y_test </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> to_categorical(y_test)</span></span>
<span class="line"></span></code></pre></div>



<p><span class="bold-green">from tensorflow.keras.utils import to_categorical<br></span>＃Kerasの <code>utils</code> モジュールから <code>np_utils</code> をインポートしています。<code>np_utils</code> モジュールには、ニューラルネットワークの学習に使用される便利な関数やユーティリティが含まれています。<br><span class="bold-red"><br></span><span class="bold-green">y_train = to_categorical(y_train)<br></span>＃訓練用のラベルデータ <code>y_train</code> をone-hotエンコーディング形式に変換しています。one-hotエンコーディングでは、各ラベルがベクトルの形式で表現され、対応するインデックスの要素が1であり、それ以外の要素が0となります。これにより、分類問題でのラベルの表現をより適切に扱うことができます。<br><span class="bold-red"><br></span><span class="bold-green"><strong>y_test = to_categorical(y_test)</strong><br></span>＃テスト用のラベルデータ <code>y_test</code> も同様に、同じ処理を施しています。すべてのラベルデータがone-hotエンコーディング形式に変換されます。<br><br>（Kerasのバージョン2.4.3以降では、<code>keras.utils</code> モジュールから<span class="marker-under"> <code>np_utils</code> モジュールが削除されました</span>。そのため、最新のKerasバージョンでは <code>np_utils</code> を使うことはできません。代わりに、ここでは<code>keras.utils</code> モジュールから <code>to_categorical</code> 関数を使用することにしています。）</p>



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



<p>訓練が開始されると、各エポックごとに訓練データと検証データの損失と評価指標が計算され、<code>hist</code> オブジェクトに保存されるようにします。</p>



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



<p><strong><span class="bold-green">hist = model.fit(X_train, y_train, batch_size=200, verbose=1,<br>epochs=10, validation_split=0.1)</span></strong><br><br>＃<code><strong>hist = model.fit</strong></code>　<br>: モデルの<span class="marker-under">訓練を開始するためのメソッド</span>です。<code>model</code> は訓練するニューラルネットワークモデルを指します<br><br>＃<code><strong>X_train, y_train</strong></code>　<br>: 訓練用の入力データ <code>X_train</code> とそのラベルデータ <code>y_train</code> を指定しています。このデータは<span class="marker-under">モデルの学習に使用</span>されます。<br><br>＃<code><strong>batch_size=200</strong></code>　<br>: ミニバッチのサイズを指定しています。<span class="bold-red">ミニバッチ学習</span>では、全データセットを小さなバッチに分割し、<span class="marker-under">各バッチごとにモデルのパラメータを更新</span>します。<code>batch_size</code> は1回のパラメータ更新に使用するデータのサンプル数を指定します。<br><br>＃<code><strong>verbose=1</strong></code>　<br>: 訓練中にログメッセージを表示するかどうかを制御します。<code>verbose=1</code> の場合、<span class="marker-under">進捗バーが表示</span>されます。表示した方がカッコいいですよ。（笑）<br><br>＃<code><strong>epochs=</strong></code><strong>3</strong>　<br>: エポック数を指定しています。<span class="marker-under">1つのエポックとは、全ての訓練データを1回学習することを指します</span>。<code>epochs</code> パラメータは、モデルが訓練データを何回反復して学習するかを指定します。<br><br>#<code><strong>validation_split=0.1</strong></code>　<br>: <span class="marker-under"><span class="bold-red">検証データ</span>の割合</span>を指定しています。訓練データの一部を検証に使用します。この場合、訓練データの10%が検証に使用されます。訓練中にモデルの性能を監視し、過学習を防ぐために使用されます</p>



<h3 class="wp-block-heading"><span id="toc14">モデルの評価</span></h3>



<p>先ほど訓練したモデルをテストデータを使って評価していきます。</p>



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



<p><span class="bold-green"><strong>score = model.evaluate(X_test, y_test, verbose=1) </strong></span><br>＃<strong><code>evaluate()</code> </strong>　：モデルの性能を評価するためのメソッドです。<strong>evaluatte()</strong>メソッドは、指定されたデータセットで<span class="marker-under">モデルを評価し、損失と評価指標（ここでは正解率）を返し</span>ます。<br>＃引数<strong> <code>X_test</code> </strong>はテストデータの入力、<code><strong>y_test</strong></code> はテストデータの出力（正解ラベル）を表します。<br>＃<code><strong>verbose=1</strong></code> は評価の進捗状況を表示する設定です。<br><br><span class="bold-green"><strong>print(&#8220;正解率(acc)：&#8221;, score[1])</strong><br></span>＃テストデータでの評価結果を出力しています。<code>score[1]</code> は、<code>evaluate</code> メソッドが返す評価指標のうち、正解率（accuracy）に対応する値を取得しています。この値は、モデルがテストデータで<span class="marker-under">正確に予測できた割合</span>を示します。</p>



<h3 class="wp-block-heading"><span id="toc15">学習の実行/中断</span></h3>



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



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

#中断する時は
CtrlキーとCキーを同時押ししましょう！" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #88846F">#実行</span></span>
<span class="line"><span style="color: #F8F8F2">ファイル名.py</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88846F">#中断する時は</span></span>
<span class="line"><span style="color: #F8F8F2">CtrlキーとCキーを同時押ししましょう！</span></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc16">学習済みモデルの保存</span></h3>



<p>訓練されたニューラルネットワークモデルを&#8221;MNIST.h5&#8243; という名前のファイルに保存しましょう。このファイルを後で読み込むことで、モデルを再利用したり、別のプログラムで使用したりすることができます。</p>



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



<p><strong><span class="bold-green">model.save(&#8220;MNIST.h5&#8221;)<br></span></strong>＃<code><strong>model</strong></code> は保存するKerasモデルを指します。<br>＃<code><strong>.save()</strong></code> メソッドは、指定されたファイル名でモデルを保存します。ここでは、&#8221;MNIST.h5&#8243; という名前のファイルにモデルが保存されます。拡張子 <code>.h5</code> は、HDF5形式で保存されることを示しています。</p>



<h3 class="wp-block-heading"><span id="toc17">保存したモデルを使うには</span></h3>



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

model = load_model(&quot;MNIST.h5&quot;)

hist = model.fit(X_train, y_train, batch_size=200, verbose=1, 
                 epochs=3, validation_split=0.1)" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki monokai" style="background-color: #272822" tabindex="0"><code><span class="line"><span style="color: #F92672">from</span><span style="color: #F8F8F2"> keras.models </span><span style="color: #F92672">import</span><span style="color: #F8F8F2"> load_model </span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">model </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> load_model(</span><span style="color: #E6DB74">&quot;MNIST.h5&quot;</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">hist </span><span style="color: #F92672">=</span><span style="color: #F8F8F2"> model.fit(X_train, y_train, </span><span style="color: #FD971F; font-style: italic">batch_size</span><span style="color: #F92672">=</span><span style="color: #AE81FF">200</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">verbose</span><span style="color: #F92672">=</span><span style="color: #AE81FF">1</span><span style="color: #F8F8F2">, </span></span>
<span class="line"><span style="color: #F8F8F2">                 </span><span style="color: #FD971F; font-style: italic">epochs</span><span style="color: #F92672">=</span><span style="color: #AE81FF">3</span><span style="color: #F8F8F2">, </span><span style="color: #FD971F; font-style: italic">validation_split</span><span style="color: #F92672">=</span><span style="color: #AE81FF">0.1</span><span style="color: #F8F8F2">)</span></span></code></pre></div>



<p><span class="bold-green"><strong>from keras.models import load_model </strong><br></span>＃Kerasの <code>models</code> モジュールから <code>load_model</code> 関数をインポートしています。<span class="marker-under"><code>load_model</code> 関数は、保存されたモデルを読み込むために使用</span>されます。<br><br><span class="bold-green"><strong>model = load_model(&#8220;MNIST.h5&#8221;)</strong><br></span>＃<code>load_model</code> 関数を使って、&#8221;MNIST.h5&#8243; というファイルからモデルを読み込んでいます。読み込まれたモデルは、<code>model</code> 変数に格納されます。<br><br><span class="bold-green">hist = model.fit(X_train, y_train, batch_size=200, verbose=1,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;epochs=3, validation_split=0.1)</span><br>＃<span class="marker-under">続きから学習を再開</span>することができます。<br>＃先ほどのコードと同じなので細かい説明は割愛します。</p>



<h2 class="wp-block-heading"><span id="toc18">まとめ</span></h2>



<p>おわり。お疲れさまでした。でも、意外と想像より簡単だったんじゃないですか？</p>



<p>また、今は100％の理解じゃなくもいいです。こーやって今日みたいに手を動かしていくことを繰り返していけば、必ず上達します。それがAscendBeyond式です。</p>



<p>ということで、これからもどんどん実践を積んでいきましょう！次回は畳み込み層を追加してより、<span class="red">画像処理の性能を向上</span>させていきましょう！</p>



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



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



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