示例#1
0
def write_tfrecord(decode_path, write_path):
    img_data = basis_code.basis_decode(decode_path)
    #维度为6x10x3
    img_data = tf.image.resize_images(img_data, [6, 10], method=1)
    with tf.Session() as sess:
        img_value = sess.run(img_data)
    #总共写入多少文件
    num_shards = 2
    #每个文件写入多少数据
    instance_per_shard = 3
    for i in range(2):
        #将文件分为多个文件。以便读取时方便匹配
        filename = os.path.join(
            write_path,
            "data.tfrecords-" + str(i) + ".5d-of-" + str(num_shards) + ".5d")
        writer = tf.python_io.TFRecordWriter(filename)
        for j in range(instance_per_shard):
            if i == 1:
                j = j + 3
            Log_Util.getlogger("write img" + str(j)).info(img_value[j])
            img_raw = img_value[j].tostring()
            example = tf.train.Example(features=tf.train.Features(
                feature={
                    "labels": _int64_feature(j),
                    "img_data": _byte_feature(img_raw)
                }))
            try:
                writer.write(example.SerializeToString())
            except IOError:
                print("write error!")
                writer.close()
        writer.close()
示例#2
0
def read_TFRercod():
    #创建一个reader来获取TFRecord文件的样例
    reader = tf.TFRecordReader()
    #创建一个队列来维护输入文件列表
    fileName_queue = tf.train.string_input_producer([FILENAME])
    #从文件中读取一个样例。也可以使用read_up_to函数一次性读取多个样例
    _, serialized_example = reader.read(fileName_queue)
    #解析读入的一个样例,如果需要解析多个样例,可以用parse_example
    features = tf.parse_single_example(
        serialized_example,
        features={
            #必须和写入时的类型一致
            'pixels': tf.FixedLenFeature([], tf.int64),
            'labels': tf.FixedLenFeature([], tf.int64),
            'image_raw': tf.FixedLenFeature([], tf.string),
        })

    #tf.decode_raw可以将字符串解析成图像对应的像素数组.必须和读取mnist数据集时设置的类型一致
    image = tf.decode_raw(features['image_raw'], tf.uint8)
    #转换类型,把tf.int64转换为tf.int32
    pixels = tf.cast(features['pixels'], tf.int32)
    labels = tf.cast(features['labels'], tf.int32)

    sess = tf.Session()
    #启动多线程处理输入数据
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(sess=sess, coord=coord)
    #每次运行可以读取TFRecord文件中的一个样例
    # for i in range(10):
    Log_Util.getlogger("read").info(sess.run([image, pixels, labels]))
    pass
示例#3
0
def run_eval(sess, test_x, test_y):
    X, y = tf.data.Dataset.from_tensor_slices(
        (test_x, test_y)).batch(1).make_one_shot_iterator().get_next()

    #调用模型得到预测结果。这里不需要输入真实的y值
    with tf.variable_scope("model", reuse=True):
        prediction, _, _ = lstm_model(X, [0.0], False)

    #将预测结果存入一个数组
    predictions = []
    labels = []
    for i in range(TESTING_EXAMPLES):
        p, l = sess.run([prediction, y])
        predictions.append(p)
        labels.append(l)
    Log_Util.getlogger("labels1").info(labels)
    Log_Util.getlogger("predictions1").info(predictions)
    #计算rmse作为评估指标
    predictions = np.array(predictions).squeeze()
    labels = np.array(labels).squeeze()
    rmse = np.sqrt(((predictions - labels)**2).mean(axis=0))
    print("Mean Square Error is: %f" % rmse)

    Log_Util.getlogger("labels2").info(labels)
    Log_Util.getlogger("predictions2").info(predictions)

    #对预测的sin函数曲线进行绘图
    plt.figure()
    plt.plot(labels, label="real_sin")
    plt.plot(predictions, label="predictions")
    plt.legend()
    plt.show()
