21 Jun 2018, 05:13

Dockerで立ち上げたRails + MySQL 環境をRubyMineで接続

はじめに

Dockerで立ち上げた、Railsサーバ、MySQLサーバに RubyMineから接続する方法を紹介します。

Dockerを利用して、Rails環境をたちあげる手順は、前回の記事を参考にしてください。

RailsサーバにRubyMineで接続

これで実現できることは、ローカルPCに RubyやRailをインストールしてなくても、 リモートにあるDocker内のRubyリモートインタプリタを利用して、RubyMineが動作することだ。

  • 設定 > 言語&フレームワーク > Ruby SDK及びGemを選択。
  • +の追加ボタンを押す。新規リモートを選択。
  • Docker Composeを選択し、以下の図のように設定
    • サーバ: 好きな名前
    • 構成ファイル: ./docker-compose.yml
    • サービス: docker-compose.ymlで定義したサービス名

https://gyazo.com/678a9bcd1d6a9a6d89923067d63640fb

これで、リモートインタプリタとしてDocker内のRubyが利用できる。

MySQLサーバにRubyMineで接続

これで実現できることは、ローカルPCに MySQLをインストールしてなくても、 リモートにあるDocker内のMySQLを利用できる。RubyMineは、DBのための見やすいViewerを提供する。

Docker内で立ち上げたMySQLと、ローカル環境ですでに立ち上げていたMySQLがどちらもPort 3306 を利用していたので、 Dockerが立ち上がらなかった。

docker-complse.ymlを以下のようにして、3306 > 3307にポートフォワーディングする設定を書いた。

db:
  image: mysql:5.5
  volumes:
    - db-volume:/var/lib/mysql
  environment:
    MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
  ports:
    - 3307:3306
  • データベースビューで+の追加ボタンを押す。
  • データ・ソース > MySQLを選択
  • 以下のように設定。

https://gyazo.com/c41c17d670472b824692b6a8d10b0ee6

これで、データベースの中身がグラフィカルに分かるようになりました。

https://gyazo.com/b60d989df0987c5732786d7a14e35abe

おわりに

Dockerのすごさがようやくわかってきたかもしれない。

19 Jun 2018, 01:23

Ruby on Rails + MySQL 開発環境を Dockerで構築

はじめに

TechAcademyの Webエンジニアになるべく、Webアプリケーションコースを受講している。

受講の感想はあとで書くとして、このコースの課題としてRailsアプリをつくることになった。

自分のPCはUbuntuなので、環境は比較的容易に作成できるものの、やはりローカル環境はあまり汚したくないので、 流行りのDockerを利用することにした。けっこう、この手の情報は Web上になかったので、まとめてみる。

Dockerを、正確には Docker Composeを利用することで、Railsのコンテナと MySQLのコンテナを Dockerで動かし、 Rails server, DB serverをローカル環境にインストールすることなく、開発が可能になるのだ。

それでは、いってみよう。

設定ファイルの用意

Gemfile, Gemfile.lock の準備

Docker内で bundle install を実行して railsをインストールするために, Gemfileを用意。

source 'https://rubygems.org'
gem 'rails', '5.0.6'

空の Gemfile.lockも用意。

Dockerfileの準備

以下のような、Dockerfileを用意。

FROM ruby:2.4.1
RUN apt-get update -qq && apt-get install -y build-essential nodejs
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app

docker-compose.ymlを用意

webと dbの2つのコンテナをたちあげる docker-compose.ymlを用意。

version: '3'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app
    ports:
      - 3000:3000
    depends_on:
      - db
    tty: true
    stdin_open: true
  db:
    image: mysql:5.5
    volumes:
      - db-volume:/var/lib/mysql
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
volumes:
  db-volume:

docker-composeの実行

Railsのコンテナを起動してRailsのプロジェクトを作成する。

$ docker-compose run web rails new . --force --database=mysql --skip-test

