[papreclip] Content Type Spoof

このブログを別サーバーに移したら画像がアップロードできなくなった。

I, [2017-04-20T20:43:11.577928 #18952]  INFO -- : [paperclip] Content Type Spoof: Filename Screen_Shot_2017-04-20_at_20.32.44.png (["image/png"]), content type discovered from file command: . See documentation to allow this combination.

ファイルコマンドの結果が返ってきてない?

sudo yum install file

で解消。

MastodonをAWSにDockerで立てたメモ

https://github.com/tootsuite/mastodon

Mastodonのインスタンスを立ててみた - めも.net
基本はこれを参考に。

t2.mediumで20GB、セキュリティグループは80と443を開けた。

変えたのは、

  • Gitのcloneはsshじゃなくhttpsでやった
  • SECRETはそれぞれ別にした(READMEにDo this once for each of those keysって書いてあったので)

Dockerが実行できない?

$ docker-compose run --rm web rake secret
ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

$ docker version
Client:
 Version:      17.04.0-ce
 API version:  1.28
 Go version:   go1.7.5
 Git commit:   4845c56
 Built:        Mon Apr  3 18:07:42 2017
 OS/Arch:      linux/amd64
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.28/version: dial unix /var/run/docker.sock: connect: permission denied

service docker restartしても駄目で、SSHログインし直したら行けた。

S3

↓のようなインラインポリシーを持ったユーザーを作成

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt12345",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::バケット名",
                "arn:aws:s3:::バケット名/*"
            ]
        }
    ]
}

設定はSSLで運用しているmastodonとS3の連携のハマりどころ - Qiitaを参考に。

SES

SMTP_SERVER=email-smtp.us-east-1.amazonaws.com
SMTP_PORT=587
SMTP_LOGIN=****
SMTP_PASSWORD=****
SMTP_FROM_ADDRESS=notifications@ドメイン

LOGINPASSWORDCreate My SMTP Credentialsから作ったもの。(API経由で送るんじゃないのでSMTP専用のが必要)

PostgreSQL、Redisの永続化

docker-compose.ymlをアンコメント。

参考:今何かと話題のマストドン(mastodon)鯖を自分用に無料で立てる方法 - jtwp470’s blog

永続化設定の前にupしちゃうと…

$ docker-compose up -d 
Recreating mastodon_db_1
Recreating mastodon_redis_1
WARNING: Service "redis" is using volume "/data" from the previous container. Host mapping "/path/to/mastodon/redis" has no effect. Remove the existing containers (with `docker-compose rm redis`) to use the host volume mapping.
WARNING: Service "db" is using volume "/var/lib/postgresql/data" from the previous container. Host mapping "/path/to/mastodon/postgres" has no effect. Remove the existing containers (with `docker-compose rm db`) to use the host volume mapping.
Creating mastodon_web_1
Creating mastodon_sidekiq_1
Creating mastodon_streaming_1
$ docker-compose stop redis
$ docker-compose rm redis
$ docker-compose stop db
$ docker-compose rm db

データ作成する前だったので普通にやりなおした。

リダイレクト先が見つかりませんでした

リモートフォローができず。

ログを見ると、webfingerが404。
https://github.com/tootsuite/mastodon/blob/aa9079838648e9656a1bf8d10151713686e1c0dd/app/lib/webfinger_resource.rb#L64
ここでfalseになってそう。
LOCAL_DOMAINのタイポに気づく…。

デバッグ

とりあえず、

  • ログレベル買える
  • -dせずにup

すれば行けた。

証明書の自動更新とかやらないとな。

Let's Encrypt

地味に初めましてだった。

# 初回の取得
# この時点ではnginxがデフォルトの場所で起動してたのでいけた。
$ ./letsencrypt-auto certonly --webroot -w /var/www/html/ -d ドメイン

# 更新
# もはや/var/www/htmlでは動いてないのでこける
$ ./letsencrypt-auto renew --force-renewal --dry-run 

# コレなら行けた
$ /path/to/letsencrypt/certbot-auto certonly --webroot -w /path/to/mastodon/public -d ドメイン --renew-by-default --dry-run && service nginx reload

# その後はコレも通るようになった
$ ./letsencrypt-auto renew --force-renewal --dry-run 
0 0 1 * * /path/to/letsencrypt/certbot-auto certonly --webroot -w /path/to/mastodon/public -d ドメイン --renew-by-default && service nginx reload

ひとまずこれでCronに設定。

[読書メモ] ゼロから作るDeep Learning: 第7章

O'Reilly Japan - ゼロから作るDeep Learning

畳み込みニューラルネットワーク

  • CNN(Convolutional Neural Network)
  • 画像に特に有効
  • これまでのニューラルネットは全結合
    • Affine ReLU
    • Affine Softmax
  • CNN
    • Convolution ReLU Pooling
    • 出力に近い層 Affine Relu
    • 最後はAffine Softmax
  • 全結合層の問題点
    • データの形状が無視される
    • 3次元の画像データを1次元にして入力
  • 特徴マップ
    • 畳み込み層の入出力データのこと
  • 畳み込み演算
    • 積和演算
    • フィルター(カーネル)をスライドさせて入力と乗算して和を取る
    • フィルターのパラメータが重みに相当
    • 最後にバイアスも加算
  • パディング
    • 出力サイズの調整
    • 周囲に0埋め
  • ストライド
    • フィルター適用位置の感覚
    • 大きくすると出力サイズが小さくなる
  • 3次元データの畳込み演算
    • フィルターのチャンネルも入力に合わせる
    • 出力のチャンネルは1になる
    • フィルターを複数適用して、チャンネル複数に
    • これを次の層に渡して行くのがCNN
  • プーリング
    • 空間を小さくする演算
    • maxプーリング、最大値を取る
    • フィルターと同じくストライドとサイズ
    • 特徴1: 学習するパラメータがない
    • 特徴2: チャンネル数が変化しない
    • 特徴3: 微小な位置変化に対してロバスト

