質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1010閲覧

mnist オートエンコーダについて

tkrd

総合スコア5

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/07/24 14:48

編集2021/07/24 17:41

閲覧ありがとうございます。kerasでmnistのオートエンコードの多層化を試していたところ、不明なエラーが出てしまったため、質問いたしました。回答いただけると幸いです。

Traceback

1in <module>() 2 27 decoder_layer = autoencoder.layers[-1] 3 28 # encodeされた画像データを再構成する部分 4---> 29 decoder = Model(encoded_input, decoder_layer(encoded_input)) 5 30 6 31 # AdaDeltaで最適化, loss関数はbinary_crossentropy 7 8/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/base_layer.py in __call__(self, *args, **kwargs) 9 968 if _in_functional_construction_mode(self, inputs, args, kwargs, input_list): 10 969 return self._functional_construction_call(inputs, args, kwargs, 11--> 970 input_list) 12 971 13 972 # Maintains info about the `Layer.call` stack. 14 15/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/base_layer.py in _functional_construction_call(self, inputs, args, kwargs, input_list) 16 1106 # Check input assumptions set after layer building, e.g. input shape. 17 1107 outputs = self._keras_tensor_symbolic_call( 18-> 1108 inputs, input_masks, args, kwargs) 19 1109 20 1110 if outputs is None: 21 22/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/base_layer.py in _keras_tensor_symbolic_call(self, inputs, input_masks, args, kwargs) 23 838 return nest.map_structure(keras_tensor.KerasTensor, output_signature) 24 839 else: 25--> 840 return self._infer_output_signature(inputs, args, kwargs, input_masks) 26 841 27 842 def _infer_output_signature(self, inputs, args, kwargs, input_masks): 28 29/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/base_layer.py in _infer_output_signature(self, inputs, args, kwargs, input_masks) 30 878 self._maybe_build(inputs) 31 879 inputs = self._maybe_cast_inputs(inputs) 32--> 880 outputs = call_fn(inputs, *args, **kwargs) 33 881 34 882 self._handle_activity_regularization(inputs, outputs) 35 36/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/layers/core.py in call(self, inputs) 37 1240 self.kernel, ids, weights, combiner='sum') 38 1241 else: 39-> 1242 outputs = gen_math_ops.MatMul(a=inputs, b=self.kernel) 40 1243 # Broadcast kernel to inputs. 41 1244 else: 42 43/usr/local/lib/python3.7/dist-packages/tensorflow/python/util/tf_export.py in wrapper(*args, **kwargs) 44 402 'Please pass these args as kwargs instead.' 45 403 .format(f=f.__name__, kwargs=f_argspec.args)) 46--> 404 return f(**kwargs) 47 405 48 406 return tf_decorator.make_decorator(f, wrapper, decorator_argspec=f_argspec) 49 50/usr/local/lib/python3.7/dist-packages/tensorflow/python/ops/gen_math_ops.py in mat_mul(a, b, transpose_a, transpose_b, name) 51 5716 _, _, _op, _outputs = _op_def_library._apply_op_helper( 52 5717 "MatMul", a=a, b=b, transpose_a=transpose_a, transpose_b=transpose_b, 53-> 5718 name=name) 54 5719 _result = _outputs[:] 55 5720 if _execute.must_record_gradient(): 56 57/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/op_def_library.py in _apply_op_helper(op_type_name, name, **keywords) 58 748 op = g._create_op_internal(op_type_name, inputs, dtypes=None, 59 749 name=scope, input_types=input_types, 60--> 750 attrs=attr_protos, op_def=op_def) 61 751 62 752 # `outputs` is returned as a separate return value so that the output 63 64/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/func_graph.py in _create_op_internal(self, op_type, inputs, dtypes, input_types, name, attrs, op_def, compute_device) 65 599 return super(FuncGraph, self)._create_op_internal( # pylint: disable=protected-access 66 600 op_type, captured_inputs, dtypes, input_types, name, attrs, op_def, 67--> 601 compute_device) 68 602 69 603 def capture(self, tensor, name=None, shape=None): 70 71/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/ops.py in _create_op_internal(self, op_type, inputs, dtypes, input_types, name, attrs, op_def, compute_device) 72 3563 input_types=input_types, 73 3564 original_op=self._default_original_op, 74-> 3565 op_def=op_def) 75 3566 self._create_op_helper(ret, compute_device=compute_device) 76 3567 return ret 77 78/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/ops.py in __init__(self, node_def, g, inputs, output_types, control_inputs, input_types, original_op, op_def) 79 2040 op_def = self._graph._get_op_def(node_def.op) 80 2041 self._c_op = _create_c_op(self._graph, node_def, inputs, 81-> 2042 control_input_ops, op_def) 82 2043 name = compat.as_str(node_def.name) 83 2044 84 85/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/ops.py in _create_c_op(graph, node_def, inputs, control_inputs, op_def) 86 1881 except errors.InvalidArgumentError as e: 87 1882 # Convert to ValueError for backwards compatibility. 88-> 1883 raise ValueError(str(e)) 89 1884 90 1885 return c_op

