如何在tensorflow中将RGB图像实现为张量?

cos*_*sst 2 python image-processing deep-learning tensorflow

我是tensorflow的新手,正在尝试创建一个堆栈式稀疏去噪自动编码器模型。我通过这里和github的示例找到了一种如何加载我的训练(和测试)集的方法,但是我无法将它们用作张量来执行所需的乘法等。(此代码仅用于加载图像)

import tensorflow as tf
import glob
import numpy as np
from PIL import Image as im

im_list = []

#LOAD ALL SETS
training_set = []
training_set = glob.glob("folder/training_set/*.jpg")

testing_set = []
testing_set = glob.glob("folder/corrupted/*.jpg") 

# testing my code only for the training set
filename_queue = tf.train.string_input_producer(training_set)

reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)

#data = tf.image.decode_jpeg(value)
data = tf.decode_raw(value, tf.uint8)

sess = tf.InteractiveSession()

sess.run(tf.global_variables_initializer())
#sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)

for i in range (196):
    print i
    m_key = sess.run([key,data])
    im_list.append(m_key[1])



coord.request_stop()
coord.join(threads)
Run Code Online (Sandbox Code Playgroud)

通过使用此代码,我设法将所有图像保存为包含数据的uint8数组的列表,但它们的大小在〜800到〜1000之间。我的图片尺寸为32x32x3,因此缺少某些内容。

我尝试过的其他方法是:

filename_queue = tf.train.string_input_producer(training_set)

image_reader = tf.WholeFileReader()

_, image_file = image_reader.read(filename_queue)

imagee = tf.image.decode_jpeg(image_file)

#tf.cast(imagee, tf.float32)

sess = tf.InteractiveSession()

sess.run(tf.global_variables_initializer())

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)

image = sess.run(imagee) 

imaginar = image.astype(np.float32)

#train_step.run(feed_dict={x: imaginar, y_: imaginar_test})

coord.request_stop()
coord.join(threads)
Run Code Online (Sandbox Code Playgroud)

我试图计算

y = tf.matmul(x,W) + b           
h_x_s = tf.sigmoid(y)
h_x = tf.matmul(h_x_s,W_) + b_
y_xi = tf.sigmoid(h_x) 
Run Code Online (Sandbox Code Playgroud)

这样,我的图像是32x32x3的numpy数组,但是我找不到将它们保存为张量的方法,因此tf.matmul可以工作。我总是会得到关于数组不适合形状的错误。

# VARIABLES
x= tf.placeholder(tf.float32,[32, 32, 3])
y_ = tf.placeholder(tf.float32,[32, 32, 3])

W = tf.Variable(tf.zeros([32,32,3]))
b = tf.Variable(tf.zeros([32,32,3]))

W_ = tf.Variable(tf.zeros([32,32,3]))
b_= tf.Variable(tf.zeros([32,32,3]))
Run Code Online (Sandbox Code Playgroud)

(尝试失败)

我应该如何加载(和解码)图像,变量和占位符应为​​多大?任何帮助将非常感激!

谢谢 :)

cos*_*sst 5

以防万一有人有同样的问题:

首先使用decode_jpeg(data, channels = 3)(通道= 3表示RGB)或其他解码器,具体取决于您的图像类型。

因此,您可以将3D图像转换为2D矢量。例如,如果图像为(32,32,3),则向量应为(1,32 * 32 * 3)->(1,3072)。您可以使用

2d_vec = original_3d_image.reshape(1,-1)

您可以使用将其转换回3D

2d_vec.reshape(32,32,3)

在将数据用作输入之前,请不要忘记对其进行标准化。您要做的就是

2d_vec = 2d_vec / max_value_of_2d_vec

我在之前发布的代码中进行了很多更改,因此,如果您有任何疑问,请问我!