Искусство Программирования осуществляет вопрос: Глава 1, Вопрос 8

После 24 часов непрерывных исследований, я наконец приклеил все кусочки к головоломке. API потрясающий, но документация отсутствует.

Для преобразования CSV в tfrecord:

import tensorflow as tf
import numpy as np
import pandas as pd # For reading .csv
from datetime import datetime # For knowing how long does each read/write take

def _bytes_feature(value):
    # Returns a bytes_list from a string / byte.
    if isinstance(value, type(tf.constant(0))):
        value = value.numpy()  # BytesList won't unpack a string from an EagerTensor.
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))


def _float_feature(value):
    # Returns a float_list from a float / double.
    # If a list of values was passed, a float list feature with the entire list will be returned
    if isinstance(value, list):
        return tf.train.Feature(float_list=tf.train.FloatList(value=value))

    return tf.train.Feature(float_list=tf.train.FloatList(value=[value]))


def _int64_feature(value):
    # Returns an int64_list from a bool / enum / int / uint.
    return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))


def serialize_example(pandabase):
    # Serializes inputs from a pandas dataset (read in chunks)

    # Creates a mapping of the features from the header row of the file
    base_chunk = pandabase.get_chunk(0)
    num_features = len(base_chunk.columns)
    features_map = {}
    for i in range(num_features):
        features_map.update({'feature' + str(i): _float_feature(0)})

    # Set writing options with compression
    options = tf.io.TFRecordOptions(compression_type=tf.io.TFRecordCompressionType.ZLIB,
                                    compression_level=9)
    with tf.io.TFRecordWriter('test2.tfrecord.zip', options=options) as writer:
    # Convert the chunk to a numpy array, and write each row to the file in a double for loop
        for chunk in pandabase:
            nump = chunk.to_numpy()
            for row in nump:
                ii = 0
                for elem in row:
                    features_map['feature' + str(ii)] = _float_feature(float(elem))
                    ii += 1
                myProto = tf.train.Example(features=tf.train.Features(feature=features_map))
                writer.write(myProto.SerializeToString())


start = datetime.now()
bk1 = pd.read_csv("Book2.csv", chunksize=2048, engine='c', iterator=True)    
serialize_example(bk1)
end = datetime.now()
print("- consumed time: %ds" % (end-start).seconds)

Для машинного обучения из tfrecords и использования графического процессора: следуйте этому руководству по правильной настройке, затем используйте этот код:

# Recreate the feature mappings (Must be similar to the one used to write the tfrecords)
_NUMCOL = 5
feature_description = {}
for i in range(_NUMCOL):
    feature_description.update({'feature' + str(i): tf.io.FixedLenFeature([], tf.float32)})

# Parse the tfrecords into the form (x, y) or (x, y, weights) to be used with keras
def _parse_function(example_proto):
    dic = tf.io.parse_single_example(example_proto, feature_description)
    y = dic['feature0']
    x = tf.stack([dic['feature1'],
                   dic['feature2'],
                   dic['feature3'],
                   dic['feature4']], axis=0)
    return x, y

# Let tensorflow autotune the training speed
AUTOTUNE = tf.data.experimental.AUTOTUNE
# creat a tfdataset from the recorded file, set parallel reads to number of cores for best running speed
myData = tf.data.TFRecordDataset('test.tfrecord.zip', compression_type='ZLIB',
                                 num_parallel_reads=2)
# Map the data to a form useable by keras (using _parse_function), cache the data, shuffle, and read the data in batches  
myData = myData.map(_parse_function, num_parallel_calls=AUTOTUNE)
myData = myData.cache()
myData = myData.shuffle(buffer_size=8192)
batches = 16385
myData = myData.batch(batches).prefetch(buffer_size=AUTOTUNE)

model = keras.Sequential([
    keras.layers.Dense(100, activation='softmax', kernel_regularizer=keras.regularizers.l2(lambd)),
    keras.layers.Dense(10, activation='softmax', kernel_regularizer=keras.regularizers.l2(lambd)),
    keras.layers.Dense(1, activation='linear', kernel_regularizer=keras.regularizers.l2(lambd))])

model.compile(optimizer='adam',
              loss='mean_squared_error')
model.save('keras.HD5F')

9
задан Hortitude 24 July 2013 в 13:43
поделиться

3 ответа

Вот реализация того ответа осуществления. Возможно, это помогает.

Между прочим, таблица, кажется, описывает алгоритм Маркова.

Насколько я понимаю до сих пор, Вы запускаете с первого набора команд, j = 0. Замените любой occurencies Tj с sj и переходом к следующей командной строке в зависимости от того, если Вы заменили что-нибудь (в этом случае переход к bj, если ничто не было заменено, переход к aj).

Править: Новые ответы:

A = {a, b, c}, кажется, набор символов, с которым можно действовать. c входит во время алгоритма (добавленный налево и позже замененный a's снова).

Тета и phi могли быть некоторым греком, изображают Вас, обычно используют для чего-то как "исходный" и "замена", хотя я не знал бы, что они.

bj и aj являются строками таблицы, которые будут затем выполняться. Это соответствует человекочитаемым описаниям в последнем столбце.

Единственная вещь, на которую я не могу ответить, состоит в том, почему Knuth использует эту нотацию без любых объяснений. Я просмотрел первые главы и решения в книге снова, и он не упоминает это нигде.

EDIT2: Пример для gdc (2,2) = 2

    Input string: aabb
    Line 0: Remove one a and one b, or go to 2.
    => ab => go to 1
    Line 1: Add c at extreme left, go back to 0.
    => cab => go to 0
    Line 0: Remove one a and one b, or go to 2.
    => c => go to 1
    Line 1: Add c at extreme left, go back to 0.
    => cc => go to 0
    Line 0: Remove one a and one b, or go to 2.
    No ab found, so go to 2
    Line 2: Change all a's to b's
    No a's found, so go to 3
    Line 3: Change all c's to a's
    => aa
    Line 4: if b's remain, repeat
    No b's found, so go to 5 (end).

    => Answer is "aa" => gdc(2,2) = 2

Между прочим, я думаю, что описание для выравнивания 1 должно быть, "Удаляют один "ab" или переходят в 2". Это делает вещи немного более ясными.

4
ответ дан 4 December 2019 в 23:41
поделиться

понятие, вероятно, понятие входной строки в контексте конечного автомата.

Такое понятие используется для обращения к m экземпляры последовательных a, т.е.:

a4 = aaaa
b7 = bbbbbbb
a4b7a3 = aaaabbbbbbbaaa

И что agcd (m, n) средство состоит в том, что после выполнения (решение) конечный автомат, получившая строка должна быть gcd(m,n) экземпляры a

Другими словами, количество aв результате должно быть равно результату gcd(m,n)

И я соглашаюсь с @schnaader, в котором это - вероятно, таблица, описывающая использования алгоритма Маркова.

1
ответ дан 4 December 2019 в 23:41
поделиться

Верхний индекс для GCD (m, n) происходит из-за того, как числа представлены в этой таблице.

Например: m => a^m n => b^n

GCD (m, n) => a^gcd (m, n)

Это надеется быть похожим на алгоритм Euclids, реализуется. т.е.

gcd(m,n):
  if n==0:
    return m
  return gcd(n,m%n)

Числа представлены как полномочия, чтобы смочь сделать операцию по модулю m%n.

Например, 4% 3, будет вычислен следующим образом: (a^4) модификация 4 'a 3 'b's (b^3), который уедет 1 (a^1).

1
ответ дан 4 December 2019 в 23:41
поделиться