示例#4
0
def read_tfrecord(filepath):
    files = tf.train.match_filenames_once(
        os.path.join(filepath, "data.tfrecords-*"))
    #通过tf.train.string_input_producer函数创建输入队列,输入队列中的文件列表为tf.train.match_filenames_once函数获取的文件列表。这里将shuffle参数设置为False.
    #来避免随机打乱读文件的顺序,但一般在解决真实问题时,会将shuffle参数设置为True
    filename_queue = tf.train.string_input_producer(files, shuffle=False)
    reader = tf.TFRecordReader()
    _, seriallzed_example = reader.read(filename_queue)
    #img_data和labels要和写入的名字保持一致
    example = tf.parse_single_example(seriallzed_example,
                                      features={
                                          "img_data":
                                          tf.FixedLenFeature([], tf.string),
                                          "labels":
                                          tf.FixedLenFeature([], tf.int64)
                                      })

    image = tf.decode_raw(example["img_data"], tf.uint8)
    labels = tf.cast(example["labels"], tf.int32)

    with tf.Session() as sess:
        #虽然在本段程序中没有声明任何变量,但使用tf.train.match_filenames_once函数时需要初始化一些变量
        tf.local_variables_initializer().run()
        Log_Util.getlogger("file names").info(sess.run(files))
        #声明tf.train.Coordinator类来协同不同线程,并启动线程
        coord = tf.train.Coordinator()
        threads = tf.train.start_queue_runners(sess=sess, coord=coord)
        for i in range(6):
            Log_Util.getlogger("read img data").info(sess.run(image))
            Log_Util.getlogger("read labels").info(sess.run(labels))

        coord.request_stop()
        coord.join(threads)
        print("all thread stop!")
示例#5
0
def method_one(filepath):
    before_img_data = basis_decode(filepath)
    if before_img_data.dtype != tf.float32:
        #这里tf.image.decode_png 得到的是uint8格式,范围在0-255之间,经过convert_image_dtype 就会被转换为区间在0-1之间的float32格式
        #大多数API支持整数和实数的类型的输入。如果输入时整数类型,这些API会在内部将输入转化为实数后处理,再将输出转化为整数。
        #如果有多个处理步骤,在整数和实数之间的反复转化将导致精度损失,因此推荐在图像处理前将其转化为实数类型。
        before_img_data = tf.image.convert_image_dtype(before_img_data,
                                                       tf.float32)
    for i in range(4):
        #第一个参数为原始图像。第二个参数为调整后的图像大小,method参数给出了调整图像大小的算法,注意,如果输入数据为unit8格式,
        # 那么输出将是0~255之间的实数,不方便后续处理,所以建议在调整图像大小之前先转化为实数类型,用tf.image.convert_image_dtype函数
        img_data = tf.image.resize_images(before_img_data, [300, 300],
                                          method=i)
        with tf.Session() as sess:
            #原始的图像维度为(1105, 681, 3)
            #画出改变大小的图像
            basis.drawing(sess.run(img_data))
            #获取编码路径
            endoce_path = get_encode_path(filepath, i)
            Log_Util.getlogger("编码路径为:").info(endoce_path)
            #编码到新的图片中
            basis_encode(img_data, endoce_path)
示例#6
0
def batch_test(filepath):
    #获取解析的数据
    img_raw, label_raw = read_file(filepath)
    #一个batch中样例的个数
    batch_size = 3
    #组合样例的队列中最多可以存储的样例个数,一般来说这个队列的大小会和每个batch的大小相关。
    capacity = 1000 + 3 * batch_size
    #使用tr.train.batch函数组合样例,[img_raw, label_raw]参数给出了需要组合的元素,一般img和label分别代表训练样本和这个样本对应的正确标签。batch_size参数给出了每个batch
    #中样例的个数,capacity给出了队列的最大容量,当队列长度等于容量时,Tensorflow将暂停入队操作,而只是等待元素出队。当元素个数小于容量时,Tensorflow将自动重新启动入队操作。
    img_batch, label_batch = tf.train.batch([img_raw, label_raw],
                                            batch_size=batch_size,
                                            capacity=capacity)
    with tf.Session() as sess:
        tf.local_variables_initializer().run()
        coord = tf.train.Coordinator()
        threads = tf.train.start_queue_runners(sess=sess, coord=coord)
        # for i in range(6):
        Log_Util.getlogger("img batch").info(sess.run(img_batch))
        Log_Util.getlogger("img labels").info(sess.run(label_batch))
        coord.request_stop()
        coord.join(threads)
        print("all threads stop!")
示例#7
0
def shuffle_batch_test(filepath):
    #获取解析的数据
    img_raw, label_raw = read_file(filepath)
    #一个batch中样例的个数
    batch_size = 3
    #组合样例的队列中最多可以存储的样例个数,一般来说这个队列的大小会和每个batch的大小相关。
    capacity = 1000 + 3 * batch_size
    #shuffle_batch和batch函数基本一致,但是min_after_dequeue参数是shuffle_batch函数所独有的。min_after_dequeue参数限制了出队时队列中元素的最少个数,
    # 当队列中元素太少时,随机打乱样例顺序的作用就不大了。
    img_batch, label_batch = tf.train.shuffle_batch([img_raw, label_raw],
                                                    batch_size=batch_size,
                                                    capacity=capacity,
                                                    min_after_dequeue=30)
    with tf.Session() as sess:
        tf.local_variables_initializer().run()
        coord = tf.train.Coordinator()
        threads = tf.train.start_queue_runners(sess=sess, coord=coord)
        # for i in range(6):
        Log_Util.getlogger("img batch").info(sess.run(img_batch))
        Log_Util.getlogger("img labels").info(sess.run(label_batch))
        coord.request_stop()
        coord.join(threads)
        print("all threads stop!")