Railsイメージのビルドを実行する。

$ docker-compose build

config/database.ymlのdefault内の項目 host: localhostを dbにを修正。

コンテナをデタッチドモード(バックグラウンド)で実行する

$ docker-compose up -d

RailsのコンテナでDB作成のタスクを実行する

$ docker-compose run web bundle exec rake db:create

マウントしたvolumeの書き込み権限がない問題

Dockerの操作は基本すべてroot権限で実行されるので、生成されたRailsアプリの所有権が root:root となる。ログインユーザーに変更しておく。

$ sudo chown -R $USER:$USER .

16 Jun 2018, 22:33

富士通コンピュータテクノロジーズ(FCT)を退職します

はじめに

退職願も受理されたようなので自分も退職エントリを書いてみようと思うのだが、退職エントリというものはとかく辞める会社に対するマイナスな内容だったり、ネガティブな内容だったりで、読んでいてあまりよいものではない。そこで、自分が退職エントリを書く心がけとして、辞める理由やネガティブなこととかは書かないようにしたい。

これまでのこと

富士通コンピュータテクノロジーズに2010.04から新卒入社して、ソフトウェア開発者を8年やってきました。

職務経歴書っぽいけど、つらつらと今までの経歴を書きます。

  ストレージシステム(ETERNUS DX) ファームウェア開発 201004-201401
  [概要] システム制御、とくにエラーリカバリの機能
  [担当] 詳細設計、プログラミング、評価
  [技術] C言語, VxWorks, Clearcase

富士通のストレージシステム ETERNUS の S2, S3シリーズについて、新卒から4年間携わってきた。

  社内R&D 201402-201407
  [概要] インフラ機器を管理するためのアプリケーションのプロトタイプの実装
  [担当] プログラミング、評価
  [環境] Ruby, RSpec, Selenium, RubyTk, Excel VBA, Subversion

窓ぎわエンジニアとして部内の研究開発費を使って、 アプリケーション開発をしていたが開発中止になって長くは続かなかった。

  WAN 高速化 研究開発 201408-201502
  [概要] Windowsのファイルアップロード、ダウンロードの高速化についての研究開発
  [担当] 詳細設計、プログラミング、評価
  [技術] Java6, Windows, Wireshark, Subversion

遠隔地からのファイルアクセスを高速化するデータ転送技術を開発 : 富士通

  Automotive Grade Linux(AGL)プロジェクト 研究開発 201503-201506
  [担当] リサーチ

開発中止。

  インフラ管理ソフトウェア開発 (ServerView Infrastructure Manager) 201507-201512
  [概要] インフラ機器を管理するためのソフトウェア開発
  [担当] 要件定義、基本設計
  次世代ストレージシステム ミドルウェア開発 201708-201806
  [概要] ソフトウェアアップデート、エラーリカバリ機能開発
  [担当] 詳細設計、プログラミング、評価

現在開発中なため、機密情報に触れるかもしれないので書きません(>_<)

会社のこと

うちの会社、ネット上に情報があまりないので、今後の就活生のみんなのために企業文化やらを書いてみる。機密情報に触れるようなことは書きません。

組み込み開発の専門会社と名を売っているのだけれども、実は幅広く色んな業務をしていてそこまで組み込みに偏っているわけではない。組み込みソフト開発というと、C/C++なイメージが自分のなかではあるのだけれども、実際はC/C++の仕事ばっかりやっているかというとそうでもない。C#やJavaやRuby, Pythonなどなど。

昔から富士通本体からの受託製品開発をしてきた。サーバ、ストレージ、ネットワーク、携帯、PCなどなど。ただし、それは変わりつつある。富士通のビジネスモデルがものつくりからサービスの提供へとかわっていって、ものつくりから離れてきた。この傾向は今後も続いていくと思われる。最近の傾向として、富士通本体からの受託以外にもチャレンジしている。グループ会社や他社の受託とか、自主ビジネスとか。まあようは、部署によって、富士通のプロダクト開発以外にもいろんなことをやっている。

