TensorFlow-使用interleave或parallel_interleave

时间:2019-02-21 18:23:30

标签: tensorflow tensorflow-datasets h5py

我正在使用Q&A这样的V1.12 API的tf.data.Datasets来读取目录中每个文件预先保存的多个.h5文件。 我首先做了一个发电机:

class generator_yield:
    def __init__(self, file):
        self.file = file

    def __call__(self):
        with h5py.File(self.file, 'r') as f:
            yield f['X'][:], f['y'][:]

然后列出文件名并在Dataset中传递它们:

def _fnamesmaker(dir, mode='h5'):
    fnames = []
    for dirpath, _, filenames in os.walk(dir):
        for fname in filenames:
            if fname.endswith(mode):
                fnames.append(os.path.abspath(os.path.join(dirpath, fname)))
    return fnames

fnames = _fnamesmaker('./')
len_fnames = len(fnames)
fnames = tf.data.Dataset.from_tensor_slices(fnames)

应用数据集的交织方法:

# handle multiple files
ds = fnames.interleave(lambda filename: tf.data.Dataset.from_generator(
    generator_yield(filename), output_types=(tf.float32, tf.float32),
    output_shapes=(tf.TensorShape([100, 100, 1]), tf.TensorShape([100, 100, 1]))), cycle_length=len_fnames)
ds = ds.batch(5).shuffle(5).prefetch(5)

# init iterator
it = ds.make_initializable_iterator()
init_op = it.initializer
X_it, y_it = it.get_next()

型号:

# model
with tf.name_scope("Conv1"):
    W = tf.get_variable("W", shape=[3, 3, 1, 1],
                         initializer=tf.contrib.layers.xavier_initializer())
    b = tf.get_variable("b", shape=[1], initializer=tf.contrib.layers.xavier_initializer())
    layer1 = tf.nn.conv2d(X_it, W, strides=[1, 1, 1, 1], padding='SAME') + b
    logits = tf.nn.relu(layer1)


    loss = tf.reduce_mean(tf.losses.mean_squared_error(labels=y_it, predictions=logits))
    train_op = tf.train.AdamOptimizer(learning_rate=0.0001).minimize(loss)

开始会话:

with tf.Session() as sess:
    sess.run([tf.global_variables_initializer(), init_op])
    while True:
        try:
            data = sess.run(train_op)
            print(data.shape)
        except tf.errors.OutOfRangeError:
            print('done.')
            break

错误看起来像:

  

TypeError:预期的str,字节或os.PathLike对象,而不是Tensor   在生成器的 init 方法中。显然,当应用交错时,它就是张量传递到生成器

2 个答案:

答案 0 :(得分:0)

您不能直接通过sess.run运行数据集对象。您必须定义一个迭代器,获取下一个元素。尝试做类似的事情:

RawS1  RaWI1 RawS2  RawI2 SP     T1  T2
14299   52   14299  54    105    1   3
14299   56   14299  57    106    2   3
14299   58   14299  60    107    1   3

您应该能够得到张量。

答案 1 :(得分:0)

根据此post,我的案子不会因var list = new MyReactiveList<int>(); var item = new new Subject<int>(); list.Subscribe(values => Console.WriteLine($"[{string.Join(", ", values)}]")); list.Add(item); item.OnNext(1); // Will print out [1] 的表现而受益。

  

...具有一个转换,可以转换源中的每个元素   数据集分解为多个元素,再放入目标数据集...

在具有数据(狗,猫...)的典型分类问题中,保存在单独的目录中更有意义。我们这里有一个分割问题,这意味着标签包含输入图像的相同尺寸。所有数据都存储在一个目录中,每个.h5文件都包含一张图像及其标签(蒙版)

此处,带有<ng-container matColumnDef="actions"> <mat-header-cell *matHeaderCellDef>Actions </mat-header-cell> <mat-cell *matCellDef="let row"> <button mat-icon-button matTooltip="Click to Edit" class="iconbutton" color="primary"> <mat-icon aria-label="Edit">edit</mat-icon> </button> <button mat-icon-button matTooltip="Click to Delete" class="iconbutton" color="warn"> <mat-icon aria-label="Delete">delete</mat-icon> </button> </mat-cell> </ng-container> 的简单parralel_interleavesufficient