Как чередовать присвоение 4 субтензора большему тензору?

Я хочу получить больший тензор на 4 субтензора с чередующимся индексом.

Вот мой вопрос:

Четыре входа с формой [пакет х 2м х 2н х 1];

Выходная форма: [партия x 4 м x 4n x 1];

index_y_0_1 = [0,1,4,5,8,9...], index_y_2_3 = [2,3,6,7,10,11...]

index_x_0_1 = [0,1,4,5,8,9...], index_x_2_3 = [2,3,6,7,10,11...]

Выход[index_y_0_1, index_x_0_1] = Вход0

Выход[index_y_0_1, index_x_2_3] = Вход1

Выход[index_y_2_3, index_x_0_1] = Вход2

Выход[index_y_2_3, index_x_2_3] = Вход3

Вот мой вопрос с кодом Python:

import numpy as np

UpperLeft = np.ones((3,2,4,1))
UpperRight = np.ones((3,2,4,1))*2
BottonLeft = np.ones((3,2,4,1))*3
BottonRight = np.ones((3,2,4,1))*4

output = np.zeros((UpperLeft.shape[0], UpperLeft.shape[1]*2, UpperLeft.shape[2]*2, 1))

assert(output.shape[1]%4 == 0)
assert(output.shape[2]%4 == 0)

# UpperLeft Assignment
start_y = 0
start_x = 0
output[:,(start_y + 0)::4, (start_x + 0)::4, :] = UpperLeft[:,0::2, 0::2, :]
output[:,(start_y + 0)::4, (start_x + 1)::4, :] = UpperLeft[:,0::2, 1::2, :]
output[:,(start_y + 1)::4, (start_x + 0)::4, :] = UpperLeft[:,1::2, 0::2, :]
output[:,(start_y + 1)::4, (start_x + 1)::4, :] = UpperLeft[:,1::2, 1::2, :]

# UpperRight Assignment
start_y = 0
start_x = 2
output[:,(start_y + 0)::4, (start_x + 0)::4, :] = UpperRight[:,0::2, 0::2, :]
output[:,(start_y + 0)::4, (start_x + 1)::4, :] = UpperRight[:,0::2, 1::2, :]
output[:,(start_y + 1)::4, (start_x + 0)::4, :] = UpperRight[:,1::2, 0::2, :]
output[:,(start_y + 1)::4, (start_x + 1)::4, :] = UpperRight[:,1::2, 1::2, :]

# BottonLeft Assignment
start_y = 2
start_x = 0
output[:,(start_y + 0)::4, (start_x + 0)::4, :] = BottonLeft[:,0::2, 0::2, :]
output[:,(start_y + 0)::4, (start_x + 1)::4, :] = BottonLeft[:,0::2, 1::2, :]
output[:,(start_y + 1)::4, (start_x + 0)::4, :] = BottonLeft[:,1::2, 0::2, :]
output[:,(start_y + 1)::4, (start_x + 1)::4, :] = BottonLeft[:,1::2, 1::2, :]

# BottonRight Assignment
start_y = 2
start_x = 2
output[:,(start_y + 0)::4, (start_x + 0)::4, :] = BottonRight[:,0::2, 0::2, :]
output[:,(start_y + 0)::4, (start_x + 1)::4, :] = BottonRight[:,0::2, 1::2, :]
output[:,(start_y + 1)::4, (start_x + 0)::4, :] = BottonRight[:,1::2, 0::2, :]
output[:,(start_y + 1)::4, (start_x + 1)::4, :] = BottonRight[:,1::2, 1::2, :]

show_out = output[0,:,:,0]

Как я могу сделать это на тензорном потоке? Спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас может быть функция, которая чередует тензоры по одной оси, как эта.

import tensorflow as tf

# Interlaves tensors across one axis
def interleave(tensors, size=1, axis=-1):
    # Reshape tensors
    tensors_res = []
    for tensor in tensors:
        s = tf.shape(tensor)
        new_s = tf.concat([s[:axis], [s[axis] // size, size], s[axis:][1:]], axis=0)
        tensors_res.append(tf.reshape(tensor, new_s))
    # Concatenate across new dimension
    if isinstance(axis, (tf.Tensor, tf.Variable)):
        selected_axis = tf.cond(tf.less(axis, 0), lambda: axis - 1, lambda: axis)
        concat_axis = tf.cond(tf.less(axis, 0), lambda: axis, lambda: axis + 1)
    else:
        selected_axis = (axis - 1) if axis < 0 else axis
        concat_axis = axis if axis < 0 else (axis + 1)
    tensors_concat = tf.concat(tensors_res, axis=concat_axis)
    # Reshape concatenation
    concat_s = tf.shape(tensors_concat)
    res_s = tf.concat([concat_s[:selected_axis], [-1], concat_s[concat_axis:][1:]], axis=0)
    return tf.reshape(tensors_concat, res_s)

Затем вы можете использовать это для чередования сначала в одном измерении, а затем в другом.

import tensorflow as tf

with tf.Graph().as_default(), tf.Session() as sess:
    # Input data
    UpperLeft = tf.ones((3, 2, 4, 1))
    UpperRight = tf.ones((3, 2, 4, 1)) * 2
    BottomLeft = tf.ones((3, 2, 4, 1)) * 3
    BottomRight = tf.ones((3, 2, 4, 1)) * 4
    # Interleave across axis 2
    Upper = interleave([UpperLeft, UpperRight], size=2, axis=2)
    Bottom = interleave([BottomLeft, BottomRight], size=2, axis=2)
    # Interleave across axis 1
    Result = interleave([Upper, Bottom], size=2, axis=1)
    # Show result
    print(sess.run(Result)[0, :, :, 0])
    # [[1. 1. 2. 2. 1. 1. 2. 2.]
    #  [1. 1. 2. 2. 1. 1. 2. 2.]
    #  [3. 3. 4. 4. 3. 3. 4. 4.]
    #  [3. 3. 4. 4. 3. 3. 4. 4.]]

Вау, какое необычное решение. Спасибо!

RJ. Lo 14.06.2019 04:03

Другие вопросы по теме