大企業のお膝元なので、安定している。給料や福利厚生も富士通グループは一律平等だ。川崎工場の敷地内に本社があるため、建物はボロいものの、工場内の施設も利用できる。ただ、仕事も対等かというと、全然そんなことはない。親会社の富士通から受託で仕事をもらっているので、立場上上下関係ができている。そこは親会社子会社の関係上、しかたがない。

家庭を大切にしているひとや、趣味やプライベートを充実させようとしている人が多い気がする。エンジニアは家に帰っても技術を磨くために勉強するべきだと思うが、いっぽうで仕事は仕事として割り切って趣味を充実させたいという考え方はあってもよいと思っている。技術動向にのんびりしているひとが多い。まあようは意識やレベルがけっこう低いのだ。

辞める理由

円満退職をしたいので、書きません(>_<)

これからのこと

次のお仕事が決まっていません。フリーランスのWEBエンジニアになろうと思っていて、ここ数ヶ月はとりありず退職金で食いつなぎながらRuby on Railsの勉強と筋トレをしようと思っています。お仕事ください!

10 Jun 2018, 22:17

そうだ、ひきこもろう

現在転職を考えているのだが、最近フリーランスに憧れてきた。結論から書くと、

Ruby on Railsを学んで、在宅フリーランスエンジニアにオレはなる!

フリーランスに憧れる3つの理由

フリーランスに憧れる理由は以下のとおり。順番にコメントする。

  • リモートワークがしたい
  • コードをもっと書きたい
  • 金を稼ぎたい

リモートワークがしたい

会社員とか、朝がつらくて無理だ。会社から徒歩3分の場所に住んでも遅刻するので、どうしようもないと思う。

なので、家から仕事したいなとか、密かに妄想し始めた。リモートワークをしたい。

リモートワークができれば、朝ゆっくり起きることができる。

自宅で作業できれば、まったりおいしいコーヒーを飲みながら、Jazzを聴きながら仕事できたりする。 自慢のトリプルディスプレイの30万の機械学習用パソコン、ゲーミングチェアで仕事ができる。 または気分が乗らないときは、カフェにPCを持ち込んでドヤったり、勉強カフェに行って仕事ができる。いわゆるノマドワーカー。

コードをもっと書きたい

この前自分の仕事を振り替えってみると、ちっとも会社は自分にコードを書かせてくれていないことが分かった。

上の記事にも書いたのだが、自分はプログラマだと思っていて、もっとプログラミングをしたいのに、実際はあまりプログラミングをしていない。 なにをしているかというと、仕様書つくったりテストしたり、上流ではないのだが、下流でもない。なんとも中途半端な中流ばかりをしている気がする。

これからもっとコードがかけないことが予想される。OSSを組み合わせてそれを評価したり、リーダになったり上流をまかされる傾向が強い。

プログラマとして、もっと自分は成長したいのだ。WordやExcel、パワポ職人になりたくて、エンジニアになったのではない。

フリーランスになれば、下流のコーディングの仕事にあふれている。上流をすることはあるかもしれないが、仕事は選べるのでコーディングを選べばよい。

金を稼ぎたい

エンジニアで年収1000万を越えるには、どうすればいいか?

  • マネージャー
  • コンサル
  • 外資系
  • フリーランス

マネージャーとコンサルって、ソフトウェア開発から離れてるよね。自分がマネージャーにはなれないな。コンサルはデータアナリストにならばいいかもしれないが、論理的思考で抜きん出る自信があまりない。 外資は英語を使わないといけない、まあ使えるけどね。

そこで現れるフリーランスという道!金持ちになるにはこれではないか??

今年、350-400万くらいしか年収なかったので、年収を倍にしたい。年収をあげるにはフリーランスしかない!

リモート案件についての調査

