Ошибка поэлементного умножения матрицы Tensorflow (для цикла)

#python #tensorflow

#python #tensorflow

Вопрос:

Я хочу вычислить умножение матрицы с помощью Tensorflow.
Но это привело к ошибкам, в то время как использование numpy не приводит к ошибкам.
(Процесс завершен с кодом выхода 139 (прерван сигналом 11: SIGSEGV))

Tensorflow с CPU / GPU: произошла ошибка: процесс завершен с кодом выхода 139 (прерван сигналом 11: SIGSEGV) С помощью Numpy (без Tensorflow): это происходит хорошо

 import tensorflow as tf
mport numpy as np

num_doc = 1000 #10000
num_topic = 10
num_user = 20 #8000
cost = 0

#### Tensorflow with CPU ####
with tf.device('/cpu:0'):
    a_dk = tf.Variable(tf.random_normal([num_doc,num_topic]))
    x_uk = tf.Variable(tf.random_normal([num_user,num_topic]))
    x_dk = tf.Variable(tf.random_normal([num_doc,num_topic]))
    for u in range(num_user):
        print u
        for d in range(num_doc):
            for k in range(num_topic):
                cost = cost   a_dk[d,k] * x_uk[u,k] * x_dk[d,k]

#### Tensorflow with GPU ####
a_dk = tf.Variable(tf.random_normal([num_doc,num_topic]))
x_uk = tf.Variable(tf.random_normal([num_user,num_topic]))
x_dk = tf.Variable(tf.random_normal([num_doc,num_topic]))
for u in range(num_user):
    print u
    for d in range(num_doc):
        for k in range(num_topic):
            cost = cost   a_dk[d,k] * x_uk[u,k] * x_dk[d,k]

#### Numpy ####
a_dk = np.random.randn(num_doc, num_topic)
x_uk = np.random.randn(num_user, num_topic)
x_dk = np.random.randn(num_doc, num_topic)
for u in range(num_user):
    print u
    for d in range(num_doc):
        for k in range(num_topic):
            cost = cost   a_dk[d,k] * x_uk[u,k] * x_dk[d,k]
  

Я использовал i7-4k / 16GB ram / GTX-1070 (8GB)
И мне нужно решение для поэлементного умножения матрицы на основе цикла с помощью Tensorflow.
(На самом деле, моя проблема сложнее, чем приведенный выше код. Так что трудно сделать это векторизацией)

Заранее благодарю вас!!

Комментарии:

1. Пожалуйста, добавьте больше деталей, что именно вы хотите? Почему вы пометили это как c , вам нужно решение на основе цикла for на c ? Если вам нужна помощь в python, пометьте его как python.

Ответ №1:

У вас есть несколько ошибок в том, что вы вставили. Вы неправильно импортируете numpy.

для tensorflow вам необходимо создать сеанс.

 with tf.Session() as sess:
    ... cpu or gpu code here...
    print(sess.run([cost]))
  

для numpy это как встроенное поэлементное умножение

 result = np.multiply(A,B)
  

Просто используйте это. Вы также можете индексировать в A, B при его вызове

 result = np.multiply(A[i,:],B[:,i])
  

Комментарии:

1. Я хочу вычислить его с помощью tensorflow, а не numpy.

2. если вы используете версию 0.11 и выше, это почти та же нотация, что и numpy. результат = tf.matmul(A,B) или результат = tf.matmul(A[i,:],B[:,i])

3. Я использую tensorflow 0.10. И я хочу вычислить приведенное выше уравнение #### Tensorflow с помощью GPU #### не только tf.matmul(A,B) или tf.matmul(A[i,:],B[:,i])

4. Я предлагаю, чтобы вы могли векторизовать свой подход. Это будет намного быстрее, чем цикл for.

5. tmp = tf.matmul(A[i,:,:],B[:,i,:]); res = tf.matmul(tmp[i,:,:],C[:,:,i]) вы должны быть в состоянии обобщить это.

Ответ №2:

Ошибка, скорее всего, вызвана созданием огромного графа TensorFlow, содержащего не менее 10 узлов на самую внутреннюю итерацию цикла. Подобные операции более эффективно вычисляются с использованием встроенных поэлементных операторов TensorFlow, которые поддерживают широковещательную передачу, чтобы избежать необходимости материализации всей матрицы. Например, ваша программа может быть написана с двумя (поэлементными) tf.multiply() операциями и tf.reduce_sum() :

 a_dk = tf.Variable(tf.random_normal([num_doc,num_topic]))
x_uk = tf.Variable(tf.random_normal([num_user,num_topic]))
x_dk = tf.Variable(tf.random_normal([num_doc,num_topic]))

ax_dk = tf.multiply(a_dk, x_dk)

# Add extra dimensions to broadcast ax_dk along the user dimension, and
# x_uk along the docs dimension:
cost = tf.reduce_sum(tf.multiply(ax_dk[:, None, :], x_uk[None, :, :]))