Caffe学習チューニングメモ: batch_size変更の注意点

GPUモードで動かすと、環境によってはout of memoryで怒られる場合がある。
その場合は train_val.prototxt ファイル内の batch_size を小さく変更する事で避けられる。
しかし、TRAINフェーズのbatch_size に合わせて solver.prototxt ファイル内の base_lr も小さくする必要がある。

base_lr: 0.01 * sqrt(X)
X: batch_size / 256

つまり、batch_sizeを64にしたなら、base_lrは:

base_lr = 0.01 * sqrt(64 / 256) = 0.005

闇すぎるよCaffeちゃん!

参考

ObjectMapper+RealmでTo-Many relationshipsを実装する方法

Person [1]-[0..*] Dog の関係を考える。

説明するよりコード見せたほうが早い:

import UIKit
import RealmSwift
import ObjectMapper

class Person: Object {
  dynamic var dogs = List<Dog>()
}

extension Person: Mappable {

  class func newInstance(map: Map) -> Mappable? {
    return Person()
  }

  func mapping(map: Map) {
    result <- (map["dogs"], ArrayTransform<Dog>())
  }

}

class Dog: Object {
  dynamic var name: String = ""
}

extension Dog: Mappable {

  class func newInstance(map: Map) -> Mappable? {
    return Dog()
  }

  func mapping(map: Map) {
    name <- map["name"]
  }

}

ArrayTransformこちらから拝借。作者に感謝!

// Based on Swift 1.2, ObjectMapper 0.15, RealmSwift 0.94.1
// Author: Timo Wälisch <timo@waelisch.de>

import UIKit
import RealmSwift
import ObjectMapper

class ArrayTransform<T:RealmSwift.Object where T:Mappable> : TransformType {
    typealias Object = List<T>
    typealias JSON = Array<AnyObject>

    func transformFromJSON(value: AnyObject?) -> List<T>? {
        var result = List<T>()
        if let tempArr = value as! Array<AnyObject>? {
            for entry in tempArr {
                let mapper = Mapper<T>()
                let model : T = mapper.map(entry)!
                result.append(model)
            }
        }
        return result
    }

    func transformToJSON(value: List<T>?) -> Array<AnyObject>? {
        if (value?.count > 0)
        {
            var result = Array<T>()
            for entry in value! {
                result.append(entry)
            }
            return result
        }
        return nil
    }
}

UIImageをaspect fill/fitでリサイズする方法

Appleのサンプルコードがそのまま使える(Objective-C):

上記をプロジェクトに追加して、ブリッジヘッダでインポートしておく。

使い方(Swift):

// Aspect fillでリサイズ
var imageResized = UIImage(image: image, scaledToFillToSize: CGSize(width: 300, height: 300))

// Aspect fitでリサイズ
var imageResized = UIImage(image: image, scaledToFitToSize: CGSize(width: 300, height: 300))

写真で好みを分析!らーめん屋推薦アプリ『麺利き』をリリースしました

Men-kiki-icon

App Storeでダウンロード

らーめんを愛するすべての人に捧ぐ!
ありそうでなかったらーめん屋推薦アプリです。
名前は『麺利き』。

写真で「こんな感じ!」が伝えられる新しい探し方

食べておいしかったらーめん、ありますよね。
その写真をアプリに入力してください。
すると、アプリが似た雰囲気のらーめんを出すラーメン屋を探します。

例えば、野菜たっぷりのらーめんを入力すると・・

iphone6-03

見事に二郎系のらーめん屋が提示されましたwww

ぜひ、みなさんのお気に入りらーめんで試してみてください。
きっといいお店が見つかりますよ!

開発には30万枚のらーめん画像を使用

開発には、最近何かと話題のディープラーニングという機械学習アルゴリズムの一つを使用しました。

推薦アルゴリズムのために、30万枚のらーめん画像を集めて学習させました。

つまり、このアプリは「らーめんとは何か」を理解しているのです!(どーん)

開発の裏話はまた別のエントリで書きますので、お楽しみに!!

App Storeでダウンロード