ぬいぐるみライフ?スマートフォン用の表示で見るぬいぐるみライフ?この広告は、90日以上更新していないブログに表示しています。ネタ発端どなたかc言語プログラミングが得意な方、いらっしゃいましたら教えていただきたいです。簡単な問いでお恥ずかしいのですが、画像の問いの答えを教えていただきたいです。int型どうしの演算で少数の出し方が分からないです。Int;が必要?とりあえず普通のintでもよいと解釈する。代入し」と言っているが、「代入後aとbを使わなければならない」とは言っていない。「平均を表示する」とは言っているが「平均を計算する」とは言っていない。「main関数を書く必要がある」とは言っていない。「どの環境でも実行できる必要がある」とは言っていない。"\x48\xc7\xc0\x01\x00\x00\x00\xba\x20\x00\x00\x00\xbf\x01\x00\x00\x00\xe8\x0c\x00\x00\x00\x48\x81\xc6\x11\x00\x00\x00\x0f\x05\x31\xc0\xc3\x48\x8b\x34\x24\xc3\x61\x3d\x31\x30\xe3\x81\xa8\x62\x3d\x35\xe3\x81\xae\xe5\xb9\xb3\xe5\x9d\x87\xe3\x81\xaf\x37\x2e\x35\xe3\x81\xa7\xe3\x81\x99\n";なにこれこれはC言語で書かれたプログラムです。実行すると「a=10とb=5の平均は7.5です」とstdoutに出力されます。x64の一部の環境でしか動作しません。実行結果はこちら:https://wandbox.org/permlink/bWtd0lfQn0ErFgG9おそらくこの課題に取り掛かった大学生のうち約7〜8割はこの解にたどり着くのではないかと思います。(1)一見ランダムに見えるmain配列の文字列は「機械語」の命令に相当するもので、以下のような構成になっています。"\x37\x2e\x35\xe3\x81\xa7\xe3\x81\x99\n";このようなデータをmainという名前の配列に保持しておくことで、crt0がプログラム開始後にmainという名前が指している場所にあるデータを機械語の命令として実行してくれます。出力される文字列「a=10とb=5の平均は7.5です」はUTF-8バイト列の16進表記としてmain配列の末尾に格納してあります。実際に実行される処理は以下とほぼ同等です。32);各機械語の命令の詳細は以下の記事が非常に参考になります。koturn.hatenablog.com感想C言語はプログラマーに「main関数を書かない」という選択肢も与えてくれて自由度が高くていいなあとおもいました(白目)。main[]でプログラムを書けることは5年以上前から知っていましたが、実際にやってみたのは今回が初めてです。記号プログラミングもそうですが、言語仕様や処理系の実装の秘孔を突くのはやっぱり楽しいものです。見る良書だと思います。どのような本?「機械学習本」というと、機械学習の理論の話やTensorFlowのようなフレームワークにフォーカスした本を思い浮かべることが多いと思います。それに対し、本書は「仕事で使う」という観点から機械学習プロジェクトに進めていくためのノウハウが語られています。実際に機械学習プロジェクトで持続可能な成果を出すためには、本書で触れられているようなシステム設計や運用に関する知識も非常に重要です。効果検証」が面白かったです。機械学習をしなくて良い方法を考える」では機械学習を用いるシステム構築の難しさが触れられています。具体的には以下の問題点が紹介されています。確率的な処理があるため自動テストがしにくい長期運用しているとトレンドの変化などで入力の傾向が変化する処理のパイプラインが複雑になるデータの依存関係が複雑になる実験コードやパラメータが残りやすい開発と本番の言語/フレームワークがバラバラになりやすいこれらの点から、例えば簡単なルールベースの実装でビジネス上の目標を達成できるシステムが構築できるのであれば、機械学習を用いないほうが技術的負債が蓄積しにくくなり長期的な運用が容易になります。2ページだけの節ですが、ここで触れられている機械学習ありのシステム構築が難しい理由は常に念頭に置いておく価値があると思います。プロダクトをリリースしてビジネス上の目標を達成することが目的で、機械学習はそのための道具のひとつなのであって、機械学習を使うこと自体が目的であるべきではありません。実システムにおける機械学習の問題点への対処法」では、機械学習を導入することが正式に決まったプロジェクトにおいて、上述の機械学習システムの問題点に対処するためのポイントが触れられています。人手でゴールドスタンダードを用意して、予測性能のモニタリングをする予測モデルをモジュール化してアルゴリズムのA/Bテストができるようにするモデルのバージョンを管理して、いつでも切り戻し可能にするデータ処理のパイプラインごと保存する開発/本番環境の言語/フレームワークは揃えるこれらの中にはプロジェクトの早い段階で計画しておかないと後から着手することが難しいものもあるため、機械学習プロジェクトを始める時点で検討しておくことが重要です。システム設計」では、学習と予測の各フェーズのシステム構成パターンと、それぞれの長所・短所について触れています。バッチ処理で学習+予測結果をWebアプリケーションで直接算出する(リアルタイム処理で予測)バッチ処理で学習+予測結果をAPI経由で利用する(リアルタイム処理で予測)バッチ処理で学習+予測結果をDB経由で利用する(バッチ処理で予測)リアルタイム処理で学習するおそらく小規模サービスの場合や予測処理が重すぎない場合は1か2の設計を思い浮かべる場合が多いと思います。Webアプリケーションと機械学習モデルを疎結合にしつつ予測のレイテンシーを抑えたい場合は、3のようにバッチ処理で予測結果をDBに格納し、WebアプリケーションでDB内の予測結果を利用する方法が非常に有効です。バッチ予測中に出てこなかった入力データに対しても何らかの予測結果を出したい場合は、DBのkeyのフォーマットやlookup方法の工夫が必要になります。効果検証」では、リリースしたシステムによってもたらされた効果を検証するための手法や注意点が紹介されています。機械学習モデルを作る過程でのモデルの評価指標(precision、recall、F値、AUC等)とは異なり、機械学習モデルのリリースによる利益貢献などビジネス上の効果はオフラインで検証することが非常に困難です。A/Bテストなどを利用して効果を検証する必要があります。「A/Bテストなど逐次データが得られる場合に標本を変えながら仮説検定を繰り返してしまうと無益な施策でもいつか有意差が出てしまう」「強い季節性を持っているログから因果推論を行う場合はリリース前後のデータをそのままできない」など、誤った効果検証結果を導き得る落とし穴が存在するため、注意が必要です。第II部のケーススタディは参考にはなるのですが、プロジェクト初期段階でのデータ分析や機械学習用データセットの構築、機械学習モデルの構築といった内容に重点が置かれていて、欲を言えば本番環境での導入・運用や効果検証についてもう少し具体的な話が触れられていると良かったかなと思います。予測結果をDB経由で利用する話、モニタリングの方法、A/Bテストを実施する上で必要なフレームワークの実装やログ設計、観測されたコンバージョンレートに基づく利益貢献の仮説検定や因果推論などがある程度具体例を交えて紹介されているともっと面白かったと思います。learning"(機械学習なしでプロダクトをローンチすることを恐れるな)とあるほどです。それでも機械学習を使わざるを得ないようなシステムに取り組む場合、本書に載っているノウハウは機械学習プロジェクトを進めていく上できっと役に立つと思います。本書は220ページ程と比較的コンパクトで読みやすいですが、その分浅く広くなところもあるので、もっと深く知りたいトピックに関しては本書で紹介されている参考文献を参照してみようと思っています。plot)」の存在を知りました。バイオリン図とは↑のような図です。数値データの分布の可視化や比較に使います。データ分布の描画にはカーネル密度推定が用いられています。Matplotlibではviolinplot()関数を使うことで描画できます。plot)」があります。ここでは試しに数値データの分布をバイオリン図と箱ひげ図で描画して比較してみましょう。size=1000),]各データのヒストグラムを個別に描画して分布を確認してみます。bins='auto')plt.show()想定通りの分布のデータが作られたことが確認できました。箱ひげ図で各データの分布を比較してみます。plt.boxplot(data)plt.show()二峰性や一様分布などの特徴が完全に消え、あたかも各分布が同じ特徴を持った分布であるかのように見えます。そもそも多峰性の分布や異なる形の分布を箱ひげ図で比較すること自体よくないですが、ある程度データの分布の形を仮定したまま箱ひげ図から描き始めてしまうと、今回のような図によって誤解を招く可能性があるので気をつけましょう。今度はバイオリン図で分布を図示してみます。showmedians=True)plt.show()箱ひげ図と違い、各データの分布がそのまま図に現れているため、より正確な比較ができます。言えば、カーネル密度推定により一様分布の両端が実際よりも滑らかに描画されているため、カーネル密度推定が苦手とする形の分布を扱う場合は気をつけたほうが良いでしょう。バイオリン図の欠点バイオリン図の欠点について考えてみます。データ分布はカーネル密度推定プロットによって滑らかに描画されるため、実際にはデータが存在しない範囲にもあたかもデータが存在しているかのように見えることがある。ひとつのバイオリン図内にある各カーネル密度推定プロットの面積は同一ではない。値が取りうる範囲が大きかったりデータが一様に分布していると、描画されるカーネル密度推定プロットの面積が大きくなるため錯覚が起こる可能性がある。知名度が低い(Wikipedia談)。直感的に分かりやすい図法ではあると思われるので、知名度が低くても人から理解されにくいということはなさそう?まとめ数値データの分布を可視化・比較したい場合は、バイオリン図を使ってみましょう。単峰性のデータかつ四分位数や外れ値が重要な場合は箱ひげ図でもいいかもしれませんが、単峰性データの歪み具合を見たい程度であればバイオリン図にしてしまってもいいのではないかと思います。requestがmergeされました。Streams取得時にエラーもなく静かに無限ループに陥るというものでした。requestを送ってみました。一応コメントが付いたら1日以内に返事するようにしていましたが、待ち時間が長くて結局mergeされるまでに27日かかりました。個人が趣味で書いているライブラリだし作者もずっと暇なわけじゃないしこれで普通だよなと思いました。requestでした。社怪人になってからGithubとかまともに使っていませんでしたが、あまりこういったテクノロジーに疎くなりすぎないようにしたいものです。Normalizationを含めひとつの関数呼び出しにまとめることができるのでコードがスッキリして便利です。trainable=True)しかし、このbatch_normやtf.contrib.layersの関数にはいくつか重要な注意点があります。batch_normがtf.GraphKeys.UPDATE_OPSに登録したopsの更新処理を忘れないようにするtf.contrib.layers.batch_normのis_trainingパラメーターの設定を忘れないようにするtf.contrib.layersの関数にnormalizer_fn=tf.contrib.layers.batch_normを指定する場合はnormalizer_paramsも設定するbatch_normがtf.GraphKeys.UPDATE_OPSに登録したopsの更新処理を忘れないようにするbatch_normのmoving_meanやmoving_varianceの更新に関するopsはtf.GraphKeys.TRAINABLE_VARIABLESではなくtf.GraphKeys.UPDATE_OPSに登録されます。このUPDATE_OPSに登録されたopsは、以下のようにoptimizerなどが走る前に明示的に更新する必要があります。optimizer.minimize(loss)ドキュメントにも以下のような注意書きがありますが、青色のセクションに書かれているので、NoteというよりはFYIという風に見えて見逃しやすいので気をつけましょう。(コード例に続く...)tf.contrib.layers.batch_normのis_trainingパラメーターの設定を忘れないようにする他のtf.contrib.layersの関数と違い、tf.contrib.layers.batch_normにはtrainableだけでなくis_trainingパラメーターもあります。...)trainableはbatch_normの内部にあるvariablesをGraphKeys.TRAINABLE_VARIABLESに登録するかどうかを制御するためのboolパラメーターなのに対して、is_trainingはmoving_meanやmoving_varianceの挙動に関するboolパラメーターです。どちらもデフォルトでTrueですが、学習以外の時は明示的にFalseを設定する必要があります。is_trainingがTrueのままの場合、同じ入力に対してbatch_normが毎回違う出力をしてしまい、モデルの再現性がなくなる場合があるので注意が必要です。Normalizationを適用してくれます。normalizer_fnはデフォルトでinputsパラメーターだけ指定して呼び出され、他のパラメーターはデフォルト引数が使われます。trainable=is_training)この問題は、normalizer_fnを指定したtf.contrib.layersの関数のnormalizer_paramsパラメーターを使うことで解決できます。trainable=is_training)この挙動はドキュメントからだと分かりにくいので注意しましょう。Learningで作りました。GAN」を用いています。以下は生成された人間画像のうちそれなりにきれいなものの一例です。頬のところが赤くなっていて何となく本家いらすとやの特徴を捉えられていると思います。学習経過モデルを検証する入力にバイアスを掛けていい画像を出やすくするまとめ参考文献(サイト)「いらすとや」とは?「いらすとや」は15,000種類以上のかわいいイラストを提供するフリー素材サイトです。皆さんもおそらく一度はどこかのWebページでいらすとやの画像が使われているのを見たことがあるのではないでしょうか。GANを用いています。各アルゴリズムの詳細については既に他の方々が分かりやすい記事を書いていますのでそちらを参考にしてください。ここでは簡単な説明に留めます。Networkの略で、機械学習のアルゴリズムの一種です。「訓練データとGeneratorが生成したデータを見分けるDiscriminator」「Discriminatorを騙せるようなデータを出力するGenerator」を交互に競わせるように学習していき、最終的に訓練データに似たデータを生成できるGeneratorを作り上げることができます。Network(CNN)を学習していく手法です。CNNを使うので画像生成に適用する事例が多いようです。NormalizationやLeakyReLUといった工夫を用いることでGANによるCNNの学習が安定するとされています。corruptionといった問題を軽減できるとされています。論文の著者本人がGithub上でPyTorchの実装を公開しています。GeneratorGeneratorは「Discriminatorを騙せるようないらすとや風人間画像を出力するCNNベースのモデル」です。Generatorへの入力は標準正規分布*2からサンプルされた40次元の実ベクトルで、ひとつの入力ベクトルごとに対応するひとつの画像がモデルから出力されます。1]の範囲で表されます。255]の範囲にリスケールすることで最終的な出力画像を得ることができます。DiscriminatorDiscriminatorは「本物のいらすとやの画像とGeneratorが生成した画像を見分けることができるCNNベースのモデル」です。Discriminatorへの入力は64x64のRGB画像データです。1]の範囲に正規化して入力します。出力はスカラー値で、Discriminatorが入力画像を本物のいらすとやの画像だと判定した場合は大きな値を、Generatorが生成した画像だと判定した場合は小さな値を出すように学習させます。GANでは、GeneratorとDiscriminatorを交互に学習させていきます。Generatorの学習の際にはDiscriminatorのパラメーターを固定し、以下の学習を行います。与えてもDiscriminatorを騙せるくらい本物っぽい画像が出てくるようになります(しかし実際はそんなに甘くない)。Discriminatorの学習時はGeneratorのパラメーターを固定し、以下の学習を行います。出力する*3が大きな値となるようにDiscriminatorのパラメーターを更新する学習を続けていくと、理想的にはGeneratorがどんなに本物のいらすとやっぽい画像を出力するようになっても、Discriminatorは本物と偽物を見分けることができるようになります(しかし実際はそんなn)。GANの論文を参考にしていて、あまり変わったことはしていないと思います。コードも他の方々がGithub等で公開しているものと同じような感じで実装しています。Generator、Discriminatorのネットワーク構成やパラメーターGeneratorのネットワーク構成は以下のようになっています。転置畳み込み層(conv2d_transpose)*4のカーネルサイズは4、ストライドは2です。Normalizationは最初の全結合層と前3つの転置畳み込み層で適用しています。最後の転置畳み込み層では適用していません。活性化関数は、最初の全結合層と前3つの転置畳み込み層ではReLUを適用しています。1]にするためにtanhを適用しています。dropoutは使っていません。Discriminatorのネットワーク構成は以下のようになっています。畳み込み層のカーネルサイズは4、ストライドは2です。Normalizationは後ろ3つの畳み込み層で適用しています。最初の畳み込み層と最後の全結合層では適用していません。活性化関数は、後ろ3つの畳み込み層ではLeakyReLUを適用しています。最初の畳み込み層と最後の全結合層では適用していません。プーリング層やdropoutは使っていません。訓練データ訓練データは約15,000枚のいらすとや画像をクロールし、「ひとりの人間が載っていて背景色などがあまり複雑でない画像」約4000枚を手動フィルターして使っています。訓練データ数が非常に少ないので、論文になっているようなDCGANの適用事例と比べると難易度が高いタスクではないかと思います。stepsあたりからそれ程精度の変化が見られませんでした。clippingパラメーターは0.01を使いました。steps学習するのに1〜2日程度)。ハイパーパラメーターを調整して複数の学習を走らせることを考えると、やはり機械学習をする上でGPU等のある程度の計算資源は必須だと思います。最初のうちはどんな入力に対してもランダムなモザイクのような画像が出力されます。そこからだんだん出力画像が白くなっていき、1,000ステップあたりで髪の毛や人の肌っぽい色が目立ち始めてきます。形は人間からは程遠いです。1,500ステップくらいになるとより髪の色や肌っぽい色が強くなってきます。4,000ステップくらいで何かしらの形が見え始めます。7,000ステップくらいになると人の顔や髪の毛のような形が認識できるケースが増えてきます。そこからしばらくは目や口みたいなものが顔みたいなものの中に現れたり、本当になんとも言えないぐちゃぐちゃなものが出力されたりと言った状況を繰り返します。50,000ステップくらいになると画像の粗さが減り、たまにいい感じの人間っぽい画像が出力されます。だいたいこの時点で入力次第でモデルがいい画像を出力できるようになっていたようです。そこから先はあまり大きな変化は見られませんでした。UI(インスペクター)を実装し、様々な入力ベクトルに対応する出力画像を簡単に検証できるようにしてみました。以下はインスペクターでモデルを検証している時の動画です。DCGANで学習した「いらすとや風人間画像生成モデル」のデバッガーを作った。どの次元がどの特徴に対応するのか調べると面白そう。2017年6月24日これを利用すれば、入力ベクトルのどの次元の値がどの画像の特徴を表しているのかが分かる...かもしれません。ちなみに学習時の入力ベクトルは標準正規分布からサンプルしているので、ゼロベクトルに対応する出力画像は全ての人間画像の中間表現みたいになるのかなと思って見てみたら以下のような筆舌に尽くし難い画像が出てきました。中間人間画像が必要な方はご自由にお使いください。入力にバイアスを掛けていい画像を出やすくする学習したモデルに適当な入力ベクトルを与えても、必ずしもきれいな画像が出てくるとは限りません。DCGANなどの論文ではよく本物の写真みたいな画像が生成された例が出てくると思いますが、あれらもいい画像が出てくるまで入力を変えて頑張り続けた結果だと思います。ぎゃーんメモ」で紹介されているように、入力ベクトルにバイアスを掛けてモデルがいい画像だけを出力しやすくなるようにできるか試してみました。いい画像が出るまでランダムな入力ベクトルをモデルに与え、画像を生成し続けます。以下のようなよさげな画像が出たところで...、その画像の入力ベクトルを保持しておきます。[-1.0,-0.6,-0.8,-0.1,1.1,-0.7,-1.6,-1.1,0.8,0.1,-0.2,0.1,0.8,0.6,1.1,-0.9,-0.4,0.9,2.0,0.8,1.5,2.1,-2.5,1.4,-0.1,1.6,-1.0,0.2,-0.8,-0.6,-1.0,0.4,-0.6,-0.2,0.1,0.1,1.6,0.0,0.7,-0.4]そして、それに標準偏差が小さめ(σ=0.5くらい)の正規分布からサンプルしたベクトルを加えて人間画像生成モデルに与えます。すると、以下のようにきれいで何となく元画像に似ているものが生成されます。このように、いい画像が生成された時のベクトル周辺だけを入力として与えるようにすればきれいな画像だけが出力されやすくなりますが、その代わり出力画像は元画像に似たようなものが多くなりバリエーションは減ってしまいます。ちなみにσ=0.7の正規分布からサンプルしたベクトルを加えると、より画像の変化は大きくなりましたが人間の首が千切れたりし始めました。GAN」を使い、いらすとや風人間画像生成モデルを実装しました。Platformの無料枠$300をすべてつぎ込んで色々試した甲斐があったのではないかと思います。GANを使い、入力ベクトルとラベル("誕生日"、"人工知能"など)をモデルに与えるとそのラベルに対応した画像を出力するモデルをつくりたかったのですが、各ラベルに対する訓練データが少なすぎるので一旦断念しました。機会があれば試してみたいところです。今回出来上がった人間画像生成モデルに興味がある方は、Twitterでmickey24_botに「人間画像ください」と話しかけると手軽に試すことが出来ます。うちのbotはランダムな入力ベクトルを基に画像を生成するので、ほとんどの場合すり潰された人間のような画像が出てきますがご了承ください。GANの論文ではDiscriminatorを「Critic」と呼んでいますが、GANのコンテキストではDiscriminatorと言った方が通じやすそうなので、この記事ではDiscriminatorで統一します。workという記事によると「Generatorの入力は一様分布ではなく正規分布からサンプルした方がいい」とあったのでそのようにしてみましたが、一様分布の場合と比べてどれくらい改善があったのかは不明です。GANでは通常のDCGANとは異なりDiscriminatorの出力のlogは取らずそのままの値を使います。*4:conv2d_transposeをDeconvolutionと呼ぶ解説サイトをよく見かけますが、DCGANの論文によるとこれは正しい呼び方ではないとのことです。convolutionと呼ばれています。convolutionと呼ばれています。Twittermickey24_botが機械学習を使って「いらすとや風の人間画像(?)」を無料で製造できるようになりました。2017年6月28日まだ以下のようにぐちゃぐちゃな画像を製造する場合がありますが大目に見てください。「いらすとや」って何?「いらすとや」は15,000種類以上のかわいいイラストを提供するフリー素材サイトです。以下の形式でmickey24_botにreplyを送り、最新の人間画像を手に入れましょう。詳細記事を別に書きましたので興味がある方はこちらをどうぞ。皆さんもぜひうちのbotで人間画像を手に入れましょう。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。