あかすくぱるふぇ

同人サークル「あかすくぱるふぇ」のブログです。

転職して二か月が経ちました。
試用期間も終わるので、転職について書き残しておこうと思います。

なお、機密漏洩と身バレ回避のため、現職と前職の仕事内容について深くは触れません。

・前職の仕事内容
3Dコンピュータビジョンに関する研究開発
Augmented Reality関連の製品開発

・転職理由
研究開発や新規事業により力を入れていこうとしている会社で仕事をしたかった
画像認識・機械学習の分野へ自分の技術領域を広げたかった
一生のうちに別の会社を体験してみたかった
堪忍袋の緒が切れた

・転職方法
DODA, リクルート, リクナビ, ビズリーチ。
ほぼDODAしか使ってません。
ビズリーチは他と傾向が違い、ベンチャーなどからの求人が多い(ので、見てる分には面白い)です。
「DODAよりリクルートの方が求人多い」と聞いたので途中でリクルートにも話を聞きに行きましたが、DODAと大して変わらなかったです。

・主な活動期間
2017年3月から3か月

・戦果
合格:1社
1次面接落ち:1社
書類落ち:1社

・活動してみての感想
とにかく自動運転系の求人が大量にあるので、この分野であれば選び放題です。
機械学習の経験はもちろん、画像処理の経験がなくても転職は可能でしょう(もちろん、入ってから頑張る必要はあるでしょうが)。それくらい人手不足なようです。

僕は逆に、「自動運転以外」で探していたので、ちょっと苦労しました。
それでも「必須条件:機械学習の経験」と書いてある求人に応募して、「趣味でchainer触ってます。でもそれだと限界があるので、仕事で使いたいです」とか言ったら合格したので、やはり人手不足なのでしょう。

面接内容は会社によって様々なようで、僕が受けた2社のうち1社は「9割方技術的な質問」で、もう1社は「6割くらいが動機に関する質問」でした。
どちらにせよ、1時間程度話すとかなり深堀りされるので、準備が疎かだと厳しいです。

一問一答形式で想定問答を作るだけでは不十分で、転職理由・志望動機・自分の専門分野・経験・キャリアプランなどをそれぞれ深掘りし、それらが深いところまで矛盾なく繋がりあうまで煮詰める必要があります。

あと、転職活動は仕事が忙しくない時にやりましょう。
面接は平日夕方に行われることが多いので、定時帰りや午後休がしにくい状況だと結構厳しいです。


・転職してみての感想
「転職理由」に書いたものが全て満たされたのでかなり満足しています。
……ということに、今この記事を書いていて気づきました汗。転職理由は大事ですね。

一方で、知っている人がいない職場に一人で入っていくというのは、なかなか苦労します。
大企業なので、同期の繋がりが強いのも、中途側からすると微妙なところですね。
現在進行形で少しずつ馴染んでいっているところです。

あと、30歳超えての転職はやはり即戦力扱いです。
手を動かせないと精神的に辛いでしょう。
現職の開発環境はLinuxなのですが、前職の最後にLinux触っておいて良かったと心底思いました。
もし触ってなかったら、1か月程度はまともに手を動かせなかったでしょうから。


以上です。
参考になれば幸いです。

7/31付けで、新卒から8年勤めた会社を退職しました。
その顛末などは別の機会に書くとして、今回は退職金と年金のお話を。

恥ずかしながら、今日の今日まで、退職金と年金についてほとんど何も理解していませんでした。
「まあ、明細がくるはずだから、それを見ればいいだろ」くらいに考えていたのです。
ところが、退職金・年金といっても色々な種類があるらしく、各所から五月雨で案内が来て困ってしまいました。
ちゃんと整理しないと、手続きの不備や貰い損ねが発生しかねないぞ、と。

そこで、本記事では、退職金と年金について整理します。
ググればいくらでも情報が出てきますが、一般的なメーカーを中途退職(してすぐに転職)したケースに限定して記載するので、同様の境遇の方にとっては参考になるのではないかと思います。

○年金・退職金の積み上げモデル
年金・退職金は一種類ではなく、国民全員が加入する(もらえる)基本的なものから、一部の人が加入する特殊なものまで、様々な種類があります。
それらを積み上げていくイメージで理解すると分かりやすいです。
年金・退職金の主な種類は以下の通り。

・国民年金
国民全員が加入する年金。転職先でも強制加入なので、気にすることは特に無いです。

・厚生年金
会社員が加入する年金。これも会社員なら強制加入なので、気にすることは無いです。

