У меня есть изображение шахматной доски, и я хочу обработать его с помощью CNN в тензорном потоке квадратичным способом в пределах одного вычислительного графа.
Каждое изображение выглядит так:

Предполагается, что изображение имеет размер 200 на 200 пикселей, поэтому каждый квадрат имеет размер 25 на 25 пикселей.Я пытаюсь реализовать это следующим образом:
X = tf.placeholder(tf.float32, shape=[None, 200, 200, 3], name='X')
Y = tf.placeholder(tf.float32, shape=[None, 64, 13])
weights = {
"conv1_w": tf.Variable(tf.truncated_normal([3,3,3,32], stddev=0.1)),
"conv2_w": tf.Variable(tf.truncated_normal([3,3,32,32], stddev=0.1)),
...
}
with tf.Session() as sess:
squares = split_into_squares(X)
# i want to run some kind of loop here
# in order to process each square on the board
# how can I do it ?
for square in range(64):
pred = cnn(square, weights)
cost = tf.losses.mean_squared_error(Y, pred)
adam = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)
sess.run(tf.global_variables_initializer())
for batch in range(1000)
x, y = get_batch()
_, loss = sess.run(adam, cost, {X:x, Y:y})
Всего на шахматной доске 64 квадрата, и каждый квадрат может быть занят 6 белыми фигурами, 6 черными фигурами или быть вакантным, поэтому выводкаждого sess.run()
- тензор формы (batch_size, 64, 13)
.
split_into_squares()
берет серию изображений шахматной доски и преобразует ее в тензор с размерами (batch_size, 64, 25, 25, 3), 64- это число квадрата на шахматной доске, 25 - ширина и высота каждого квадрата, 3 - число канала.
Точная реализация функции cnn()
не имеет значения, важная частьчто он принимает веса нейронной сети, обрабатывает один квадрат и возвращает тензор предсказания формы (batch_size, 13)
.
Учитывая эту настройку, как я могу запустить cnn()
для каждого квадрата в одном графе вычислений?