回归图像以预测标量
Regressing on an image to predict a scalar
给定 256x256 rgb 输入图像,我正在尝试回归以预测图像 X 轴上的一个点 (0-48000)
最初,我尝试了 [mobile_net -> GlobalAveragePooling2D -> 几个 Dense 层]。我没有意识到 Pooling 正在丢弃空间信息。
昨晚,我在一个更简单的网络上训练,损失一整晚都在减少,但它预测的是负值。
如何修改此架构以预测 0-48000 标量?
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(64, kernel_size=3, activation='relu', input_shape=(256,256,3)),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Conv2D(32, kernel_size=3, activation='relu'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(1, kernel_initializer='normal'),
])
model.compile(loss='mse', optimizer='adam', metrics=['mse', 'mae', 'mape']) #
编辑:
从我的网络中推断,对于同一个文件,我得到了截然不同的输出,每个 运行。这怎么可能?
推断输出,运行在同一个文件上多次:
-312864.9444580078
762.7029418945312
193352.7603149414
这里是推论fn:
def infer(checkpoint_path):
png_file = ['3023_28338_26_m.png', '3023_28338_26_m.png'][1]
test_file = data_root + png_file
onset = png_file.strip('_m.png.').split('_')[1]
img = load_and_preprocess_from_path_label(test_file, 0)
tst = np.expand_dims(img[0], axis=0)
model = load_model_and_checkpoint(checkpoint_path)
val = model.predict(tst)[0][0] * 48000
这是训练的最后阶段。
2019-05-26 11:11:56.698907: I tensorflow/core/kernels/data/shuffle_dataset_op.cc:150] Shuffle buffer filled.
94/95 [============================>.] - ETA: 0s - loss: 0.0063 - mse: 0.0063 - mae: 0.0627 - mape: 93.2817
Epoch 00100: saving model to /media/caseybasichis/sp_data/sp_data/datasets/one_sec_onset_01/model7.ckpt
95/95 [==============================] - 47s 500ms/step - loss: 0.0063 - mse: 0.0063 - mae: 0.0626 - mape: 93.2076
这是最新的网络。
mobile_net = tf.keras.applications.ResNet50(input_shape=(256, 256, 3), include_top=False, weights='imagenet')
mobile_net.trainable=False
model = tf.keras.Sequential([
mobile_net,
tf.keras.layers.Dropout(0.25),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, kernel_initializer='normal', activation='relu'),
tf.keras.layers.BatchNormalization(axis=chanDim),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(1, kernel_initializer='normal', activation='linear'), # activation='sigmoid'
])
model.compile(loss='mse', optimizer='adam', metrics=['mse', 'mae', 'mape']) # mean_squared_logarithmic_error
您可以简单地在最后一层使用 Sigmoid 激活并将输出乘以比例(在 Lambda 层中或者最好只是在网络外部缩放输出)
model.add(Activation('sigmoid'))
model.add(Lambda(lambda x: 48000*x))
或
model.add(Activation('sigmoid'))
...
model.fit(x_train, y_train/48000.0)
给定 256x256 rgb 输入图像,我正在尝试回归以预测图像 X 轴上的一个点 (0-48000)
最初,我尝试了 [mobile_net -> GlobalAveragePooling2D -> 几个 Dense 层]。我没有意识到 Pooling 正在丢弃空间信息。
昨晚,我在一个更简单的网络上训练,损失一整晚都在减少,但它预测的是负值。
如何修改此架构以预测 0-48000 标量?
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(64, kernel_size=3, activation='relu', input_shape=(256,256,3)),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Conv2D(32, kernel_size=3, activation='relu'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(1, kernel_initializer='normal'),
])
model.compile(loss='mse', optimizer='adam', metrics=['mse', 'mae', 'mape']) #
编辑:
从我的网络中推断,对于同一个文件,我得到了截然不同的输出,每个 运行。这怎么可能?
推断输出,运行在同一个文件上多次:
-312864.9444580078
762.7029418945312
193352.7603149414
这里是推论fn:
def infer(checkpoint_path):
png_file = ['3023_28338_26_m.png', '3023_28338_26_m.png'][1]
test_file = data_root + png_file
onset = png_file.strip('_m.png.').split('_')[1]
img = load_and_preprocess_from_path_label(test_file, 0)
tst = np.expand_dims(img[0], axis=0)
model = load_model_and_checkpoint(checkpoint_path)
val = model.predict(tst)[0][0] * 48000
这是训练的最后阶段。
2019-05-26 11:11:56.698907: I tensorflow/core/kernels/data/shuffle_dataset_op.cc:150] Shuffle buffer filled.
94/95 [============================>.] - ETA: 0s - loss: 0.0063 - mse: 0.0063 - mae: 0.0627 - mape: 93.2817
Epoch 00100: saving model to /media/caseybasichis/sp_data/sp_data/datasets/one_sec_onset_01/model7.ckpt
95/95 [==============================] - 47s 500ms/step - loss: 0.0063 - mse: 0.0063 - mae: 0.0626 - mape: 93.2076
这是最新的网络。
mobile_net = tf.keras.applications.ResNet50(input_shape=(256, 256, 3), include_top=False, weights='imagenet')
mobile_net.trainable=False
model = tf.keras.Sequential([
mobile_net,
tf.keras.layers.Dropout(0.25),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, kernel_initializer='normal', activation='relu'),
tf.keras.layers.BatchNormalization(axis=chanDim),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(1, kernel_initializer='normal', activation='linear'), # activation='sigmoid'
])
model.compile(loss='mse', optimizer='adam', metrics=['mse', 'mae', 'mape']) # mean_squared_logarithmic_error
您可以简单地在最后一层使用 Sigmoid 激活并将输出乘以比例(在 Lambda 层中或者最好只是在网络外部缩放输出)
model.add(Activation('sigmoid'))
model.add(Lambda(lambda x: 48000*x))
或
model.add(Activation('sigmoid'))
...
model.fit(x_train, y_train/48000.0)