tf.reshape не работает в тех случаях, когда вы добавляете дополнительное измерение

1

Согласно веб-сайту tenorflow, tf.reshape принимает тензор определенной формы и отображает его в тензор другой формы. Я хочу отобразить тензор размера [600, 64] на тензор размера [-1, 8, 8, 1] (в котором размер в позиции -1 равен 600). Это, кажется, не работает, хотя.

Я запускаю это на tenorflow на python 3.6 и, хотя оно преобразуется в нечто вроде [-1, 8, 8], оно не преобразуется в [-1, 8, 8, 1]

import tensorflow as tf
import numpy as np
from sklearn import datasets
from sklearn.preprocessing import LabelBinarizer

# preprocessing method needed
    def flatten(array):
        temp = []
        for j in array:
            temp.extend(j)
        return temp

# preprocess the data
digits = datasets.load_digits()
images = digits.images
images = [flatten(i) for i in images]
labels = digits.target
labels = LabelBinarizer().fit_transform(labels)

# the stats needed
width = 8
height = 8
alpha = 0.1
num_labels = 10
kernel_length = 3
batch_size = 10
channels = 1

# the tensorflow placeholders and reshaping
X = tf.placeholder(tf.float32, shape = [None, width * height * channels])

# AND NOW HERE IS WHERE THE ERROR STARTS
y_true = tf.placeholder(tf.float32, shape = [None, num_labels])
X = tf.reshape(X, [-1, 8, 8, 1])

# the convolutional model
conv1 = tf.layers.conv2d(X, filters = 32, kernel_size = [kernel_length,  kernel_length])
conv2 = tf.layers.conv2d(conv1, filters = 64, kernel_size = [2, 2])
flatten = tf.reshape(X, [-1, 1])
dense1 = tf.layers.dense(flatten, units=50, activation = tf.nn.relu)
y_pred = tf.layers.dense(dense1, units=num_labels, activation = tf.nn.softmax)

# the loss and training functions
loss = tf.losses.mean_squared_error(labels=y_true, predictions=y_pred)
train = tf.train.GradientDescentOptimizer(alpha).minimize(loss)

# initializing the variables and the tf.session
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

# running the session
for i in range(batch_size):
    _, lossVal = sess.run((train, loss), feed_dict = {X:images[:600], y_true: labels[:600]})
    print(lossVal)

Я продолжаю получать эту ошибку: ValueError: Невозможно передать значение формы (600, 64) для Tensor 'Reshape: 0', который имеет форму '(?, 8, 8, 1)' И я чувствую, что это не должно быть случай с 8 * 8 * 1 равен 64.

Теги:
tensorflow
python-3.x

1 ответ

0
Лучший ответ

images[:600] форму (600, 64), которая не соответствует ожидаемой форме заполнителя (None, 8, 8, 1).

Либо измените ваши данные, либо измените форму заполнителя.

Обратите внимание, что тот факт, что вы изначально определили форму заполнителя (None, 64), несущественен, так как вы изменили ее несколькими строками позже.

  • 0
    Не могли бы вы пояснить утверждение: «Обратите внимание, что тот факт, что вы изначально определили форму заполнителя (None, 64), несущественен, поскольку вы изменили ее несколько строк спустя». Означает ли это, что тензорный поток будет ожидать ввода с измерениями (Нет, 8, 8, 1), даже если мы сказали, что ввод должен быть (Нет, 64) просто потому, что тензор потока учитывает изменение формы (во время создания вычислительного графа) ) и затем запрашивает размеры, которые соответствуют этому требованию?
  • 0
    Точно. Когда вы используете feed_dict={X:...} , X является заполнителем формы (None, 8, 8, 1) . Если вы хотите передать массив формы (600, 64) и изменить его на (None, 8, 8, 1) , не перезаписывайте X с помощью X = tf.reshape(...) а используйте что-то вроде X_reshape = tf.reshape(...) .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню