如何在tensorflow中使用正确的数组大小为我的网络提供信息

时间:2018-05-24 20:55:06

标签: tensorflow

我有以下代码,我正在尝试训练我用比利时交通标志建立的网络,以下是代码:

    import tensorflow as tf
import os 
import skimage.io
from skimage import transform 
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns


config=tf.ConfigProto(log_device_placement=True)
#config_soft = tf.ConfigProto(allow_soft_placement =True)

def load_data(data_directory):
    directories = [d for d in os.listdir(data_directory) 
                   if os.path.isdir(os.path.join(data_directory, d))]
    labels = []
    images = []
    for d in directories:
        label_directory = os.path.join(data_directory, d)
        file_names = [os.path.join(label_directory, f) 
                      for f in os.listdir(label_directory) 
                      if f.endswith(".ppm")]
        for f in file_names:
            images.append(skimage.io.imread(f))
            labels.append(int(d))
    return images, labels

Root_Path = "/home/raed/Dropbox/Thesis/Codes/Tensorflow"
training_Directory = os.path.join(Root_Path,"Training")
testing_Directory = os.path.join(Root_Path,"Testing")
images, labels = load_data(training_Directory)

# Convert lists to array in order to retrieve to facilitate information retrieval 
images_array = np.asarray(images)
labels_array = np.asanyarray(labels)

#print some information about the datasets 
print(images_array.ndim)
print(images_array.size)
print(labels_array.ndim)
print(labels_array.nbytes)
print(len(labels_array))

# plotting the distribution of different signs
sns.set(palette="deep") 
plt.hist(labels,62)

# Selecting couple of images based on their indices 
traffic_signs = [300,2250,3650,4000]
for i in range(len(traffic_signs)):
    plt.subplot(1, 4, i+1)
    plt.imshow(images_array[traffic_signs[i]])
plt.show()

# Fill out the subplots with the random images and add shape, min and max values
for i in range(len(traffic_signs)):
    plt.subplot(1,4,i+1)
    plt.imshow(images_array[traffic_signs[i]])
    plt.axis('off')
    plt.show()
    print("Shape:{0},max:{1}, min:{2}".format(images_array[traffic_signs[i]].shape,
                                              images_array[traffic_signs[i]].max(),
                                              images_array[traffic_signs[i]].min()))

# Get unique labels
unique_labels = set(labels_array)

# initialize the figure
plt.figure(figsize=(15,15))

i=1
for label in unique_labels:
    image = images_array[labels.index(label)]
    plt.subplot(8,8,i)
    plt.axis('off')
    plt.title('label:{0} ({1})'.format(label, labels.count(label)))
    i=i+1
    plt.imshow(image)
plt.show()

images28 = [transform.resize(image, (28, 28)) for image in images]
images28_array = np.asanyarray(images28)

for i in range(len(traffic_signs)):
    plt.subplot(1,4,i+1)
    plt.imshow(images_array[traffic_signs[i]])
    plt.axis('off')
    plt.show()
    print("Shape:{0},max:{1}, min:{2}".format(images28_array[i].shape,
                                              images28_array[i].max(),
                                              images28_array[i].min()))

#convert to grayscale
gray_images = skimage.color.rgb2gray(images28_array)

for i in range(len(traffic_signs)):
    plt.subplot(1, 4, i+1)
    plt.axis('off')
    plt.imshow(gray_images[traffic_signs[i]], cmap="gray")
    plt.subplots_adjust(wspace=0.5)

# Show the plot
plt.show()

# prepare placeholders
x = tf.placeholder(dtype=tf.float32, shape =[None, 28,28])
y = tf.placeholder(dtype= tf.int32, shape=[None])

#Flatten the input data
images_flat = tf.layers.flatten(x)

#Fully connected layer , Multi-layer Perceptron (MLP)
logits = tf.contrib.layers.fully_connected(images_flat,62, tf.nn.relu)

#Define loss function
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=y, logits=logits))

#define an optimizer (Stochastic Gradient Descent )
optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)

#convert logits to label indices
correct_prediction = tf.arg_max(logits,1)

#define an accuracy metric
accuracy =tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

#########################################
print('######### Main Program #########')  
#########################################
print("images_flat: ", images_flat)
print("logits: ", logits)
print("loss: ", loss)
print("Optimizer:",optimizer)
print("predicted_labels: ", correct_prediction)

tf.set_random_seed(1235)
#images28 = np.asanyarray(images28).reshape(-1, 28, 28,1)

#with tf.Session() as training_session:
#    training_session.run(tf.global_variables_initializer())
#    for i in range(201):
#        print('Epoch', i)
#        _,accuracy_value = training_session([optimizer, accuracy],feed_dict={x:images28, y:labels})
#        if i%10 ==0:
#            print("Loss", loss)
#        print('Epochs Done!!')

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(201):
        _, loss_value = sess.run([optimizer, loss], feed_dict={x: gray_images, y: labels})
        if i % 10 == 0:
            print("Loss: ", loss)

我在进行网络喂养之前也进行了一系列转换,如下所示:

images28 = [transform.resize(image, (28, 28)) for image in images]
images28_array = np.asanyarray(images28)

但是在执行时我收到以下错误:

ValueError: Cannot feed value of shape (4575, 28, 28, 3) for Tensor 'Placeholder_189:0', which has shape '(?, 28, 28)'

您能否帮助我,我在培训此网络时遇到错误,请参阅以下链接以获取更多信息: https://www.datacamp.com/community/tutorials/tensorflow-tutorial

0 个答案:

没有答案