小型,简单化的数据集
model.fit(trainX, trainY, batch_size=32, epochs=50)
训练数据(trainX
)和训练标签(trainY
)
模型训练 50
个epoch,同时batch size为 32
数据通常会很大,即使在使用GPU的情况下,我们如果一次性将所有数据(如图像)读入CPU的内存中,内存很有可能会奔溃
.fit_generator
函数TensorBoard是一个内置于TensorFlow中的基于浏览器的可视化工具。只有当Keras使用TensorFlow后端时,这一方法才能用于Keras模型。
TensorBoard的主要用途是在训练过程中帮助你可视化的监控模型内部发生的一切,这样就可以更清楚地了解模型做了什么、没做什么。
import keras
from keras import layers
from keras.datasets import imdb
from keras.preprocessing import sequence
# 数据处理
max_features = 2000 # 包含最常见的2000个单词
maxlen = 500 # 将句子截断到500个词
(x_train,y_train),(x_test,y_test) = imdb.load_data(num_words=max_features)
x_train = sequence.pad_sequences(x_train,maxlen=maxlen)
x_test = sequence.pad_sequences(x_test,maxlen=maxlen)
# 构建模型
model = keras.models.Sequential()
model.add(layers.Embedding(max_features,128,
input_length=maxlen,
name='embed'))
model.add(layers.Conv1D(32,7,activation='relu'))
model.add(layers.MaxPooling1D(5))
model.add(layers.Conv1D(32,7,activation='relu'))
model.add(layers.GlobalMaxPooling1D())
model.add(layers.Dense(1))
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])
# os.mkdir('my_log_dir')
callbacks = [
keras.callbacks.TensorBoard(
log_dir='my_log_dir',
histogram_freq=1,
)
]
history = model.fit(x_train,y_train,
epochs=20,
batch_size=128,
validation_split=0.2,
callbacks=callbacks)
tensorboard --logdir=log
此时tensorboard服务会读取log中的内容并进行可视化
简单、无状态的自定义操作,可以通过 layers.core.Lambda
层来实现
实现三个方法即可:
build(input_shape)
: 这是定义权重的地方。必须设 self.built = True
,可以通过调用 super([Layer], self).build()
完成。call(x)
: 这里是编写层的功能逻辑的地方。只需要关注传入 call
的第一个参数:输入张量,除非你希望你的层支持masking。compute_output_shape(input_shape)
: 如果你的层更改了输入张量的形状,你应该在这里定义形状变化的逻辑,这让Keras能够自动推断各层的形状。from keras import backend as K
from keras.engine.topology import Layer
class MyLayer(Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyLayer, self).__init__(**kwargs)
def build(self, input_shape):
# 为该层创建一个可训练的权重
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
super(MyLayer, self).build(input_shape) #一定要在最后调用它
def call(self, x):
return K.dot(x, self.kernel)
def compute_output_shape(self, input_shape):
return (input_shape[0], self.output_dim)
还可以定义具有多个输入张量和多个输出张量的 Keras 层。 为此,假设方法 build(input_shape)
,call(x)
和 compute_output_shape(input_shape)
的输入输出都是列表。 例子与上面那个相似:
from keras import backend as K
from keras.engine.topology import Layer
class MyLayer(Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyLayer, self).__init__(**kwargs)
def build(self, input_shape):
assert isinstance(input_shape, list)
# 为该层创建一个可训练的权重
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[0][1], self.output_dim),
initializer='uniform',
trainable=True)
super(MyLayer, self).build(input_shape) # 一定要在最后调用它
def call(self, x):
assert isinstance(x, list)
a, b = x
return [K.dot(a, self.kernel) + b, K.mean(b, axis=-1)]
def compute_output_shape(self, input_shape):
assert isinstance(input_shape, list)
shape_a, shape_b = input_shape
return [(shape_a[0], self.output_dim), shape_b[:-1]]
谷歌推荐的一种二进制文件格式,理论上它可以保存任何格式的信息。
uint64 length
uint32 masked_crc32_of_length
byte data[length]
uint32 masked_crc32_of_data
长度、长度校验码、数据、数据校验码
TFRecord 的核心内容在于内部有一系列的 Example ,Example 是 protocolbuf 协议下的消息体。
一个 Example 消息体包含了一系列的 feature 属性。
每一个 feature 是一个 map,也就是 key-value 的键值对。key 取值是 String 类型。
而 value 是 Feature 类型的消息体,它的取值有3种:
BytesList
FloatList
Int64List
都是列表的形式。
message Example {
Features features = 1;
};
message Features {
// Map from feature name to feature.
map<string, Feature> feature = 1;
};
message Feature {
// Each feature can be exactly one kind.
oneof kind {
BytesList bytes_list = 1;
FloatList float_list = 2;
Int64List int64_list = 3;
}
};
message BytesList {
repeated bytes value = 1;
}
message FloatList {
repeated float value = 1 [packed = true];
}
message Int64List {
repeated int64 value = 1 [packed = true];
}