リモート案件をとってくるにはどんな仕事を選べばよいか?いろいろ調べると、たどり着くところは、一つ。

ずばり、WEB系

Web系は低予算の案件が多い,案件の数が多い、短期プロジェクトが多い、などの理由から WEB系。

残念ながら、リモート案件は、今現在多くない状況だ。しかし、時代は働き方改革。これから、どんどんリモートワークが導入されていくことは明らか。風はこっちに吹いている!

今まで、PythonやAIの勉強をしていてデータサイエンティストになりたいとおもっていたけれども、ここでまさかの方向転換だ。

リモート・非常駐、在宅の案件はどの言語が有利か??

ちなみに、私ができるのは、C言語、Java、Python。

  • Java … 全然ダメ。常駐型SIerの言語。
  • Python … 機械学習、 AIで単価がいいけれども、リモート案件はない。
  • Ruby(Rails)
  • PHP

Ruby on Rails か PHPの2択だ。Rubyは3ヶ月間だけ仕事で使ったことがあって馴染みがあるので、Railsを選ぼうと思う。

参考までに今回調査に使ったサイトは、以下。

以下のエージェントは、常駐型の仕事しか紹介されていない。

結論

Ruby on Railsを学んで、在宅フリーランスエンジニアにオレはなる!

フリーランスを目指すときの信条は以下のとおりだ。

  • 常駐型よりもリモート案件であること
  • 上流よりも下流であること
  • 単価よりも成長できること

23 May 2018, 02:54

fast.ai の機械学習講座を受けた

はじめに

fast.ai ジェレミーハワード氏の実践機械学習講座。

2017年に全世界で話題を呼んだ、Practical Deep Learning for CodersのMachine Learning版だ。

今回も kaggle はフル活用

fast.aiは課題の題材にkaggle のコンペを利用するところが面白い。

それは、教育の哲学が、Top-Downで実施することを重視しているからだ。 理論よりも、まずは手を動かすことによって、楽しむ。

今回も、以下のコンペが取り上げられる。

Random ForestとLogisticRegression

驚くことなかれ、Lesson1-7までずっとRandomForsetの解説がある。 一つの動画が1.5時間名て、10時間以上 RandomForestを解説する。 使い方から、仕組みまでさらい、さらにはスクラッチ実装まで。

それをこえると、今度はPyTorchによるLogisticRegressionの解説が、6時間くらいある。

Tree系、Linear系、合わせて16時間をCodeベースで丁寧に解説。

授業内容

シラバス

Train vs test
    Effective validation set construction
Trees and ensembles
    Creating random forests
    Interpreting random forests
What is ML? Why do we use it?
	What makes a good ML project?
	Structured vs unstructured data
	Examples of failures/mistakes
Feature engineering
	Domain specific - dates, URLs, text
	Embeddings / latent factors
Regularized models trained with SGD
	GLMs, Elasticnet, etc (NB: see what James covered)
Basic neural nets
	PyTorch
	Broadcasting, Matrix Multiplication
	Training loop, backpropagation
KNN
CV / bootstrap (Diabetes data set?)
	Ethical considerations

Lesson1

Random Forestをつかって、 Kaggleの Blue Book for Bulldozersコンペに挑戦。

Lesson2

Lesson1の続き。Random Forest の解説。決定木からバギングまで。

また、validationを利用した、パラメータチューニングについて。

また、Lesson2までを通じて一通りの機械学習コンペの作法を学ぶ。 kaggleからのデータダウンロード、前処理、Random Forest、提出。

Lesson3

Lesson1, 2で学んだ内容を、以下のコンペに適用してみる。 30thになれるので、モデルをどんどん改良してねとか。

Corporación Favorita Grocery Sales Forecasting - https://www.kaggle.com/c/favorita-grocery-sales-forecasting

残りの時間は、再びBulldozersコンペに戻り、解析結果の解釈方法について話される。 feature importance, feature selectionの話。