・企業年金
国民年金と厚生年金に加えて企業が独自に設ける年金。
企業独自の年金のため、退職後どうするかを選択して手続きをする必要があります。
主な選択肢は「一括でもらう(退職時に一時金として)」、「移管する」の2つ。
企業年金には主に確定給付年金と確定拠出年金があり(説明省略)、基本的には確定給付年金は「一括でもらう」、確定拠出年金は「移管する」ことになります。
年金・退職金で最も分かりにくいのが、確定給付年金を一括でもらう場合に、『年金として積み立てていたお金を退職金として、(後述する)退職一時金とは別に受け取る』ことになるという点だと思います。

・退職一時金
いわゆる退職金と言うとコレを指すことが多いのだと思います。
しかし、前述したように、退職一時金とは別に、確定給付年金として積み立てていたお金も退職時に受け取ることになります。

○結局どういう手続きをして、何が貰えんの?
退職手続きを普通にこなせば退職一時金を貰えます。
確定給付年金に関する手続きも基本的には退職手続きに含まれており、普通にこなせば退職金としてもらえるはずです(「一括でもらう」を選択した場合)。

以上です。

pix2pixではU-Netと呼ばれるネットワークを使用しています。
本記事では、下記サイトのchainer-pix2pixを参照しながら、chainerによるU-Netの実装方法を解説します。
https://github.com/pfnet-research/chainer-pix2pix

U-Netの概要については、下記論文の図1を参照してください。
U字ネットワークの左側の各層の出力を右側の各層の入力に連結するのが特徴です。
https://arxiv.org/abs/1505.04597

chainer-pix2pixからU-Netの実装を引用します。
class Encoder(chainer.Chain):
def __init__(self, in_ch):
layers = {}
w = chainer.initializers.Normal(0.02)
layers['c0'] = L.Convolution2D(in_ch, 64, 3, 1, 1, initialW=w)
layers['c1'] = CBR(64, 128, bn=True, sample='down', activation=F.leaky_relu, dropout=False)
layers['c2'] = CBR(128, 256, bn=True, sample='down', activation=F.leaky_relu, dropout=False)
layers['c3'] = CBR(256, 512, bn=True, sample='down', activation=F.leaky_relu, dropout=False)
layers['c4'] = CBR(512, 512, bn=True, sample='down', activation=F.leaky_relu, dropout=False)
layers['c5'] = CBR(512, 512, bn=True, sample='down', activation=F.leaky_relu, dropout=False)
layers['c6'] = CBR(512, 512, bn=True, sample='down', activation=F.leaky_relu, dropout=False)
layers['c7'] = CBR(512, 512, bn=True, sample='down', activation=F.leaky_relu, dropout=False)
super(Encoder, self).__init__(**layers)

def __call__(self, x):
hs = [F.leaky_relu(self.c0(x))]
for i in range(1,8):
hs.append(self['c%d'%i](hs[i-1]))
return hs

class Decoder(chainer.Chain):
def __init__(self, out_ch):
layers = {}
w = chainer.initializers.Normal(0.02)
layers['c0'] = CBR(512, 512, bn=True, sample='up', activation=F.relu, dropout=True)
layers['c1'] = CBR(1024, 512, bn=True, sample='up', activation=F.relu, dropout=True)
layers['c2'] = CBR(1024, 512, bn=True, sample='up', activation=F.relu, dropout=True)
layers['c3'] = CBR(1024, 512, bn=True, sample='up', activation=F.relu, dropout=False)
layers['c4'] = CBR(1024, 256, bn=True, sample='up', activation=F.relu, dropout=False)
layers['c5'] = CBR(512, 128, bn=True, sample='up', activation=F.relu, dropout=False)
layers['c6'] = CBR(256, 64, bn=True, sample='up', activation=F.relu, dropout=False)
layers['c7'] = L.Convolution2D(128, out_ch, 3, 1, 1, initialW=w)
super(Decoder, self).__init__(**layers)

def __call__(self, hs):
h = self.c0(hs[-1])
for i in range(1,8):
h = F.concat([h, hs[-i-1]])
if i<7:
h = self['c%d'%i](h)
else:
h = self.c7(h)
return h
EncoderとDecoderの2つ合わせてU-Netです。
Encoderの出力をDecoderに入力することでU字ネットワークを実現します。

特徴的なのは、Decoder.__call__()内で使用されているconcatという関数です。
これはVariable変数を結合する関数であり、これを用いてEncoder(U字左側)の各層の出力をDecoder(U字右側)の各層の入力に連結しています。

concat関数は連結する次元を引数axisで指定でき、デフォルト値は(0ではなく)1です。
Variable変数は(データ数, チャンネル数, 縦, 横)の4次元であるため、上記コードのようにaxisが指定されていない場合、axis=1つまり新しいチャンネルとしてEncoderの各層の出力を連結することになります。

以上がchainerでU-Netを実現する方法です。

↑このページのトップヘ