Согласно веб-сайту 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.
images[:600]
форму (600, 64)
, которая не соответствует ожидаемой форме заполнителя (None, 8, 8, 1)
.
Либо измените ваши данные, либо измените форму заполнителя.
Обратите внимание, что тот факт, что вы изначально определили форму заполнителя (None, 64)
, несущественен, так как вы изменили ее несколькими строками позже.
feed_dict={X:...}
,X
является заполнителем формы(None, 8, 8, 1)
. Если вы хотите передать массив формы(600, 64)
и изменить его на(None, 8, 8, 1)
, не перезаписывайтеX
с помощьюX = tf.reshape(...)
а используйте что-то вродеX_reshape = tf.reshape(...)
.