Error

1ValueError: Dimensions must be equal, but are 32 and 128 for '{{node dense_5/MatMul}} = MatMul[T=DT_FLOAT, transpose_a=false, transpose_b=false](Placeholder, dense_5/MatMul/ReadVariableOp)' with input shapes: [?,32], [128,784].

python

1import tensorflow as tf 2from tensorflow.keras.layers import Input, Dense 3from tensorflow.keras.models import Model 4from tensorflow.keras.datasets import mnist 5import numpy as np 6from sklearn.model_selection import train_test_split 7import matplotlib.pyplot as plt 8 9# encoderの次元 10encoding_dim = 32 11 12# 入力用の変数 13input_img = Input(shape=(784, )) 14encoded = Dense(128, activation='relu')(input_img) 15encoded = Dense(64, activation='relu')(encoded) 16encoded = Dense(32, activation='relu')(encoded) 17 18decoded = Dense(64, activation='relu')(encoded) 19decoded = Dense(128, activation='relu')(decoded) 20decoded = Dense(784, activation='sigmoid')(decoded) 21# 入力画像を再構成するModelとして定義 22autoencoder = Model(input_img, decoded) 23 24# 入力する画像をencodeする部分 25encoder = Model(input_img, encoded) 26encoded_input = Input(shape=(encoding_dim, )) 27decoder_layer = autoencoder.layers[-1] 28# encodeされた画像データを再構成する部分 29decoder = Model(encoded_input, decoder_layer(encoded_input)) 30 31# AdaDeltaで最適化, loss関数はbinary_crossentropy 32autoencoder.compile(optimizer='adam', loss='binary_crossentropy') 33 34# MNISTデータを前処理する 35(x_train, _), (x_test, _) = mnist.load_data() 36# print(type(mnist.load_data())) 37# print(mnist.load_data()) 38x_train, x_valid = train_test_split(x_train, test_size=0.175) 39x_train = x_train.astype('float32')/255. 40x_valid = x_valid.astype('float32')/255. 41x_test = x_test.astype('float32')/255. 42x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:]))) 43x_valid = x_valid.reshape((len(x_valid), np.prod(x_valid.shape[1:]))) 44x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:]))) 45 46# autoencoderの実行 47autoencoder.fit(x_train, x_train, 48 epochs=50, 49 batch_size=256, 50 shuffle=True, 51 validation_data=(x_valid, x_valid)) 52 53# 画像化して確認 54encoded_img = encoder.predict(x_test) 55decoded_img = decoder.predict(encoded_img) 56 57n = 10 58plt.figure(figsize=(20, 4)) 59for i in range(n): 60 ax = plt.subplot(2, n, i+1) 61 plt.imshow(x_test[i].reshape(28, 28)) 62 plt.gray() 63 ax.get_xaxis().set_visible(False) 64 ax.get_yaxis().set_visible(False) 65 66 ax = plt.subplot(2, n, i+1+n) 67 plt.imshow(decoded_img[i].reshape(28, 28)) 68 plt.gray() 69 ax.get_xaxis().set_visible(False) 70 ax.get_yaxis().set_visible(False) 71plt.show()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2021/07/24 15:03

Tracebackを省略しないようにしましょう
tkrd

2021/07/24 17:42

ありがとうございます。追加しました。
guest

回答1

0

ベストアンサー

https://stackoverflow.com/questions/44472693/

これがそっくりな質問かと思います。


python

1encoded_input = Input(shape=(encoding_dim, )) 2decoder_layer = autoencoder.layers[-1] 3# encodeされた画像データを再構成する部分 4decoder = Model(encoded_input, decoder_layer(encoded_input))

としてますが、autoencoder.layers[-1](つまりautoencoderの最後の層)は入力が128次元なのに、encoded_inputが32次元ですから、そこが一致していないというエラーになってますね。

入力が32次元な層から積み上げる必要がありますから、

python

1encoded_input = Input(shape=(encoding_dim, )) 2decoder_layer = autoencoder.layers[-3](encoded_input) 3decoder_layer = autoencoder.layers[-2](decoder_layer) 4decoder_layer = autoencoder.layers[-1](decoder_layer) 5decoder = Model(encoded_input, decoder_layer)

とするのかなと思いました。(実行してはいません)

投稿2021/07/26 11:32

quickquip

総合スコア11072

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問