Keras Tensorflow 自定义层只调用一次
Keras Tensorflow custom layer only called once
经过两天的紧张搜索,我没有在keras docs/stack中找到答案。
我正在尝试创建一个自定义层以某种概率对每个批次执行扩充(现在 1 用于演示)。
数据是单通道图像。
我需要一种方法来知道训练时是否真的发生了增强,因为增强函数中的打印仅在定义网络时发生一次,而在激活 fit
函数时发生另一次。
任何帮助将不胜感激,谢谢!
基本可运行工作示例,注意打印数量 call()
:
from tensorflow.keras.layers import Input, Dense, Conv2D, Flatten
from tensorflow.keras.models import Sequential
import random
import numpy as np
import tensorflow as tf
from tensorflow.keras import optimizers
# Custom Augmentation layer
class AugmentationLayer(tf.keras.layers.Layer):
def __init__(self, p):
super(AugmentationLayer, self).__init__()
self.p = p
def call(self, inputs, training=None):
if not training:
return inputs
print('Enter Custom layer call, training = ', training)
if random.random() < self.p:
inputs *= 2
return inputs
# Training Script
# parameters
height = 38
width = 22
numClasses = 2
ydata = np.array([[1, 0], [1, 0]]) # hot-encoded labels
# create 2 images for network training data
Xdata = []
for i in range(2):
xx = np.random.uniform(-1, 1, (height, width))
Xdata.append(xx)
# create array from list
Xdata = np.array(Xdata)
# make dims n_samples X height X width X channels = (2, 38, 22, 1)
Xdata = np.reshape(Xdata, (Xdata.shape[0], Xdata.shape[1], Xdata.shape[2], 1))
model = Sequential()
model.add(Input(shape=(height, width, 1)))
model.add(AugmentationLayer(1)) # Added custom layer
model.add(Conv2D(32, (2, 2), activation='relu'))
model.add(Flatten())
model.add(Dense(numClasses, activation='softmax'))
model.compile(
loss='categorical_crossentropy',
metrics=['accuracy'],
optimizer=optimizers.Adam(learning_rate=0.001))
model.summary()
model.fit(
Xdata,
ydata,
epochs=10,
batch_size=2,
verbose=1)
如果您使用 tf.print()
,它也会在图形执行时 运行 时打印。您可以在这里阅读更多相关信息:https://www.tensorflow.org/api_docs/python/tf/print.
对于将来的某个人,我会补充一点,在编译模型时,有一个默认值可以防止某些功能从自定义层内部 运行 (这就是为什么常规 print() 不起作用的原因), 用于性能目的。其中包括:print()、np.save() 以及可能更多。
model.compile(..., run_eagerly=False) # default
如果您想启用上述所有功能,请使用以下命令编译您的模型:
model.compile(..., run_eagerly=True)
经过两天的紧张搜索,我没有在keras docs/stack中找到答案。
我正在尝试创建一个自定义层以某种概率对每个批次执行扩充(现在 1 用于演示)。 数据是单通道图像。
我需要一种方法来知道训练时是否真的发生了增强,因为增强函数中的打印仅在定义网络时发生一次,而在激活 fit
函数时发生另一次。
任何帮助将不胜感激,谢谢!
基本可运行工作示例,注意打印数量 call()
:
from tensorflow.keras.layers import Input, Dense, Conv2D, Flatten
from tensorflow.keras.models import Sequential
import random
import numpy as np
import tensorflow as tf
from tensorflow.keras import optimizers
# Custom Augmentation layer
class AugmentationLayer(tf.keras.layers.Layer):
def __init__(self, p):
super(AugmentationLayer, self).__init__()
self.p = p
def call(self, inputs, training=None):
if not training:
return inputs
print('Enter Custom layer call, training = ', training)
if random.random() < self.p:
inputs *= 2
return inputs
# Training Script
# parameters
height = 38
width = 22
numClasses = 2
ydata = np.array([[1, 0], [1, 0]]) # hot-encoded labels
# create 2 images for network training data
Xdata = []
for i in range(2):
xx = np.random.uniform(-1, 1, (height, width))
Xdata.append(xx)
# create array from list
Xdata = np.array(Xdata)
# make dims n_samples X height X width X channels = (2, 38, 22, 1)
Xdata = np.reshape(Xdata, (Xdata.shape[0], Xdata.shape[1], Xdata.shape[2], 1))
model = Sequential()
model.add(Input(shape=(height, width, 1)))
model.add(AugmentationLayer(1)) # Added custom layer
model.add(Conv2D(32, (2, 2), activation='relu'))
model.add(Flatten())
model.add(Dense(numClasses, activation='softmax'))
model.compile(
loss='categorical_crossentropy',
metrics=['accuracy'],
optimizer=optimizers.Adam(learning_rate=0.001))
model.summary()
model.fit(
Xdata,
ydata,
epochs=10,
batch_size=2,
verbose=1)
如果您使用 tf.print()
,它也会在图形执行时 运行 时打印。您可以在这里阅读更多相关信息:https://www.tensorflow.org/api_docs/python/tf/print.
对于将来的某个人,我会补充一点,在编译模型时,有一个默认值可以防止某些功能从自定义层内部 运行 (这就是为什么常规 print() 不起作用的原因), 用于性能目的。其中包括:print()、np.save() 以及可能更多。
model.compile(..., run_eagerly=False) # default
如果您想启用上述所有功能,请使用以下命令编译您的模型:
model.compile(..., run_eagerly=True)