あかすくぱるふぇ

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

・ファイル入力
i = 1
fname_base = '/home/kanosawa/dataset/cifar10/data_batch_'
fname = fname_base + str(i)
train = unpickle(fname)
train['labels'] = np.identity(output_units)[train['labels']]
while i < 6:
    fname = fname_base + str(i)
    train_tmp = unpickle(fname)
    train_tmp['labels'] = np.identity(output_units)[train_tmp['labels']]
    train['data'] = np.concatenate([train['data'], train_tmp['data']], axis=0)
    train['labels'] = np.concatenate([train['labels'], train_tmp['labels']], axis=0)
    i = i + 1
test = unpickle('/home/kanosawa/dataset/cifar10/test_batch')
test['labels'] = np.identity(output_units)[test['labels']]
・入力層
x = tf.placeholder(tf.float32, [None, cifar_pixels])
img = tf.reshape(x, [-1, color_channels, cifar_width, cifar_width])
img = tf.transpose(img, [0, 2, 3, 1])
・学習
for step in range(step_num):
  before = (step * batch_size) % train_size
after = ((step + 1) * batch - 1) % size + 1
  train_images = train['data'][before : after] / 255.0 train_labels = train['labels'][befire : after] sess.run(train_step, feed_dict={x:train_images ,t:train_labels})

・FC
入力層(784)、隠れ層(50)、出力層(10)の3層。
 隠れ層1000とかにすると精度向上。
損失関数は平均二乗誤差。
 変更したい場合は、tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=t, logits=y)
 yはsoftmaxしないで入力する。
 -tf.reduce_sum(t * tf.log(y))は、y=0のときにlog(y)がinfとなるので、微小量を足す必要がある。
学習アルゴリズムは再急降下法。
 変更したい場合は、tf.train.AdamOptimizer().minimize(loss)などとする。
 learning_rateはデフォルト引数が設定されてる場合もあるので要確認。

・CNN
ゼロから作るでは、[BN, C, H, W] * [FN, C, FH, FW] = [BN, FN, OH, OW]だが、
 tensorflowでは、[BN, H, W, C] * [FH, FW, C, FN] = [BN, OH, OW, FN]

・画像の表示
from PIL import Image
show_image = Image.fromarray(train_images[0].reshape(28, 28) * 255)
show_image.show()

・活性化関数
ステップ関数
シグモイド関数
ReLU関数

・出力層
分類問題ならソフトマックス関数

・ミニバッチ
縦にバッチを並べると結果も縦に並ぶ

・交差エントロピー誤差
正解ラベルkについて、ソフトマックス値ykのとき、誤差は-log(yk)
完璧に推定すると、yk=1なので誤差は0
そうでない場合は正の値となる
それを数式にするとΣ-tk・log(yk)

・数値微分による学習
numerical_gradient(f, x) = f(x+h) - f(x) / h
f : 損失関数, x : パラメータ
損失関数の勾配を算出することで、損失関数が小さくなる方向にパラメータxを変化させる

・誤差逆伝搬法
∂L/∂x = ∂L/∂z ・ ∂z/∂x
この「∂L/∂zが計算済」というのが逆伝搬するということ

↑このページのトップヘ