頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


TensorFlowを1.7にアップデート

最近ほったらかしだったので、、、ようやくTensorFlowのアップデートした。

Installing TensorFlow on macOS  |  TensorFlow
↑ここにあるように、
sudo pip3 install --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.7.0rc1-py3-none-any.whl
でやってみた。

tf.__version__ で確認すると
version 1.7.0-rc1
になった。
動かすとなにやらdeprecatedだよ!などの警告とか出たけどまあ動くのは確認した。ふー。こういうの妙に緊張する。


macOS 10.13.4


RNN(LSTM)で株価予測の結果(3)

RNN(LSTM)で株価予測の結果(2)
↑この続き。
num_unitsを128でやってたのを256, 64でやってみた。

(1)num_units = 256の場合
LSTMの株価予測結果(ユニット数256)


(2)num_units = 64の場合
LSTMの株価予測結果(ユニット数64)

ユニット数が多いほど時間かかるが表現力が高そう、でもどちらにせよ予測はできていない、ってとこか。


深層学習を用いた株価予測の分析(pdf)
↑”パターン認識”なら役に立つかも、という意見もあるけど、、、

ディープラーニングの限界 | POSTD
↑こんなのを読みながら次はどうしたものか、、、と考えております。


SceneKitのチェック用カメラの位置などを得る

SceneKitのSCNViewクラスに allowsCameraControl ってプロパティがあってこれをtrueにするとカメラの位置や方向をトラックパッドやマウスで簡単に変えられるのでデバッグにすごく便利で重宝する。

カメラのオブジェクトやプロパティ(位置やfovとか)は自分で設定し、実行時にカメラ位置などは当然それに従う。allowsCameraControl でカメラ位置を動かしたとしてもカメラオブジェクトの位置などを調べても値は変化しない。
移動した後の位置を取得できたらいいのになあ〜と思って調べたことがあったんだがそんな方法はなさそうで無理なんだろうなとずっと思っていたんだけど、先日再度調べたら方法が見つかった。

ios - Can I get the SCNView camera position when using allowsCameraControl? - Stack Overflow

↑単にSCNViewオブジェクトのpointOfViewで読み込んだのがカメラに相当するとか。
{
    SCNNode *cameraNode = scnView.pointOfView;
    SCNVector3 currentCameraPosition = cameraNode.position;//などなど
}
pointOfViewは視点を切り替える時に使ってはいたけど、これで取得できたとは!


RNN(LSTM)で株価予測の結果(2)

RNN(LSTM)で株価予測の結果(1)
↑この続き。LSTMで予測するのに、過去60日のデータを使うようにした場合の結果(ver3.1)。
forget_biasは0.9のみで。

LSTMで株価予測結果ver3.1

まあ予想通りさっぱりダメだなって結果。
それにしてもさすがに計算に時間がかかる、、、ので720kステップでやめた。

なお、今は試しにnum_unitsを128→256にして学習中なんだけど、さらに時間が、、、


SceneKitでシェーダに値(配列)を渡す

SceneKitでfragmentシェーダに1つの値を渡すというのはやってたんだけど、今回はvertexシェーダに値を複数渡そうとしたんだが、えらくはまったのでメモ。

まず、1つの場合はこんな感じでやってた。
{
    float value = _value;
    NSData *buffer = [NSData dataWithBytes:&value length:sizeof(float)];
    [node.geometry.firstMaterial setValue:buffer forKey:@“value”];
}
↑こんな感じでNSDataを使ってセットしてやり、
fragment half4 myFragment(SimpleVertex in [[stage_in]],
                          texture2d diffuseTexture [[texture(0)]] ,
                          constant float &value [[buffer(0)]]
                          )
{
	float4 color = float4(value , … );//とかなんとか
}
↑シェーダでこのようにすれば受け取れる。例はfragmentシェーダだけどvertexシェーダでも受け取れる。

こんな感じで複数の値を渡そうとしたのよ。複数といっても2、3個じゃなくて頂点の数ほどだったので1万個以上あるので手書きでやってられない。
さんざん悩んだんだけど、結局こんなの。

{
    float *values = (float *)calloc(nofData, sizeof(float));
    // … set values …

    NSData *data = [NSData dataWithBytes:values length:sizeof(float)*nofData];
    [node.geometry.firstMaterial setValue:data forKey:@“values"];
}
↑nofDataはデータの数。
vertex SimpleVertex myVertex(MyVertexInput in [[stage_in]],
                             constant SCNSceneBuffer &scn_frame [[buffer(0)]],
                             constant MyNodeBuffer &scn_node [[buffer(1)]] ,
                             uint vid [[vertex_id]] , 
                             constant float *values [[buffer(2)]] )
{
    float value = values[vid];
}
↑こんな感じで配列の値にアクセスすることができた。ここでは配列のindexに頂点番号(何て言うんだろう?)を使ってる。冷静に考えれば、まあそうだよねってコードなんだけど、ここにたどり着くのにえらいハマってしまったのでした。

参考までにこれで何をしたかというと、、、

輪郭線

↑Blenderで作成したモデルをdaeファイルで出力、SceneKitでシェーダ使って描いてるんだけど、視線と法線の内積で輪郭を得ると足や手など輪郭線がどうしても細くなってしまう。それじゃあ”細い”って情報をシェーダに渡して補正すればいいんじゃね?ってアイデアを試してみようとしたのよ。

頂点からボーンへの距離

↑こんな感じで各頂点から一番近いボーンの距離を得た(描いているのは一部だけ)。この情報をvertexシェーダに渡してさらにfragmentシェーダに渡すと描画部分での”細さ”を計算。

曲率半径

↑正しく値が来てるか"細さ"を輝度にして確認。手足なんかは暗くなってる。よしよし。

補正された輪郭線

↑その情報を使って輪郭線を補正してみたが、、、労力のわりにあまり変わってない?
い、いや、まだ改善の余地があるんだ、きっと、、、




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad