TensorflowでResNetを実装したく、トライしています。
Kerasで動作実績のあるコードをもとに書きかえてみたのですが
上手くいっておりません。
・生じている問題
テストデータに対する損失関数(Loss)が減少しません
(少数点4桁くらい表示していますが、まったく変化せず)。
計算グラフがうまくできておらず、誤差逆伝播ができていないのかと推察しています。
以下、インデントが上手くされておらず、読みにくいコードになっておりすみません。
def _shortcut(inputs, residual)
n_filters = residual.shape[3]
print('n_filters=',n_filters)
shortcut = tf.layers.Conv2D(n_filters, kernel_size=[1, 1], strides=[1, 1], padding='VALID')(inputs)
return tf.keras.layers.add([shortcut, residual])
initializer = tf.initializers.he_normal()
def _resblock(n_filters, strides=(1,1)):
def f(input):
x = tf.layers.Conv2D(n_filters, kernel_size = [3, 3], strides=strides, kernel_initializer=initializer, padding='SAME')(input)
x = tf.layers.BatchNormalization()(x, training=is_training)
x = tf.nn.relu(x)
x = tf.layers.Conv2D(n_filters, kernel_size = [3, 3], strides=strides, kernel_initializer=initializer, padding='SAME')(x)
x = tf.layers.BatchNormalization()(x, training=is_training)
return _shortcut(input, x) return f
tf.reset_default_graph()
is_training = tf.placeholder(tf.bool, shape=())
x = tf.placeholder(tf.float32, [None, 32, 32, 3]) #入力データ
t = tf.placeholder(tf.float32, [None, 10]) #正解ラベル
h = tf.layers.Conv2D(filters=32, kernel_size=[7, 7], strides=[1, 1], kernel_initializer=initializer, padding='SAME')(x)
h = tf.layers.BatchNormalization()(h, training=is_training)
h = tf.nn.relu(h)
h = tf.layers.MaxPooling2D(pool_size=[2, 2], strides=2)(h)
h = _resblock(n_filters=64)(h)
h = _resblock(n_filters=64)(h)
h = _resblock(n_filters=64)(h)
h = tf.layers.MaxPooling2D(pool_size=[2, 2], strides=2)(h)
h = _resblock(n_filters=128)(h)
h = _resblock(n_filters=128)(h)
h = _resblock(n_filters=128)(h)
h = tf.layers.MaxPooling2D(pool_size=[2, 2], strides=2)(h)
h = _resblock(n_filters=256)(h)
h = _resblock(n_filters=256)(h)
h = _resblock(n_filters=256)(h)
h = tf.keras.layers.GlobalAveragePooling2D()(h)
h = tf.layers.Dense(units=128, activation=tf.nn.relu)(h)
y = tf.layers.Dense(units=10, activation=tf.nn.softmax)(h)
cost = - tf.reduce_mean(tf.reduce_sum(t * tf_log(y), axis=1))
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
optimizer = tf.train.AdamOptimizer(0.01).minimize(cost)
Tensorflow自体に不慣れであり、基本的なミスなのかもしれませんが、
どうぞよろしくお願いいたします。
あなたの回答
tips
プレビュー