レイヤの実装

  • 4次元データ 複雑になる
    • さらにnumpyはforが遅い
  • im2col
    • image to column
    • 画像データを行列に変換
    • あとはAffineと同じく行列の内積でいける
    • メモリ使うが多量の行列を一気に処理するのはライブラリの最適化により効率良い
    • 最後reshapeして戻す

CNNの可能性

  • 層を重ねると複雑で抽象的な情報が抽出可能
  • 3層のシンプルなネットワークで99%近くの精度
  • LeNet(1998)
  • AlexNet
  • そんなに変わらない
  • GPUとビッグデータにより日の目を見た
    • 学習のための大量データと、計算リソース

TODO

  • 99%超え目指す

[読書メモ] ゼロから作るDeep Learning: 第8章

O'Reilly Japan - ゼロから作るDeep Learning

ディープラーニング

  • 層を深くしたニューラルネットワーク
    • 3x3のフィルター
    • ReLU
    • 全結合の後にDropout
    • Adam
    • Heの初期値
    • 99%を超える認識精度
    • 間違っているのは人間も間違うようなもの
  • What is then class of this image?
    • MNISTに対する各手法のランキングがある
    • 1位はあまり層が深くない手法
    • 手書き数字認識という比較的単純な問題はディープになることの表現力を生かせない
  • Data Augmentation
    • 画像を変形して訓練データを増やす

層を深くする

  • 理論的にはあまり詳しいことはわかっていない
  • 画像認識のILSVRCなどディープラーニングが良い成績
    • 層を深くすると認識精度が上がる傾向
  • パラメータ数が少なくて済む
  • 表現力が増す
    • 活性化関数により非線形の力が加わる回数が増える
  • データが少なくて済む
  • 各層はそれぞれシンプルな問題に分解できる

高速化

  • ビット削減
    • 浮動小数点は16ビットで問題ない

歴史や最近のトレンドなどはメモするのを控える。

[読書メモ] ゼロから作るDeep Learning: 第6章

O'Reilly Japan - ゼロから作るDeep Learning

パラメータ更新手法

  • SGD
    • 確率的勾配降下法
    • 単純
    • やみくもにパラメータを探すよりは賢い
  • optimizer
    • SGDというクラスを作り、パラメータの更新はそこでやる
    • 入れ替え可能に
  • SGDの欠点
    • 関数によっては勾配方向に進むのがかなり非効率な場合がある
    • 等方的でない関数
  • Momentum
    • 運動量
    • 速度という概念を使い、物理法則に準じる動き
    • 等方的でない関数も効率的に
  • AdaGrad
    • パラメータの減衰
    • Adaptive、適応的
    • 学習係数をパラメータごとに調整
    • よく変化した要素は学習係数が小さくなっていく
  • Adam
    • Momentum x AdaGrad
  • どの更新手法がいい?
    • 得意な問題が違う
    • SGDはよく使われる
    • 最近はAdamが人気
    • MNISTの学習はAdaGradが得意

重みの初期値

  • 重みの初期値で学習の成否が分かれる
  • 小さい方がいい
    • 0にすればいい?
    • 重みが均一だと意味がない
  • 標準偏差1のガウス分布
    • 勾配消失
  • 標準偏差 0.01のガウス分布
    • 勾配消失は起きないが、偏りがある
    • シグモイド関数の表現力に制限
    • 複数のニューロンが存在する意味が薄れる
  • Xavierの初期値
    • 適度な広がり
    • 線形関数向け
  • Heの初期値
    • 非線形なReLU向け

Batch Norm

  • Batch Normalization
  • 各層のアクティベーションの分布を強制的に広がりを持つように焼成する
  • メリット
    • 学習が速い(学習係数を大きくできる)
    • 初期値にあまり依存しない
    • 過学習を抑制できる

正則化

  • 過学習の原因
    • パラメータが大量で、表現力の高いモデル
    • 訓練データが少ない
  • Weight decay
    • 荷重減衰
    • 大きな重みにペナルティを課すことで過学習を抑制
  • Dropout
    • Weight decayは実装簡単だが、複雑なモデルへの対応は困難
    • 訓練時にランダムにニューロンを消去
    • テスト次じ消去した割合を乗算

ハイパーパラメータの検証

  • テストデータで調整してはダメ
    • テストデータで過学習してしまう
  • 検証データ
    • ハイパーパラメータの良さを評価するためのデータ
    • MNISTの場合は訓練データから20%ぐらい先に分離しておく
    • データに偏りが出ないようにシャッフルしておく

TODO

  • SGDを別クラス化 → 済
  • ハイパーパラメータの検証