Lesson4

メモするの忘れた。まだ Random Forest.

Lesson5

Validation戦略、主にクロスバリデーションとか。

後半は、Random Forest のスクラッチ実装を開始。 RandomForestだけで、8時間くらいたっているのですが。。。

確認したら、Lesson6,7も RandomForestだ。みっちり10時間以上だな。

Lesson6

Machine Learningとは、という話がここでようやくでてくる。この記事の説明。 - https://www.oreilly.com/ideas/drivetrain-approach-data-products

その後、今まで説明した概念を振り返り説明する。

Lesson7

Random Forest のスクラッチ実装。 RandomForestの実装は簡単で実はそこに利用されてるDecisionTreeが難しい。

すみません、この動画は飛ばしてみました。

この回で、ようやく RandomForestは終わり。次は、ニューラルネット。

Lesson 8, 9, 10

ニューラルネットワークの説明。PyTorch登場。MNISTの一層のネットワークによる分類を実装。

yTorchをつかって、LogisticRegressionをスクラッチ実装していく。6時間。

コードの一行一行を丁寧に解説していく。正則化などのテクニックも合わせて紹介される。

しかし、この一連のPyTorchの実装は私は飛ばしました。

Lesson 11

前半は、PyTorchによるSDGの実装の振り返り。

後半は、時系列データに対する扱いをということでRossmanコンペの解説だ。

Lesson12

Rossmanコンペの解説。

表形式データに対して、昨今は ニューラルネットでのアプローチで あまりfeature enginneringしなくてもいい精度が出るとのこと。

最後に、講座の振り返り。 Tree系はRandomForestsを、Linear系はLogisticRegressionをやったよね? フルスクラッチで実装もできたよね?じゃあ、大丈夫だ。

そして、最後の最後にMachine Learningと倫理についてのお話。ここは飛ばしました。

14 May 2018, 17:47

Deep Learningで出会い系アプリ tinder の画像判定をしてlikeを自動化する

はじめに

スケベとDeep Learningが出会うとき、技術の進化は訪れる!

ということで、出会い系アプリtinderをpythonからいじる pynderを試してみました。

そして、Deep Learningの無駄遣いをして、画像データを元に美人判定をして、 美人ならばlikeを、そうでなければnopeをすることをしてみました。

今回の記事は、以下の記事に触発されています。 - Deep Learning (Machine Learning) applied to Tinder – Philippe Remy – My Blog.

pynderをいじる

まずは、インストールから。 - https://github.com/charliewolf/pynder

$ pip install pynder

facebook トークンの取得

https://tinderface.herokuapp.com/ にアクセス。

GET STARTEDを押すことで、ガイドラインが表示されるので、それに従って tokenを取得する。

はじめの一歩

以下のようなサンプルソースを動かす。

import pynder
session = pynder.Session(facebook_auth_token) # 取得したaccess tokenを設定

for user in session.nearby_users():
    print(user.name)

名前が取得できました。

M
みっ
Charlene
はるな
詩羚
Yuki
Mi
Nattarawan
みなみ
Marina
かな

画像データを手に入れる

これでtinderのユーザの画像データが取得できました。

users = session.nearby_users()
user = next(users)

import urllib.request
 
url = user.thumbnails[0]
savename = "test.png"
 
png = urllib.request.urlopen(url).read()
with open(savename, mode="wb") as f:
    f.write(png)

like, nopeを送信する

like, dislikeのメソッドを呼び出すことで, likeとnopeを送信できます。

user.like
user.dislike

これで、pynderの調査は終わり。次は、Deep Learningです。

Deep Learningで美人判定

人工知能に美人かそうでないかを判定させるというのは、いかがなものかと思うのだが、 それは置いておいて、美人判定をする方法を調べました。

先行事例

SCUT-FBP5500 Dataset

SCUT-FBP Datasetというものがあった。 顔写真のデータと、その表情がどのくらい魅力的かどうかを5 段階評価でラベルづけされたもの。