def inception_test(input):
    #加载slim库
    slim = tf.contrib.slim
    #slim.arg_scope函数可以用于设置默认的参数取值。slim.arg_scope函数的第一个参数是一个函数列表,在这个列表中的函数将使用默认的参数取值。比如通过如下的定义,调用
    #slim.conv2d(input, 32, [1, 1])函数时会自动加上stride=1和padding="SAME"的参数。如果在函数调用时指定了stride,那么这里设置的默认值就不会使用。通过这种方式可以进一步减少冗余的代码
    with slim.arg_scope([slim.conv2d, slim.max_pool2d, slim.avg_pool2d],
                        stride=1,
                        padding="SAME"):
        #为每一个inception模型声明一个统一的变量命名空间
        with tf.variable_scope("Mixed_7c"):
            #给inception模型中每一个路径声明一个命名空间
            with tf.variable_scope("Branch_0"):
                #实现一个过滤器边长为1,深度为320的卷积层。输出为[batch, 28, 28, 320]
                branch_0 = slim.conv2d(input,
                                       320, [1, 1],
                                       scope="Conv2d_0a_1x1")
                Log_Util.getlogger("branch_0").info(branch_0.shape)

            #Inception模型的第二条路径,这条计算路径上的结构本省也是一个Inception结构
            with tf.variable_scope("Branch_1"):
                #实现一个过滤器边长为1,深度为384的卷积层.输出为[batch, 28, 28, 384]
                branch_1 = slim.conv2d(input,
                                       384, [1, 1],
                                       scope="Conv2d_0a_1x1")
                Log_Util.getlogger("branch_1_1").info(branch_1.shape)
                #concat函数可以将多个矩阵拼接起来。第一个参数指定了拼接的维度,这里的3代表了矩阵是在深度这个维度上进行的拼接。输出为[batch, 28, 28, 768]
                branch_1 = tf.concat([
                    slim.conv2d(branch_1, 384, [1, 3], scope="Conv2d_0b_1x3"),
                    slim.conv2d(branch_1, 384, [3, 1], scope="Conv2d_0c_3x1")
                ], 3)
                Log_Util.getlogger("branch_1_2").info(branch_1.shape)

            #Inception模型的第三条路径,这条计算路径上的结构本省也是一个Inception结构
            with tf.variable_scope("Branch_2"):
                #实现一个过滤器边长为1,深度为448的卷积层.输出为[batch, 28, 28, 448]
                branch_2 = slim.conv2d(input,
                                       448, [1, 1],
                                       scope="Conv2d_0a_1x1")
                Log_Util.getlogger("branch_2_1").info(branch_2.shape)
                #输出为[batch, 28, 28, 384]
                branch_2 = slim.conv2d(branch_2,
                                       384, [3, 3],
                                       scope="Conv2d_0b_3x3")
                Log_Util.getlogger("branch_2_2").info(branch_2.shape)
                #concat函数可以将多个矩阵拼接起来。第一个参数指定了拼接的维度,这里的3代表了矩阵是在深度这个维度上进行的拼接。输出为[batch, 28, 28, 768]
                branch_2 = tf.concat([
                    slim.conv2d(branch_2, 384, [1, 3], scope="Conv2d_0c_1x3"),
                    slim.conv2d(branch_2, 384, [3, 1], scope="Conv2d_0d_3x1")
                ], 3)
                Log_Util.getlogger("branch_2_3").info(branch_2.shape)

            #Inception模型的第四条路径,这条计算路径上的结构本省也是一个Inception结构
            with tf.variable_scope("Branch_3"):
                #实现一个过滤器边长为1,深度为320的卷积层.输出为[batch, 28, 28, 1]
                branch_3 = slim.avg_pool2d(input, [3, 3],
                                           scope="AvgPool_0a_3x3")
                Log_Util.getlogger("branch_3_1").info(branch_3.shape)
                #输出为[batch, 28, 28, 192]
                branch_3 = slim.conv2d(branch_3,
                                       192, [1, 1],
                                       scope="Conv2d_0b_1x1")
                Log_Util.getlogger("branch_3_2").info(branch_3.shape)

            #当前Inception模型的最后输出是由上面4个计算结果拼接得到的,输出为[batch, 28, 28, 2048]
            net = tf.concat([branch_0, branch_1, branch_2, branch_3], 3)
            Log_Util.getlogger("final").info(net.shape)

    return net
