新しい tensorflow 2.0 で作成され、keras と tensorflow を混合した大規模なカスタム モデルがあります。保存したい (アーキテクチャとウェイト)。再現する正確なコマンド:
import tensorflow as tf
OUTPUT_CHANNELS = 3
def downsample(filters, size, apply_batchnorm=True):
initializer = tf.random_normal_initializer(0., 0.02)
result = tf.keras.Sequential()
result.add(
tf.keras.layers.Conv2D(filters, size, strides=2, padding='same',
kernel_initializer=initializer, use_bias=False))
if apply_batchnorm:
result.add(tf.keras.layers.BatchNormalization())
result.add(tf.keras.layers.LeakyReLU())
return result
def upsample(filters, size, apply_dropout=False):
initializer = tf.random_normal_initializer(0., 0.02)
result = tf.keras.Sequential()
result.add(
tf.keras.layers.Conv2DTranspose(filters, size, strides=2,
padding='same',
kernel_initializer=initializer,
use_bias=False))
result.add(tf.keras.layers.BatchNormalization())
if apply_dropout:
result.add(tf.keras.layers.Dropout(0.5))
result.add(tf.keras.layers.ReLU())
return result
def Generator():
down_stack = [
downsample(64, 4, apply_batchnorm=False), # (bs, 128, 128, 64)
downsample(128, 4), # (bs, 64, 64, 128)
downsample(256, 4), # (bs, 32, 32, 256)
downsample(512, 4), # (bs, 16, 16, 512)
downsample(512, 4), # (bs, 8, 8, 512)
downsample(512, 4), # (bs, 4, 4, 512)
downsample(512, 4), # (bs, 2, 2, 512)
downsample(512, 4), # (bs, 1, 1, 512)
]
up_stack = [
upsample(512, 4, apply_dropout=True), # (bs, 2, 2, 1024)
upsample(512, 4, apply_dropout=True), # (bs, 4, 4, 1024)
upsample(512, 4, apply_dropout=True), # (bs, 8, 8, 1024)
upsample(512, 4), # (bs, 16, 16, 1024)
upsample(256, 4), # (bs, 32, 32, 512)
upsample(128, 4), # (bs, 64, 64, 256)
upsample(64, 4), # (bs, 128, 128, 128)
]
initializer = tf.random_normal_initializer(0., 0.02)
last = tf.keras.layers.Conv2DTranspose(OUTPUT_CHANNELS, 4,
strides=2,
padding='same',
kernel_initializer=initializer,
activation='tanh') # (bs, 256, 256, 3)
concat = tf.keras.layers.Concatenate()
inputs = tf.keras.layers.Input(shape=[None,None,3])
x = inputs
# Downsampling through the model
skips = []
for down in down_stack:
x = down(x)
skips.append(x)
skips = reversed(skips[:-1])
# Upsampling and establishing the skip connections
for up, skip in zip(up_stack, skips):
x = up(x)
x = concat([x, skip])
x = last(x)
return tf.keras.Model(inputs=inputs, outputs=x)
generator = Generator()
generator.summary()
generator.save('generator.h5')
generator_loaded = tf.keras.models.load_model('generator.h5')
私はモデルを保存することに成功しました:
generator.save('generator.h5')
しかし、それをロードしようとすると:
generator_loaded = tf.keras.models.load_model('generator.h5')
終了することはありません (エラー メッセージは表示されません)。モデルが大きすぎるのではないでしょうか?model.to_json()
完全な API と同様にJSON として保存しようとしましtf.keras.models.save_model()
たが、同じ問題があり、ロードできません (または少なくとも長すぎます)。
Windows/Linux で、GPU の有無にかかわらず同じ問題が発生します。
保存と復元は、完全な Keras と単純なモデルでうまく機能します。
編集
- 重みを保存してからロードすることはうまく機能しますが、モデル構造をロードすることは不可能です。
- バグを再現するために使用するモデルを置きます。これは Pix2Pix の例から来ています ( https://www.tensorflow.org/alpha/tutorials/generative/pix2pix )
- tensorflow github に関する問題も書きました: https://github.com/tensorflow/tensorflow/issues/28281