美人かそうでないかの二値分類をするときの学習に使うためのラベルづけが大変そうだと思ったがか このデータセットを使って学習ができそうだ。1,2,3点の人はブス、4,5の人は美人と判定する。

実験

SCUT-FBP のデータセットを利用して、美人判定モデルを作成しました。 詳細は、gistに譲りますが、このモデルでは、85% の精度を達成できた。

以下、要点を列挙。

  • データセットの 女性だけを利用。2250枚。そのうちの1/5をvalidationとして利用。
  • fastai(PyTorch)ライブラリを利用。ResNet32をファインチューニング。
  • チューニング方法は過去記事参照。85%の精度。
  • targetラベルは、ratingを利用。3.0以下をnope, 3.0以上をlikeと分類するようにする。

tinder の画像から推論

画像データの取得、モデル作成とできたので、次は画像データを元に like/nopeを判定する。

like

nope

を、なかなかよさそうじゃんと思ったのだけれども、犬を美人判定にかけたらlikeと判定されてしまった。。 いやいや、犬は、好きではないのですが。。

まとめ

以下ができた。

  • pynder を利用して、tinderから画像データの取得
  • deep learning を利用して、美人判定モデルの構築
  • 美人判定モデルからの like/nope判定の自動化

美人判定モデルの精度がよかったら、ここから機械学習アプリの作成に移るところだった。 しかしながら、判定結果に不満があり、アプリ作成までは実施しないことにした。

今後の課題は、

  • 人判定のモデルをつくる。Object Detection?? 犬をlikeと判定するようではダメだ。
  • 画像以外の特徴量もまぜる。紹介文とか。NLP。
  • データセットを多くする。自分でラベルづけをしていって、それを学習していく。

現在開催中のkaggleのavitoコンペがこのtinderの問題に似ている気がするので、 avitoコンペで培ったkaggle力を無駄に利用して取り組みたい。

また、調べてみると、arxivにもtinder関連のpaperがいくつかあるようだ(スケベめ)。これを読んでいこう。

04 May 2018, 09:48

fast.ai par1 lesson4 Tabularデータの攻略方法メモ

はじめに

この記事では、Tabular(表形式)データに対しての攻略方法についてメモする。

詳しくは、以下の参考記事を参照。

この記事では、オリジナルのデータに対してこの技をどうやって適用するか、 動画のなかでコメントされていたので、それを書く。

TabularデータにDeep Learningを適用するためのステップ

step1

カテゴリカルデータと、数値データのカラムを並べる。

cat_vars = ['Store', 'DayOfWeek', 'Year', 'Month', 'Day', 'StateHoliday', 'CompetitionMonthsOpen',
    'Promo2Weeks', 'StoreType', 'Assortment', 'PromoInterval', 'CompetitionOpenSinceYear', 'Promo2SinceYear',
    'State', 'Week', 'Events', 'Promo_fw', 'Promo_bw', 'StateHoliday_fw', 'StateHoliday_bw',
    'SchoolHoliday_fw', 'SchoolHoliday_bw']

contin_vars = ['CompetitionDistance', 'Max_TemperatureC', 'Mean_TemperatureC', 'Min_TemperatureC',
   'Max_Humidity', 'Mean_Humidity', 'Min_Humidity', 'Max_Wind_SpeedKm_h', 
   'Mean_Wind_SpeedKm_h', 'CloudCover', 'trend', 'trend_DE',
   'AfterStateHoliday', 'BeforeStateHoliday', 'Promo', 'SchoolHoliday']

step2

どのindexがvalidation setなのかを設定する。

train_ratiotrain_rat  = 0.75
train_size = int(samp_size * train_ratio); train_size
val_idx = list(range(train_size, len(df)))

step3

DataFrameから、dataオブジェクトを作成。

