Keras批归一化和样本权重

时间:2019-09-13 20:38:14

标签: python tensorflow keras batch-normalization

我正在尝试关于张量流website的训练和评估示例。 具体来说,这部分:

IPointerXYHandler

看来,如果我添加批处理规范化层(此行:import numpy as np import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() x_train = x_train.reshape(60000, 784).astype('float32') / 255 x_test = x_test.reshape(10000, 784).astype('float32') / 255 y_train = y_train.astype('float32') y_test = y_test.astype('float32') def get_uncompiled_model(): inputs = keras.Input(shape=(784,), name='digits') x = layers.Dense(64, activation='relu', name='dense_1')(inputs) x = layers.BatchNormalization()(x) x = layers.Dense(64, activation='relu', name='dense_2')(x) outputs = layers.Dense(10, activation='softmax', name='predictions')(x) model = keras.Model(inputs=inputs, outputs=outputs) return model def get_compiled_model(): model = get_uncompiled_model() model.compile(optimizer=keras.optimizers.RMSprop(learning_rate=1e-3), loss='sparse_categorical_crossentropy', metrics=['sparse_categorical_accuracy']) return model sample_weight = np.ones(shape=(len(y_train),)) sample_weight[y_train == 5] = 2. # Create a Dataset that includes sample weights # (3rd element in the return tuple). train_dataset = tf.data.Dataset.from_tensor_slices( (x_train, y_train, sample_weight)) # Shuffle and slice the dataset. train_dataset = train_dataset.shuffle(buffer_size=1024).batch(64) model = get_compiled_model() model.fit(train_dataset, epochs=3) ),则会出现以下错误:

x = layers.BatchNormalization()(x)

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

相同的代码对我有用。

我更改的唯一行是:

model.compile(optimizer=keras.optimizers.RMSprop(learning_rate=1e-3)model.compile(optimizer=keras.optimizers.RMSprop(lr=1e-3) (特定于版本)

然后 model.fit(train_dataset, epochs=3)model.fit(train_dataset, epochs=3, steps_per_epoch=30)
原因:使用迭代器作为模型的输入时,应指定steps_per_epoch参数

enter image description here

答案 1 :(得分:1)

如果只想使用样本权重,而不必使用tf.data.Dataset,则只需运行:

model.fit(x=x_train, y=y_train, sample_weight=sample_weight, batch_size=64, epochs=3)

它对我有用(当我将@ {ASHu2提到的learning_rate更改为lr时)。

3个周期后,它的准确率达到97%:

...
57408/60000 [===========================>..] - ETA: 0s - loss: 0.1010 - sparse_categorical_accuracy: 0.9709
58816/60000 [============================>.] - ETA: 0s - loss: 0.1011 - sparse_categorical_accuracy: 0.9708
60000/60000 [==============================] - 2s 37us/sample - loss: 0.1007 - sparse_categorical_accuracy: 0.9709

我在Windows上使用了TF 1.14.0。

答案 2 :(得分:0)

当我将Tensorflow从1.14.1版本更新到2.0.0-rc1时,问题已解决。