import tensorflow as tf
import numpy as np
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_valid, y_valid) = mnist.load_data()
print(x_train.shape, y_train.shape)
print(x_valid.shape, y_valid.shape)
(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)
y_train_odd = []
for y in y_train:
if y%2 == 0:
y_train_odd.append(0)
else:
y_train_odd.append(1)
y_train_odd = np.array(y_train_odd)
y_train_odd.shape
(60000,)
print(y_train[:10])
print(y_train_odd[:10])
[5 0 4 1 9 2 1 3 1 4]
[1 0 0 1 1 0 1 1 1 0]
y_valid_odd = []
for y in y_valid:
if y%2 == 0:
y_valid_odd.append(0)
else:
y_valid_odd.append(1)
y_valid_odd = np.array(y_valid_odd)
y_valid_odd.shape
(10000,)
x_train = x_train/255.0
x_valid = x_valid/255.0
x_train_in = tf.expand_dims(x_train, -1)
x_valid_in = tf.expand_dims(x_valid, -1)
print(x_train_in.shape, x_valid_in.shape)
(60000, 28, 28, 1) (10000, 28, 28, 1)
#Functional API를 사용하여 모델 생성
inputs = tf.keras.layers.Input(shape=(28,28,1))
conv = tf.keras.layers.Conv2D(32,(3,3), activation='relu')(inputs)
pool = tf.keras.layers.MaxPool2D((2,2))(conv)
flat = tf.keras.layers.Flatten()(pool)
flat_inputs = tf.keras.layers.Flatten()(inputs)
concat = tf.keras.layers.Concatenate()([flat, flat_inputs])
outputs = tf.keras.layers.Dense(10, activation='softmax')(concat)
model = tf.keras.models.Model(inputs = inputs, outputs = outputs)
model.summary()
from tensorflow.python.keras.utils.vis_utils import plot_model
plot_model(model, show_shapes = True, show_layer_names = True, to_file = 'functional_cnn.png')
model.compile(optimizer='adam', loss = 'sparse_categorical_crossentropy', metrics=['accuracy'])
history = model.fit(x_train_in, y_train, validation_data=(x_valid_in, y_valid), epochs = 10)
val_loss, val_acc = model.evaluate(x_valid_in, y_valid)
print(val_loss, val_acc)
inputs = tf.keras.layers.Input(shape=(28,28,1), name='inputs')
conv = tf.keras.layers.Conv2D(32,(3,3),activation='relu', name='conv2d_layer')(inputs)
pool = tf.keras.layers.MaxPool2D((2,2), name='maxpool_layer')(conv)
flat = tf.keras.layers.Flatten(name='flatten_layer')(pool)
flat_inputs = tf.keras.layers.Flatten()(inputs)
concat = tf.keras.layers.Concatenate()([flat, flat_inputs])
digit_outputs = tf.keras.layers.Dense(10, activation='softmax', name='digit_dense')(concat)
odd_outputs = tf.keras.layers.Dense(1, activation='sigmoid', name='odd_dense')(flat_inputs)
model = tf.keras.models.Model(inputs = inputs, outputs=[digit_outputs, odd_outputs])
model.summary()
print(model.input)
print(model.output)
KerasTensor(type_spec=TensorSpec(shape=(None, 28, 28, 1), dtype=tf.float32, name='inputs'), name='inputs', description="created by layer 'inputs'")
[<KerasTensor: shape=(None, 10) dtype=float32 (created by layer 'digit_dense')>, <KerasTensor: shape=(None, 1) dtype=float32 (created by layer 'odd_dense')>]
plot_model(model, show_shapes=True, show_layer_names=True, to_file='multi_output_cnn.png')
model.compile(optimizer='adam', loss={'digit_dense':'sparse_categorical_crossentropy', 'odd_dense':'binary_crossentropy'},
loss_weights = {'digit_dense':1, 'odd_dense':0.5},
metrics=['accuracy'])
history = model.fit({'inputs':x_train_in}, {'digit_dense':y_train, 'odd_dense':y_train_odd},
validation_data=({'inputs':x_valid_in}, {'digit_dense':y_valid, 'odd_dense':y_valid_odd}), epochs=10)
model.evaluate({'inputs':x_valid_in}, {'digit_dense':y_valid, 'odd_dense':y_valid_odd})
313/313 [==============================] - 3s 10ms/step - loss: 0.1884 - digit_dense_loss: 0.0606 - odd_dense_loss: 0.2555 - digit_dense_accuracy: 0.9844 - odd_dense_accuracy: 0.9009
[0.18837670981884003,
0.06063273176550865,
0.2554878294467926,
0.9843999743461609,
0.9009000062942505]
import matplotlib.pylab as plt
def plot_image(data, idx):
plt.figure(figsize=(5,5))
plt.imshow(data[idx])
plt.axis("off")
plt.show()
plot_image(x_valid,0)
digit_preds, odd_preds = model.predict(x_valid_in)
print(digit_preds[0])
print(odd_preds[0])
[3.4531422e-13 1.9672591e-10 4.3072221e-09 7.7706841e-07 1.4168223e-11
9.1622952e-11 2.6664490e-20 9.9999917e-01 2.4213274e-09 1.3189391e-08]
[0.99957955]
digit_labels = np.argmax(digit_preds, axis=-1)
digit_labels[0:10]
array([7, 2, 1, 0, 4, 1, 4, 9, 5, 9], dtype=int64)
odd_labels = (odd_preds > 0.5).astype(np.int).reshape(1, -1)[0]
odd_labels[0:10]
array([1, 0, 1, 0, 0, 1, 0, 1, 0, 1])
'인공지능 공부 > 딥러닝 논문읽기' 카테고리의 다른 글
(딥러닝) Deep Learning age and gender detection 나이를 추측해보자 (0) | 2021.10.29 |
---|---|
(코로나 바이러스 예측)Analysis of COVID-19 data using Python (0) | 2021.09.23 |
파이썬 딥러닝 텐서플로 기초부터 (0) | 2021.09.06 |
(딥러닝) 수치미분 코드 구현하기 (0) | 2021.07.27 |
(딥러닝) Python EDA-Audio Classification Project (0) | 2021.07.25 |