md = ColumnarModelData.from_data_frame(PATH, val_idx, df, yl.astype(np.float32), cat_flds=cat_vars, bs=128,
                                       test_df=df_test)

step4

embeddingするサイズを求める。

cat_sz = [(c, len(joined_samp[c].cat.categories)+1) for c in cat_vars]
emb_szs = [(c, min(50, (c+1)//2)) for _,c in cat_sz]

step5

学習モデルの作成

mm  =  md.get_learner(emb_szs, len(df.columns)-len(cat_vars),
	            0.04, 1, [1000,500], [0.001,0.01], y_range=y_range)

step6

学習

m.fit(lr, 5, metrics=[exp_rmspe], cycle_len=1)

03 May 2018, 20:53

fast.ai Practical Deep Learning for Corders 2018

はじめに

今年のGWにまとめてfast.aiの Practical Deep Learning for Coders 2018 を受けました。

去年の記事はこちら。

講座の特徴

主に、2017との比較から

  • フレームワークがKerasからPyTorchへ
  • 最強のノウハウがつまったfastaiライブラリ

講座で扱うKaggleコンペ

fast.aiといえば、Kaggleコンペの実践的な攻略が魅力。 2018でも、以下のKaggleコンペが扱われました

各Lessonの内容メモ

Lesson1

受講したときから時間が経ってしまったので、忘れてしまいました。この記事とかが詳しい。

Lesson2

別記事にまとめました。

Lesson3

CNNの仕組み、ConvolutionのExcelによる解説。このあたりは、去年と同じなので飛ばしました。

半分の時間をつかって、Kaggleコンペの衛生写真からの多ラベル画像分類。

Lesson4

Structured Deep Learnng. 構造化データに対する DLのアプローチにを紹介。 なんでも、これをつかうと黒魔術的な特徴量設計をせずとも、いい精度がでるとか。

1時間弱、みっちり語られる。Kaggle の Rossmmanコンペがみっちり紹介される。

残りの時間でRNNのイントロと、強調フィルタリンクイントロ。

Lesson5

折り返し地点。今までは、faataiライブラリを中心に、高レベルから外観を俯瞰して全体像を眺めてきた。 ここからは、PyTorchをつかって、がっつりコーディングの解説が入る。

この回では、前半をつかって 強調フィルタリングの PyTorchによる実装が解説される。

また、後半は、Excelをつかった 最適化手法のデモ。

Lesson6

強調フィルタリングの解説が続く。その後、Rossmannの解説。

後半は、がっつり RNN。PyTorchでスクラッチから実装してみてねとのこと。 今回は時間がしないので この課題はパス。

Lesson7

前半は、RNN、とくに GRUの解説。これも code ベースでの説明。

後半は、CNNへ戻ってくる。PyTorchを使った、ResNetsのスクラッチ実装解説。題材は、CIFAR10.

最後に、Part2はもっと難しいので、Part1の内容を理解してから望んでねとのこと。はい、ムズいのは知ってます。

03 May 2018, 14:45

fast.ai part1 lesson2 画像分類コンペでのゴールデンルール

はじめに

fast.aiの Lesson2の動画をみているのだけれども、これがいい。

次から次へと新しい手法が紹介され、 それらはすべてfast.aiライブラリに実装されているとのこと。

そして、画像分類コンペのゴールデンルールが示される。

  1. Enable data augmentation, and precompute=True
  2. Use lr_find() to find highest learning rate where loss is still clearly improving
  3. Train last layer from precomputed activations for 1-2 epochs
  4. Train last layer with data augmentation (i.e. precompute=False) for 2-3 epochs with cycle_len=1 Unfreeze all layers
  5. Set earlier layers to 3x-10x lower learning rate than next higher layer
  6. Use lr_find() again
  7. Train full network with cycle_mult=2 until over-fitting

参考:

あまり理解していないので間違っていることを書くかもしれなけれども、 講座で紹介されたテクニックのメモ。

ゴールデンルールで使われているテクニック

学習率(learning rate)のサーチ

learning rate, 学習率を決定するための Practicalな方法。 学習率は、感覚で最適な値を探すことが多いが、もっと系統立てて探そうよという取り組み。

この論文が元になっている。

Learning Rate Schedulerという機能によって、はじめは小さい値からはじめて次第に大きくしていく。 このとき、Lossの変化をplotしていくことで、変化の極小値の値を採用する。

fast.aiライブラリでは、lr_findというメソッドに実装されている。

cyclic LR schedule

Cyclic LR scheduleは、学習率をcosine曲線にそって変更することで鞍点を抜け出す。

differential learning rate

fine-tuneするときの学習率を、 はじめのレイヤは小さく、おわりのレイヤは大きく設定することで、学習を最適化する。

cyclic_melt

Cyclic LR scheduleの学習率の変化を、epochが増えるに従って緩やかにしていく。 Cyclicの周期を1epock, 2epock, 4epockと変えていく。

Test Time Augmentation (TTA)

Data Augmentationを 推論フェーズでも使おうということ。 これによって、validationセットに対して Data Augumentaitionを適用して 予測をし、 たとえば一つの画像を4つに増やしたとき、精度はその平均をとることになる。

まとめ

まとめると、以下の手法が紹介された。

  • LR find
  • Cyclic LR
  • differential LR
  • Test Time Augmentation

ゴールデンルールにしたがえばworld-classな精度が簡単にでるよとのこと。

fast.ai Part1 lesson2では、以下のKaggleコンペが例題として登場し、解説される。

手頃なKaggle画像コンペに参加して、腕試しをしてみたい。

12 Apr 2018, 23:20

ソフトバンク光でチャンネル競合を解消した

はじめに

家のwifi, 最近だろうか、とても遅くてイライラしていた。

ついに原因を突き止めたかもしれないのでそのレポートです。

バッファローの USB Wifi

購入したものは、こちら。バッファローの USB Wifi. wi-u3-866ds

これを使っていたのだけれども、とにかく回線が不安定。 しょっちゅうブツブツ切れてしまう。 とくに、外出先から自宅サーバに乗り込んでいるときに、通信がとだえることが何度もある。 とてもストレスがたまるので調査することにした。

原因はチャンネルの競合

あまりネットワークについての知識はなのだけれどもどうやらチャンネルの競合が怪しい。

集合住宅に住んでいるので、隣人もwifiを利用している。どうも、その電波と競合を起こしているよう。

具体的には、Linuxだとiwlistでチャンネルの競合をしらべることができる。

$ sudo iwlist (interface name) scan | grep Freq
                    Frequency:2.412 GHz (Channel 1)
                    Frequency:2.412 GHz (Channel 1)
                    Frequency:2.432 GHz (Channel 5)
                    Frequency:2.437 GHz (Channel 6)
                    Frequency:2.442 GHz (Channel 7)
                    Frequency:2.442 GHz (Channel 7)
                    Frequency:2.437 GHz (Channel 6)
                    Frequency:2.437 GHz (Channel 6)
                    Frequency:2.457 GHz (Channel 10)
                    Frequency:2.457 GHz (Channel 10)
                    Frequency:2.462 GHz (Channel 11)
                    Frequency:2.462 GHz (Channel 11)
                    Frequency:2.462 GHz (Channel 11)
                    Frequency:2.462 GHz (Channel 11)
                    Frequency:5.18 GHz (Channel 36)
                    Frequency:5.22 GHz (Channel 44)
                    Frequency:5.24 GHz (Channel 48)
                    Frequency:5.6 GHz (Channel 120)

これで空いているチャンネル番号を選んで、ルータに設定しなおしたら途切れることがなくなった(気がする)。

うちはソフトバンク光なので、ルータにログインして、チャンネル設定から チャンネルを40を選択するように指定した。

参考情報