示例#9
0
    Log_Util.getlogger("labels2").info(labels)
    Log_Util.getlogger("predictions2").info(predictions)

    #对预测的sin函数曲线进行绘图
    plt.figure()
    plt.plot(labels, label="real_sin")
    plt.plot(predictions, label="predictions")
    plt.legend()
    plt.show()


#用正玄函数生成训练和测试数据集合
#numpy.linspace函数可以创建一个等差序列的数组,它常用的参数有三个参数,第一个参数表示起始值,第二个参数表示终止值,第三个参数表示数列的长度。例如,linespace(1,10,10)
#产生的数组是array([1,2,3,4,5,6,7,8,9,10])
test_start = (TRAINING_EXAMPLES + TIMESTEPS) * SAMPLE_GAP
Log_Util.getlogger("test start").info(test_start)
test_end = test_start + (TESTING_EXAMPLES + TIMESTEPS) * SAMPLE_GAP
Log_Util.getlogger("test end").info(test_end)
train_X, train_y = generate_data(
    np.sin(
        np.linspace(0,
                    test_start,
                    TRAINING_EXAMPLES + TIMESTEPS,
                    dtype=np.float32)))
Log_Util.getlogger("train X").info(train_X)
Log_Util.getlogger("train y").info(train_y)
test_X, test_y = generate_data(
    np.sin(
        np.linspace(test_start,
                    test_end,
                    TESTING_EXAMPLES + TIMESTEPS,
示例#10
0
    if img_data.dtype != tf.float32:
        img_data = tf.image.convert_image_dtype(img_data, tf.float32)
    croped = tf.image.resize_image_with_crop_or_pad(img_data, 800, 500)
    padded = tf.image.resize_image_with_crop_or_pad(img_data, 1500, 1000)
    with tf.Session() as sess:
        basis.drawing(sess.run(croped))
        basis.drawing(sess.run(padded))
    basis_encode(croped, get_encode_path(filepath, 1))
    basis_encode(padded, get_encode_path(filepath, 2))


#还支持通过比例调整图片大小
def method_three(filepath):
    img_data = basis_decode(filepath)
    if img_data.dtype != tf.float32:
        img_data = tf.image.convert_image_dtype(img_data, tf.float32)

    central_cropped = tf.image.central_crop(img_data, 0.5)
    with tf.Session() as sess:
        basis.drawing(sess.run(central_cropped))
    basis_encode(central_cropped, get_encode_path(filepath, 1))


if __name__ == "__main__":
    filepath = get_andclean_image()
    Log_Util.getlogger("原始图片路径为:").info(filepath)
    # method_one(filepath)
    # method_two(filepath)
    method_three(filepath)
    #还有其他的填充或者裁剪给定区域的图像,比如:tf.image.crop_to_bounding_box和tf.image.pad_to_bounding_box,这两个函数要求给出的尺寸满足一定的要求
def train(mnist):
    x = tf.placeholder(dtype=tf.float32,
                       shape=[
                           BATCH_SIZE, mnist_inference.IMAGE_SIZE,
                           mnist_inference.IMAGE_SIZE,
                           mnist_inference.NUM_CHANNELS
                       ],
                       name="x-input")
    y_ = tf.placeholder(dtype=tf.float32,
                        shape=[None, mnist_inference.NUM_LABELS],
                        name="y-input")

    #定义正则化
    regularizer = tf.contrib.layers.l2_regularizer(REGULARIZER_RATE)
    #获取前向传播结果
    y = mnist_inference.inference(x, False, regularizer)

    #定义滑动平均模型、损失函数、指数衰减法、优化器
    global_step = tf.Variable(0, trainable=False)
    variable_average = tf.train.ExponentialMovingAverage(
        MOVING_AVERAGE_DECAY, global_step)
    average_op = variable_average.apply(tf.trainable_variables())

    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
        logits=y, labels=tf.argmax(y_, 1))
    cross_entropy_mean = tf.reduce_mean(cross_entropy)
    loss = cross_entropy_mean + tf.add_n(tf.get_collection("losses"))

    learning_rate = tf.train.exponential_decay(
        LEARNING_RATE_BASE, global_step, mnist.train.num_examples / BATCH_SIZE,
        LEARNING_RATE_DECAY)

    train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(
        loss, global_step=global_step)

    #持久化模型
    saver = tf.train.Saver()
    with tf.control_dependencies([train_step, average_op]):
        train_op = tf.no_op("train")

    with tf.Session() as sess:
        tf.global_variables_initializer().run()

        #训练过程
        for i in range(TRAINING_STEPS):
            xs, ys = mnist.train.next_batch(BATCH_SIZE)
            input_tensor = np.reshape(
                xs, (BATCH_SIZE, mnist_inference.IMAGE_SIZE,
                     mnist_inference.IMAGE_SIZE, mnist_inference.NUM_CHANNELS))
            print(i)
            _, loss_value, step = sess.run([train_op, loss, global_step],
                                           feed_dict={
                                               x: input_tensor,
                                               y_: ys
                                           })
            if i % 1000 == 0:
                # print("After %d training step(s),loss on  training " "batch is %g ." % (step, loss_value))
                Log_Util.getlogger("loss").info(loss_value)
                Log_Util.getlogger("step").info(step)
                saver.save(sess,
                           os.path.join(MODEL_SAVE_PATH, MODEL_NAME),
                           global_step=global_step)
def getLogger(name):
    return Log_Util.getlogger(name)
    with tf.Session() as sess:
        tf.global_variables_initializer().run()
        # result_conv = sess.run(conv2[0])
        # for i in range(27):
        #     drawing(result_conv[i])
        # Log_Util.getlogger("weigth shape").info(weigth_conv1.shape)
        # Log_Util.getlogger("weigth one").info(len(sess.run(weigth_conv1)))
        # Log_Util.getlogger("weigth two").info(len(sess.run(weigth_conv1[0])))
        # Log_Util.getlogger("weigth three").info(len(sess.run(weigth_conv1[0][0])))
        # Log_Util.getlogger("weigth five").info(len(sess.run(weigth_conv1[0][0][0])))
        #
        # Log_Util.getlogger("conv2 shape").info(conv2.shape)
        # Log_Util.getlogger("conv2 one").info(len(sess.run(conv2)))
        # Log_Util.getlogger("conv2 two").info(len(sess.run(conv2[0])))
        # Log_Util.getlogger("conv2 three").info(len(sess.run(conv2[0][0])))
        # Log_Util.getlogger("conv2 five").info(len(sess.run(conv2[0][0][0])))
        #
        # Log_Util.getlogger("pool shape").info(pool.shape)
        # Log_Util.getlogger("pool one").info(len(sess.run(pool)))
        # Log_Util.getlogger("pool two").info(len(sess.run(pool[0])))
        # Log_Util.getlogger("pool three").info(len(sess.run(pool[0][0])))
        # Log_Util.getlogger("pool five").info(len(sess.run(pool[0][0][0])))
        Log_Util.getlogger("pool shape2").info(pool_shape)
        Log_Util.getlogger("pool nodes").info(nodes)
        Log_Util.getlogger("pool reshape").info(reshape)
        # logger.info(len(sess.run(conv2[0])))
        # logger.info(sess.run(pool))
        # logger.info(sess.run(pool[0][0]))
        # logger.info(len(sess.run(pool[0])))

    pass
示例#14
0
import tensorflow as tf
from com.utils import Log_Util
from com.tensorflow.exercise.CNN.cnnMnist import mnist_basis as basis

#图像的编码和解码
if __name__ == "__main__":
    #读取图像的原始数据
    image_raw_data = tf.gfile.FastGFile("E:\\Alls\\code\\psb.jpg", 'rb').read()
    with tf.Session() as sess:
        #对图像进行jpeg的格式解码从而得到图像对应的三维矩阵。Tensorflow还提供了tf.image.decode_png格式的图像进行解码。解码之后的结果为一个张量
        #在使用它的取值之前需要明确调用运行的过程
        img_data = tf.image.decode_jpeg(image_raw_data)
        Log_Util.getlogger("image decode data").info(sess.run(img_data))
        Log_Util.getlogger("image decode shape").info(sess.run(img_data).shape)
        basis.drawing(sess.run(img_data))

        #将表示一张图像的三维矩阵重新按照jpeg格式编码并存入文件中。编码时img_data的类型必须是uint8
        encode_image = tf.image.encode_jpeg(img_data)
        with tf.gfile.FastGFile("E:\\Alls\\code\\psb1.jpg", 'wb') as f:
            Log_Util.getlogger("image encode shape").info(encode_image)
            f.write(sess.run(encode_image))